From 2a0ba71c5dbc64f2bc04448c8683921ef443a6f9 Mon Sep 17 00:00:00 2001 From: Andrew Gazelka Date: Tue, 2 Sep 2025 11:21:12 -0700 Subject: [PATCH 1/9] first attempt at make stable --- Cargo.lock | 1820 ++++++++++++++++++---------------- Cargo.toml | 24 +- clippy.toml | 1 + crates/bvh-region/src/lib.rs | 3 - crates/hyperion/Cargo.toml | 2 +- crates/simd-utils/Cargo.toml | 4 + crates/simd-utils/src/lib.rs | 28 +- rust-toolchain.toml | 2 +- 8 files changed, 1002 insertions(+), 882 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4dc9c7fa..e5bebd95 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,9 +14,9 @@ dependencies = [ [[package]] name = "ab_glyph" -version = "0.2.29" +version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" +checksum = "e074464580a518d16a7126262fffaaa47af89d4099d4cb403f8ed938ba12ee7d" dependencies = [ "ab_glyph_rasterizer", "owned_ttf_parser", @@ -24,9 +24,9 @@ dependencies = [ [[package]] name = "ab_glyph_rasterizer" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" +checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" [[package]] name = "accesskit" @@ -65,7 +65,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f47983a1084940ba9a39c077a8c63e55c619388be5476ac04c804cfbd1e63459" dependencies = [ "accesskit 0.17.1", - "hashbrown 0.15.2", + "hashbrown 0.15.5", "immutable-chunkmap", ] @@ -77,9 +77,9 @@ checksum = "7329821f3bd1101e03a7d2e03bd339e3ac0dc64c70b4c9f9ae1949e3ba8dece1" dependencies = [ "accesskit 0.17.1", "accesskit_consumer", - "hashbrown 0.15.2", + "hashbrown 0.15.5", "objc2 0.5.2", - "objc2-app-kit", + "objc2-app-kit 0.2.2", "objc2-foundation 0.2.2", ] @@ -91,11 +91,11 @@ checksum = "fcee751cc20d88678c33edaf9c07e8b693cd02819fe89053776f5313492273f5" dependencies = [ "accesskit 0.17.1", "accesskit_atspi_common", - "async-channel 2.3.1", + "async-channel 2.5.0", "async-executor", "async-task", "atspi", - "futures-lite 2.6.0", + "futures-lite 2.6.1", "futures-util", "serde", "zbus", @@ -109,11 +109,11 @@ checksum = "24fcd5d23d70670992b823e735e859374d694a3d12bfd8dd32bd3bd8bedb5d81" dependencies = [ "accesskit 0.17.1", "accesskit_consumer", - "hashbrown 0.15.2", + "hashbrown 0.15.5", "paste", "static_assertions", - "windows", - "windows-core", + "windows 0.58.0", + "windows-core 0.58.0", ] [[package]] @@ -141,22 +141,22 @@ dependencies = [ [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom 0.2.15", + "getrandom 0.3.3", "once_cell", "serde", "version_check", - "zerocopy 0.7.35", + "zerocopy", ] [[package]] @@ -199,7 +199,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" dependencies = [ "android-properties", - "bitflags 2.9.0", + "bitflags 2.9.4", "cc", "cesu8", "jni", @@ -242,9 +242,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.18" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" dependencies = [ "anstyle", "anstyle-parse", @@ -257,44 +257,44 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" [[package]] name = "anstyle-parse" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.7" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" dependencies = [ "anstyle", - "once_cell", - "windows-sys 0.59.0", + "once_cell_polyfill", + "windows-sys 0.60.2", ] [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" dependencies = [ "backtrace", ] @@ -310,19 +310,21 @@ dependencies = [ [[package]] name = "arboard" -version = "3.4.1" +version = "3.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df099ccb16cd014ff054ac1bf392c67feeef57164b05c42f037cd40f5d4357f4" +checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf" dependencies = [ "clipboard-win", - "core-graphics", - "image 0.25.5", + "image 0.25.6", "log", - "objc2 0.5.2", - "objc2-app-kit", - "objc2-foundation 0.2.2", + "objc2 0.6.2", + "objc2-app-kit 0.3.1", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.1", "parking_lot", - "windows-sys 0.48.0", + "percent-encoding", + "windows-sys 0.60.2", "x11rb", ] @@ -376,7 +378,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" dependencies = [ - "event-listener 5.4.0", + "event-listener 5.4.1", "event-listener-strategy", "futures-core", "pin-project-lite", @@ -395,9 +397,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" dependencies = [ "concurrent-queue", "event-listener-strategy", @@ -407,75 +409,74 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.13.1" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" dependencies = [ "async-task", "concurrent-queue", "fastrand 2.3.0", - "futures-lite 2.6.0", + "futures-lite 2.6.1", + "pin-project-lite", "slab", ] [[package]] name = "async-fs" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" +checksum = "09f7e37c0ed80b2a977691c47dae8625cfb21e205827106c64f7c588766b2e50" dependencies = [ "async-lock", "blocking", - "futures-lite 2.6.0", + "futures-lite 2.6.1", ] [[package]] name = "async-io" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +checksum = "19634d6336019ef220f09fd31168ce5c184b295cbf80345437cc36094ef223ca" dependencies = [ "async-lock", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.6.0", + "futures-lite 2.6.1", "parking", "polling", - "rustix 0.38.44", + "rustix 1.0.8", "slab", - "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "async-lock" -version = "3.4.0" +version = "3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" dependencies = [ - "event-listener 5.4.0", + "event-listener 5.4.1", "event-listener-strategy", "pin-project-lite", ] [[package]] name = "async-process" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" +checksum = "65daa13722ad51e6ab1a1b9c01299142bc75135b337923cfa10e79bbbd669f00" dependencies = [ - "async-channel 2.3.1", + "async-channel 2.5.0", "async-io", "async-lock", "async-signal", "async-task", "blocking", "cfg-if", - "event-listener 5.4.0", - "futures-lite 2.6.0", - "rustix 0.38.44", - "tracing", + "event-listener 5.4.1", + "futures-lite 2.6.1", + "rustix 1.0.8", ] [[package]] @@ -491,9 +492,9 @@ dependencies = [ [[package]] name = "async-signal" -version = "0.2.10" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +checksum = "f567af260ef69e1d52c2b560ce0ea230763e6fbb9214a85d768760a920e3e3c1" dependencies = [ "async-io", "async-lock", @@ -501,10 +502,10 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 0.38.44", + "rustix 1.0.8", "signal-hook-registry", "slab", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -518,9 +519,9 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.88" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", @@ -581,7 +582,7 @@ checksum = "430c5960624a4baaa511c9c0fcc2218e3b58f5dbcc47e6190cafee344b873333" dependencies = [ "atspi-common", "atspi-proxies", - "futures-lite 2.6.0", + "futures-lite 2.6.1", "zbus", ] @@ -599,15 +600,15 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "backtrace" -version = "0.3.74" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", "cfg-if", @@ -722,9 +723,9 @@ dependencies = [ "cfg-if", "console_error_panic_hook", "ctrlc", - "downcast-rs 2.0.1", + "downcast-rs 2.0.2", "log", - "thiserror 2.0.12", + "thiserror 2.0.16", "variadics_please", "wasm-bindgen", "web-sys", @@ -748,21 +749,21 @@ dependencies = [ "bevy_tasks 0.16.1", "bevy_utils 0.16.1", "bevy_window", - "bitflags 2.9.0", + "bitflags 2.9.4", "blake3", "crossbeam-channel", "derive_more 1.0.0", "disqualified", - "downcast-rs 2.0.1", + "downcast-rs 2.0.2", "either", "futures-io", - "futures-lite 2.6.0", + "futures-lite 2.6.1", "js-sys", "parking_lot", "ron", "serde", "stackfuture", - "thiserror 2.0.12", + "thiserror 2.0.16", "tracing", "uuid", "wasm-bindgen", @@ -794,7 +795,7 @@ dependencies = [ "derive_more 1.0.0", "encase", "serde", - "thiserror 2.0.12", + "thiserror 2.0.16", "wgpu-types", ] @@ -870,7 +871,7 @@ dependencies = [ "bevy_reflect", "bevy_tasks 0.16.1", "bevy_utils 0.16.1", - "bitflags 2.9.0", + "bitflags 2.9.4", "bumpalo", "concurrent-queue", "derive_more 1.0.0", @@ -881,7 +882,7 @@ dependencies = [ "nonmax", "serde", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.16", "variadics_please", ] @@ -932,15 +933,15 @@ dependencies = [ "bevy_platform", "bevy_reflect", "bevy_utils 0.16.1", - "bitflags 2.9.0", + "bitflags 2.9.4", "bytemuck", - "futures-lite 2.6.0", + "futures-lite 2.6.1", "guillotiere", "half", - "image 0.25.5", + "image 0.25.6", "rectangle-pack", "serde", - "thiserror 2.0.12", + "thiserror 2.0.16", "tracing", "wgpu-types", ] @@ -959,7 +960,7 @@ dependencies = [ "bevy_utils 0.16.1", "derive_more 1.0.0", "log", - "thiserror 2.0.12", + "thiserror 2.0.16", ] [[package]] @@ -975,7 +976,7 @@ dependencies = [ "bevy_reflect", "bevy_window", "log", - "thiserror 2.0.12", + "thiserror 2.0.16", ] [[package]] @@ -1046,7 +1047,7 @@ dependencies = [ "proc-macro2", "quote", "syn", - "toml_edit 0.22.24", + "toml_edit 0.22.27", ] [[package]] @@ -1065,7 +1066,7 @@ dependencies = [ "rand_distr", "serde", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.16", "variadics_please", ] @@ -1085,11 +1086,11 @@ dependencies = [ "bevy_reflect", "bevy_transform", "bevy_utils 0.16.1", - "bitflags 2.9.0", + "bitflags 2.9.4", "bytemuck", "hexasphere", "serde", - "thiserror 2.0.12", + "thiserror 2.0.16", "tracing", "wgpu-types", ] @@ -1112,8 +1113,8 @@ dependencies = [ "cfg-if", "critical-section", "foldhash", - "getrandom 0.2.15", - "hashbrown 0.15.2", + "getrandom 0.2.16", + "hashbrown 0.15.5", "portable-atomic", "portable-atomic-util", "serde", @@ -1146,14 +1147,14 @@ dependencies = [ "bevy_utils 0.16.1", "derive_more 1.0.0", "disqualified", - "downcast-rs 2.0.1", + "downcast-rs 2.0.2", "erased-serde", "foldhash", "glam 0.29.3", "serde", "smallvec", "smol_str", - "thiserror 2.0.12", + "thiserror 2.0.16", "uuid", "variadics_please", "wgpu-types", @@ -1178,7 +1179,7 @@ version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef91fed1f09405769214b99ebe4390d69c1af5cdd27967deae9135c550eb1667" dependencies = [ - "async-channel 2.3.1", + "async-channel 2.5.0", "bevy_app 0.16.1", "bevy_asset", "bevy_color", @@ -1197,15 +1198,15 @@ dependencies = [ "bevy_transform", "bevy_utils 0.16.1", "bevy_window", - "bitflags 2.9.0", + "bitflags 2.9.4", "bytemuck", "codespan-reporting", "derive_more 1.0.0", - "downcast-rs 2.0.1", + "downcast-rs 2.0.2", "encase", "fixedbitset 0.5.7", - "futures-lite 2.6.0", - "image 0.25.5", + "futures-lite 2.6.1", + "image 0.25.6", "indexmap", "js-sys", "naga", @@ -1215,7 +1216,7 @@ dependencies = [ "send_wrapper", "serde", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.16", "tracing", "variadics_please", "wasm-bindgen", @@ -1283,7 +1284,7 @@ version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b674242641cab680688fc3b850243b351c1af49d4f3417a576debd6cca8dcf5" dependencies = [ - "async-channel 2.3.1", + "async-channel 2.5.0", "async-executor", "async-task", "atomic-waker", @@ -1293,7 +1294,7 @@ dependencies = [ "crossbeam-queue", "derive_more 1.0.0", "futures-channel", - "futures-lite 2.6.0", + "futures-lite 2.6.1", "heapless", "pin-project", "wasm-bindgen-futures", @@ -1329,7 +1330,7 @@ dependencies = [ "bevy_utils 0.16.1", "derive_more 1.0.0", "serde", - "thiserror 2.0.12", + "thiserror 2.0.16", ] [[package]] @@ -1340,7 +1341,7 @@ checksum = "7915222f4a08ccc782e08d10b751b42e5f9d786e697d0cb3fd09333cb7e8b6ea" dependencies = [ "ahash", "bevy_utils_proc_macros", - "getrandom 0.2.15", + "getrandom 0.2.16", "hashbrown 0.14.5", "instant", "nonmax", @@ -1406,10 +1407,10 @@ version = "0.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "cexpr", "clang-sys", - "itertools 0.10.5", + "itertools 0.13.0", "log", "prettyplease", "proc-macro2", @@ -1480,9 +1481,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.0" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" dependencies = [ "serde", ] @@ -1538,28 +1539,28 @@ dependencies = [ [[package]] name = "blocking" -version = "1.6.1" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" dependencies = [ - "async-channel 2.3.1", + "async-channel 2.5.0", "async-task", "futures-io", - "futures-lite 2.6.0", + "futures-lite 2.6.1", "piper", ] [[package]] name = "boxcar" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c4925bc979b677330a8c7fe7a8c94af2dbb4a2d37b4a20a80d884400f46baa" +checksum = "36f64beae40a84da1b4b26ff2761a5b895c12adc41dc25aaee1c4f2bbfe97a6e" [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bvh" @@ -1590,7 +1591,7 @@ dependencies = [ "plotters", "plotters-bitmap", "proptest", - "rand 0.9.1", + "rand 0.9.2", "rayon", "tracing", ] @@ -1620,18 +1621,18 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.23.0" +version = "1.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" +checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.9.2" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ff22c2722516255d1823ce3cc4bc0b154dbc9364be5c905d6baa6eccbbc8774" +checksum = "4f154e572231cb6ba2bd1176980827e3d5dc04cc183a75dea38109fbdd672d29" dependencies = [ "proc-macro2", "quote", @@ -1662,7 +1663,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "log", "polling", "rustix 0.38.44", @@ -1690,9 +1691,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "castaway" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" dependencies = [ "rustversion", ] @@ -1708,10 +1709,11 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.17" +version = "1.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" +checksum = "590f9024a68a8c40351881787f1934dc11afd69090f5edb6831464694d836ea3" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", @@ -1734,9 +1736,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "cfg_aliases" @@ -1793,9 +1795,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.38" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed93b9805f8ba930df42c2590f05453d5ec36cbb85d018868a5b24d31f6ac000" +checksum = "7eac00902d9d136acd712710d71823fb8ac8004ca445a89e73a41d45aa712931" dependencies = [ "clap_builder", "clap_derive", @@ -1803,9 +1805,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.38" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "379026ff283facf611b0ea629334361c4211d1b12ee01024eec1591133b04120" +checksum = "2ad9bbf750e73b5884fb8a211a9424a1906c1e156724260fdae972f31d70e1d6" dependencies = [ "anstream", "anstyle", @@ -1816,9 +1818,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.32" +version = "4.5.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" +checksum = "bbfd7eae0b0f1a6e63d4b13c9c478de77c2eb546fba158ad50b4203dc24b9f9c" dependencies = [ "heck", "proc-macro2", @@ -1828,15 +1830,15 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" [[package]] name = "clipboard-win" -version = "5.4.0" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" +checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" dependencies = [ "error-code", ] @@ -1868,9 +1870,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "colored" @@ -1948,9 +1950,12 @@ checksum = "32b13ea120a812beba79e34316b3942a857c86ec1593cb34f27bb28272ce2cca" [[package]] name = "const_panic" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2459fc9262a1aa204eb4b5764ad4f189caec88aea9634389c0a25f8be7f6265e" +checksum = "bb8a602185c3c95b52f86dc78e55a6df9a287a7a93ddbcf012509930880cf879" +dependencies = [ + "typewit", +] [[package]] name = "const_soft_float" @@ -1985,9 +1990,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" dependencies = [ "core-foundation-sys", "libc", @@ -2034,9 +2039,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -2085,9 +2090,9 @@ checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" [[package]] name = "crossbeam-channel" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ "crossbeam-utils", ] @@ -2128,9 +2133,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-common" @@ -2154,15 +2159,15 @@ dependencies = [ [[package]] name = "cursor-icon" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" +checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" [[package]] name = "darling" -version = "0.20.10" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" dependencies = [ "darling_core", "darling_macro", @@ -2170,9 +2175,9 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.10" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" dependencies = [ "fnv", "ident_case", @@ -2183,9 +2188,9 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.20.10" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core", "quote", @@ -2200,9 +2205,9 @@ checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "deranged" -version = "0.4.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" dependencies = [ "powerfmt", ] @@ -2289,7 +2294,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -2298,6 +2303,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.9.4", + "objc2 0.6.2", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -2370,9 +2385,9 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "downcast-rs" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea8a8b81cacc08888170eef4d13b775126db426d0b348bee9d18c2c1eaf123cf" +checksum = "117240f60069e65410b3ae1bb213295bd828f707b5bec6596a1afc8793ce0cbc" [[package]] name = "doxygen-rs" @@ -2385,9 +2400,9 @@ dependencies = [ [[package]] name = "dpi" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" [[package]] name = "duplicate" @@ -2428,11 +2443,11 @@ dependencies = [ "glutin", "glutin-winit", "home", - "image 0.25.5", + "image 0.25.6", "js-sys", "log", "objc2 0.5.2", - "objc2-app-kit", + "objc2-app-kit 0.2.2", "objc2-foundation 0.2.2", "parking_lot", "percent-encoding", @@ -2460,7 +2475,7 @@ checksum = "25dd34cec49ab55d85ebf70139cb1ccd29c977ef6b6ba4fe85489d6877ee9ef3" dependencies = [ "accesskit 0.17.1", "ahash", - "bitflags 2.9.0", + "bitflags 2.9.4", "emath", "epaint", "log", @@ -2606,9 +2621,9 @@ checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" [[package]] name = "enumflags2" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" dependencies = [ "enumflags2_derive", "serde", @@ -2616,9 +2631,9 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", @@ -2638,18 +2653,18 @@ dependencies = [ [[package]] name = "enumset" -version = "1.1.6" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11a6b7c3d347de0a9f7bfd2f853be43fe32fa6fac30c70f6d6d67a1e936b87ee" +checksum = "25b07a8dfbbbfc0064c0a6bdf9edcf966de6b1c33ce344bdeca3b41615452634" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.11.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6da3ea9e1d1a3b1593e15781f930120e72aa7501610b2f82e5b6739c72e8eac5" +checksum = "f43e744e4ea338060faee68ed933e46e722fb7f3617e722a5772d7e856d8b3ce" dependencies = [ "darling", "proc-macro2", @@ -2729,19 +2744,19 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.10" +version = "0.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "error-code" -version = "3.3.1" +version = "3.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" +checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" [[package]] name = "euclid" @@ -2760,9 +2775,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "5.4.0" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ "concurrent-queue", "parking", @@ -2771,11 +2786,11 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ - "event-listener 5.4.0", + "event-listener 5.4.1", "pin-project-lite", ] @@ -2791,12 +2806,9 @@ dependencies = [ [[package]] name = "fast_hilbert" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ec2bbe15af87954c739e236021f4411766c0f2b9c4a5f0b9317bcf6048ebf8" -dependencies = [ - "num-traits", -] +checksum = "3faa84f4bea4fba03e05500ec1fad62efe4a07632100f1cbef165bb22dcb77fc" [[package]] name = "fastrand" @@ -2824,16 +2836,22 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.25" +version = "0.2.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" dependencies = [ "cfg-if", "libc", "libredox", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] +[[package]] +name = "find-msvc-tools" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e178e4fba8a2726903f6ba98a6d221e76f9c12c650d5dc0e6afdc50677b49650" + [[package]] name = "fixedbitset" version = "0.4.2" @@ -2848,9 +2866,9 @@ checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] name = "flate2" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" dependencies = [ "crc32fast", "libz-ng-sys", @@ -2925,9 +2943,9 @@ checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -3003,9 +3021,9 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" dependencies = [ "fastrand 2.3.0", "futures-core", @@ -3057,15 +3075,16 @@ dependencies = [ [[package]] name = "generator" -version = "0.8.4" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6bd114ceda131d3b1d665eba35788690ad37f5916457286b32ab6fd3c438dd" +checksum = "605183a538e3e2a9c1038635cc5c2d194e2ee8fd0d1b66b8349fad7dbacce5a2" dependencies = [ + "cc", "cfg-if", "libc", "log", "rustversion", - "windows", + "windows 0.61.3", ] [[package]] @@ -3086,45 +3105,45 @@ dependencies = [ "glam 0.29.3", "itertools 0.14.0", "ordered-float 5.0.0", - "rand 0.9.1", + "rand 0.9.2", "serde", "tango-bench", ] [[package]] name = "gethostname" -version = "0.4.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" +checksum = "fc257fdb4038301ce4b9cd1b3b51704509692bb3ff716a410cbd07925d9dae55" dependencies = [ - "libc", - "windows-targets 0.48.5", + "rustix 1.0.8", + "windows-targets 0.52.6", ] [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "wasi 0.14.3+wasi-0.2.4", "wasm-bindgen", ] @@ -3169,15 +3188,15 @@ dependencies = [ [[package]] name = "glam" -version = "0.30.4" +version = "0.30.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50a99dbe56b72736564cfa4b85bf9a33079f16ae8b74983ab06af3b1a3696b11" +checksum = "f2d1aab06663bdce00d6ca5e5ed586ec8d18033a771906c993a1e3755b368d85" [[package]] name = "glob" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "glob-match" @@ -3199,22 +3218,22 @@ dependencies = [ [[package]] name = "glutin" -version = "0.32.2" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03642b8b0cce622392deb0ee3e88511f75df2daac806102597905c3ea1974848" +checksum = "12124de845cacfebedff80e877bb37b5b75c34c5a4c89e47e1cdd67fb6041325" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "cfg_aliases", "cgl", - "core-foundation 0.9.4", - "dispatch", + "dispatch2", "glutin_egl_sys", "glutin_glx_sys", "glutin_wgl_sys", "libloading", - "objc2 0.5.2", - "objc2-app-kit", - "objc2-foundation 0.2.2", + "objc2 0.6.2", + "objc2-app-kit 0.3.1", + "objc2-core-foundation", + "objc2-foundation 0.3.1", "once_cell", "raw-window-handle", "wayland-sys", @@ -3280,7 +3299,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "gpu-alloc-types", ] @@ -3290,7 +3309,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", ] [[package]] @@ -3302,18 +3321,18 @@ dependencies = [ "log", "presser", "thiserror 1.0.69", - "windows", + "windows 0.58.0", ] [[package]] name = "gpu-descriptor" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf29e94d6d243368b7a56caa16bc213e4f9f8ed38c4d9557069527b5d5281ca" +checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "gpu-descriptor-types", - "hashbrown 0.15.2", + "hashbrown 0.15.5", ] [[package]] @@ -3322,7 +3341,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", ] [[package]] @@ -3337,9 +3356,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.8" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5017294ff4bb30944501348f6f8e42e6ad28f42c8bbef7a74029aff064a4e3c2" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" dependencies = [ "atomic-waker", "bytes", @@ -3356,9 +3375,9 @@ dependencies = [ [[package]] name = "half" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7db2ff139bba50379da6aa0766b52fdcb62cb5b263009b09ed58ba604e14bbd1" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" dependencies = [ "cfg-if", "crunchy", @@ -3386,9 +3405,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2", "equivalent", @@ -3419,7 +3438,7 @@ version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd54745cfacb7b97dee45e8fdb91814b62bccddb481debb7de0f9ee6b7bf5b43" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "byteorder", "heed-traits", "heed-types", @@ -3453,21 +3472,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hermit-abi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" - -[[package]] -name = "hermit-abi" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbd780fe5cc30f81464441920d82ac8740e2e46b29a6fad543ddd075229ce37e" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hex" @@ -3549,19 +3556,21 @@ checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" [[package]] name = "hyper" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", + "futures-core", "h2", "http", "http-body", "httparse", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -3569,11 +3578,10 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.5" +version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "futures-util", "http", "hyper", "hyper-util", @@ -3603,21 +3611,28 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" dependencies = [ + "base64 0.22.1", "bytes", "futures-channel", + "futures-core", "futures-util", "http", "http-body", "hyper", + "ipnet", + "libc", + "percent-encoding", "pin-project-lite", "socket2", + "system-configuration", "tokio", "tower-service", "tracing", + "windows-registry", ] [[package]] @@ -3683,7 +3698,7 @@ dependencies = [ "serial_test", "sha2", "simd-utils", - "thiserror 2.0.12", + "thiserror 2.0.16", "thread_local", "tokio", "tokio-rustls", @@ -3905,7 +3920,7 @@ version = "0.1.0" dependencies = [ "approx", "divan", - "rand 0.9.1", + "rand 0.9.2", ] [[package]] @@ -3914,7 +3929,7 @@ version = "0.1.0" dependencies = [ "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.16", "uuid", "valence_protocol 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", ] @@ -3942,21 +3957,22 @@ dependencies = [ [[package]] name = "icu_collections" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" dependencies = [ "displaydoc", + "potential_utf", "yoke", "zerofrom", "zerovec", ] [[package]] -name = "icu_locid" -version = "1.5.0" +name = "icu_locale_core" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" dependencies = [ "displaydoc", "litemap", @@ -3965,31 +3981,11 @@ dependencies = [ "zerovec", ] -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - [[package]] name = "icu_normalizer" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" dependencies = [ "displaydoc", "icu_collections", @@ -3997,67 +3993,54 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", - "utf16_iter", - "utf8_iter", - "write16", "zerovec", ] [[package]] name = "icu_normalizer_data" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "1.5.1" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", "icu_collections", - "icu_locid_transform", + "icu_locale_core", "icu_properties_data", "icu_provider", - "tinystr", + "potential_utf", + "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "1.5.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" -version = "1.5.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" dependencies = [ "displaydoc", - "icu_locid", - "icu_provider_macros", + "icu_locale_core", "stable_deref_trait", "tinystr", "writeable", "yoke", "zerofrom", + "zerotrie", "zerovec", ] -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "ident_case" version = "1.0.1" @@ -4066,9 +4049,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -4077,9 +4060,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ "icu_normalizer", "icu_properties", @@ -4101,9 +4084,9 @@ dependencies = [ [[package]] name = "image" -version = "0.25.5" +version = "0.25.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" +checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" dependencies = [ "bytemuck", "byteorder-lite", @@ -4114,21 +4097,21 @@ dependencies = [ [[package]] name = "immutable-chunkmap" -version = "2.0.6" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f97096f508d54f8f8ab8957862eee2ccd628847b6217af1a335e1c44dee578" +checksum = "e2194c61e2a29841937e84ec2264a905985c397ccccfbd4783191d3285fa92ef" dependencies = [ "arrayvec", ] [[package]] name = "indexmap" -version = "2.9.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9" dependencies = [ "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.15.5", "rayon", "serde", ] @@ -4145,19 +4128,40 @@ dependencies = [ "web-sys", ] +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags 2.9.4", + "cfg-if", + "libc", +] + [[package]] name = "ipnet" version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "is-terminal" version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ - "hermit-abi 0.5.0", + "hermit-abi", "libc", "windows-sys 0.59.0", ] @@ -4183,6 +4187,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.14.0" @@ -4222,18 +4235,19 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.32" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ + "getrandom 0.3.3", "libc", ] [[package]] name = "jpeg-decoder" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" +checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" [[package]] name = "js-sys" @@ -4280,9 +4294,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.172" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "libdeflate-sys" @@ -4304,29 +4318,29 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.53.3", ] [[package]] name = "libm" -version = "0.2.11" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" -version = "0.1.3" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "libc", - "redox_syscall 0.5.10", + "redox_syscall 0.5.17", ] [[package]] @@ -4353,21 +4367,21 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" [[package]] name = "litemap" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "litrs" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" +checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed" [[package]] name = "lmdb-master-sys" @@ -4382,9 +4396,9 @@ dependencies = [ [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ "autocfg", "scopeguard", @@ -4392,9 +4406,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.26" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "loom" @@ -4415,9 +4429,15 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.5", ] +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "malloc_buf" version = "0.0.6" @@ -4429,18 +4449,18 @@ dependencies = [ [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] [[package]] name = "matrixmultiply" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9380b911e3e96d10c1f415da0876389aaf1b56759054eeb0de7df940c456ba1a" +checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" dependencies = [ "autocfg", "rawpointer", @@ -4448,15 +4468,15 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "memmap2" -version = "0.9.5" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +checksum = "843a98750cd611cc2965a8213b53b43e715f13c37a9e096c6408e69990961db7" dependencies = [ "libc", ] @@ -4476,7 +4496,7 @@ version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f569fb946490b5743ad69813cb19629130ce9374034abe31614a36402d18f99e" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "block", "core-graphics-types", "foreign-types 0.5.0", @@ -4499,9 +4519,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.5" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", "simd-adler32", @@ -4509,14 +4529,14 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", "log", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", ] [[package]] @@ -4527,18 +4547,18 @@ checksum = "1fafa6961cabd9c63bcd77a45d7e3b7f3b552b70417831fb0f56db717e72407e" [[package]] name = "munge" -version = "0.4.3" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0091202c98cf06da46c279fdf50cccb6b1c43b4521abdf6a27b4c7e71d5d9d7" +checksum = "d7feb0b48aa0a25f9fe0899482c6e1379ee7a11b24a53073eacdecb9adb6dc60" dependencies = [ "munge_macro", ] [[package]] name = "munge_macro" -version = "0.4.3" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "734799cf91479720b2f970c61a22850940dd91e27d4f02b1c6fc792778df2459" +checksum = "f2e3795a5d2da581a8b252fec6022eee01aea10161a4d1bf237d4cbe47f7e988" dependencies = [ "proc-macro2", "quote", @@ -4553,7 +4573,7 @@ checksum = "e380993072e52eef724eddfcde0ed013b0c023c3f0417336ed041aa9f076994e" dependencies = [ "arrayvec", "bit-set 0.8.0", - "bitflags 2.9.0", + "bitflags 2.9.4", "cfg_aliases", "codespan-reporting", "hexf-parse", @@ -4564,7 +4584,7 @@ dependencies = [ "spirv", "strum", "termcolor", - "thiserror 2.0.12", + "thiserror 2.0.16", "unicode-xid", ] @@ -4581,7 +4601,7 @@ dependencies = [ "naga", "once_cell", "regex", - "regex-syntax 0.8.5", + "regex-syntax", "rustc-hash 1.1.0", "thiserror 1.0.69", "tracing", @@ -4594,7 +4614,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", ] [[package]] @@ -4637,7 +4657,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "jni-sys", "log", "ndk-sys 0.6.0+11769913", @@ -4676,7 +4696,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "cfg-if", "cfg_aliases", "libc", @@ -4689,7 +4709,7 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "cfg-if", "cfg_aliases", "libc", @@ -4719,12 +4739,11 @@ checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" dependencies = [ - "overload", - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -4774,28 +4793,29 @@ dependencies = [ [[package]] name = "num_cpus" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi", "libc", ] [[package]] name = "num_enum" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" dependencies = [ "num_enum_derive", + "rustversion", ] [[package]] name = "num_enum_derive" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -4839,9 +4859,9 @@ dependencies = [ [[package]] name = "objc2" -version = "0.6.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3531f65190d9cff863b77a99857e74c314dd16bf56c538c4b57c7cbc3f3a6e59" +checksum = "561f357ba7f3a2a61563a186a163d0a3a5247e1089524a3981d49adb775078bc" dependencies = [ "objc2-encode", ] @@ -4852,7 +4872,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "block2", "libc", "objc2 0.5.2", @@ -4862,13 +4882,26 @@ dependencies = [ "objc2-quartz-core", ] +[[package]] +name = "objc2-app-kit" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" +dependencies = [ + "bitflags 2.9.4", + "objc2 0.6.2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.1", +] + [[package]] name = "objc2-cloud-kit" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "block2", "objc2 0.5.2", "objc2-core-location", @@ -4892,19 +4925,43 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "block2", "objc2 0.5.2", "objc2-foundation 0.2.2", ] [[package]] -name = "objc2-core-image" -version = "0.2.2" +name = "objc2-core-foundation" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" dependencies = [ - "block2", + "bitflags 2.9.4", + "dispatch2", + "objc2 0.6.2", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" +dependencies = [ + "bitflags 2.9.4", + "dispatch2", + "objc2 0.6.2", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", "objc2 0.5.2", "objc2-foundation 0.2.2", "objc2-metal", @@ -4934,7 +4991,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "block2", "dispatch", "libc", @@ -4943,12 +5000,24 @@ dependencies = [ [[package]] name = "objc2-foundation" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a21c6c9014b82c39515db5b396f91645182611c97d24637cf56ac01e5f8d998" +checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" dependencies = [ - "bitflags 2.9.0", - "objc2 0.6.0", + "bitflags 2.9.4", + "objc2 0.6.2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" +dependencies = [ + "bitflags 2.9.4", + "objc2 0.6.2", + "objc2-core-foundation", ] [[package]] @@ -4959,7 +5028,7 @@ checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" dependencies = [ "block2", "objc2 0.5.2", - "objc2-app-kit", + "objc2-app-kit 0.2.2", "objc2-foundation 0.2.2", ] @@ -4969,7 +5038,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "block2", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -4981,7 +5050,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "block2", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -5004,7 +5073,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "block2", "objc2 0.5.2", "objc2-cloud-kit", @@ -5036,7 +5105,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "block2", "objc2 0.5.2", "objc2-core-location", @@ -5068,6 +5137,12 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + [[package]] name = "oorandom" version = "11.1.5" @@ -5076,11 +5151,11 @@ checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" [[package]] name = "openssl" -version = "0.10.71" +version = "0.10.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "cfg-if", "foreign-types 0.3.2", "libc", @@ -5108,9 +5183,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.106" +version = "0.9.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" dependencies = [ "cc", "libc", @@ -5161,17 +5236,11 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "owned_ttf_parser" -version = "0.25.0" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" +checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" dependencies = [ "ttf-parser", ] @@ -5225,9 +5294,9 @@ dependencies = [ [[package]] name = "papaya" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6827e3fc394523c21d4464d02c0bb1c19966ea4a58a9844ad6d746214179d2bc" +checksum = "f92dd0b07c53a0a0c764db2ace8c541dc47320dad97c2200c2a637ab9dd2328f" dependencies = [ "equivalent", "seize", @@ -5241,9 +5310,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", "parking_lot_core", @@ -5251,13 +5320,13 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.10", + "redox_syscall 0.5.17", "smallvec", "windows-targets 0.52.6", ] @@ -5270,9 +5339,9 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "petgraph" @@ -5383,13 +5452,13 @@ checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" [[package]] name = "plist" -version = "1.7.0" +version = "1.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" +checksum = "3af6b589e163c5a788fab00ce0c0366f6efbb9959c2f9874b224936af7fce7e1" dependencies = [ "base64 0.22.1", "indexmap", - "quick-xml 0.32.0", + "quick-xml 0.38.3", "serde", "time", ] @@ -5450,17 +5519,16 @@ dependencies = [ [[package]] name = "polling" -version = "3.7.4" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +checksum = "b5bd19146350fe804f7cb2669c851c03d69da628803dab0d98018142aaa5d829" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi 0.4.0", + "hermit-abi", "pin-project-lite", - "rustix 0.38.44", - "tracing", - "windows-sys 0.59.0", + "rustix 1.0.8", + "windows-sys 0.60.2", ] [[package]] @@ -5471,9 +5539,9 @@ checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" [[package]] name = "portable-atomic" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "portable-atomic-util" @@ -5484,6 +5552,15 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "potential_utf" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -5505,7 +5582,7 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "zerocopy 0.8.24", + "zerocopy", ] [[package]] @@ -5516,9 +5593,9 @@ checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" [[package]] name = "prettyplease" -version = "0.2.31" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5316f57387668042f561aae71480de936257848f9c43ce528e311d89a07cadeb" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", "syn", @@ -5530,14 +5607,14 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ - "toml_edit 0.22.24", + "toml_edit 0.22.27", ] [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] @@ -5557,25 +5634,25 @@ dependencies = [ [[package]] name = "profiling" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" +checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" [[package]] name = "proptest" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" +checksum = "6fcdab19deb5195a31cf7726a210015ff1496ba1464fd42cb4f537b8b01b471f" dependencies = [ "bit-set 0.8.0", "bit-vec 0.8.0", - "bitflags 2.9.0", + "bitflags 2.9.4", "lazy_static", "num-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", + "rand 0.9.2", + "rand_chacha 0.9.0", "rand_xorshift", - "regex-syntax 0.8.5", + "regex-syntax", "rusty-fork", "tempfile", "unarray", @@ -5619,27 +5696,27 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.32.0" +version = "0.37.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d3a6e5838b60e0e8fa7a43f22ade549a37d61f8bdbe636d0d7816191de969c2" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" dependencies = [ "memchr", ] [[package]] name = "quick-xml" -version = "0.37.2" +version = "0.38.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "165859e9e55f79d67b96c5d96f4e88b6f2695a1972849c15a6a3f5c59fc2c003" +checksum = "42a232e7487fc2ef313d96dde7948e7a3c05101870d8985e4fd8d26aedd27b89" dependencies = [ "memchr", ] [[package]] name = "quinn" -version = "0.11.7" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" dependencies = [ "bytes", "cfg_aliases", @@ -5649,7 +5726,7 @@ dependencies = [ "rustc-hash 2.1.1", "rustls", "socket2", - "thiserror 2.0.12", + "thiserror 2.0.16", "tokio", "tracing", "web-time", @@ -5657,19 +5734,20 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.10" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b820744eb4dc9b57a3398183639c511b5a26d2ed702cedd3febaa1393caa22cc" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", - "getrandom 0.3.2", - "rand 0.9.1", + "getrandom 0.3.3", + "lru-slab", + "rand 0.9.2", "ring", "rustc-hash 2.1.1", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.12", + "thiserror 2.0.16", "tinyvec", "tracing", "web-time", @@ -5677,16 +5755,16 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.10" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e46f3055866785f6b92bc6164b76be02ca8f2eb4b002c0354b28cf4c119e5944" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" dependencies = [ "cfg_aliases", "libc", "once_cell", "socket2", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -5700,9 +5778,9 @@ dependencies = [ [[package]] name = "r-efi" -version = "5.2.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "radium" @@ -5732,9 +5810,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", @@ -5766,7 +5844,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", ] [[package]] @@ -5775,7 +5853,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", ] [[package]] @@ -5790,11 +5868,11 @@ dependencies = [ [[package]] name = "rand_xorshift" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" dependencies = [ - "rand_core 0.6.4", + "rand_core 0.9.3", ] [[package]] @@ -5817,9 +5895,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ "either", "rayon-core", @@ -5827,9 +5905,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -5852,73 +5930,58 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.10" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", ] [[package]] name = "redox_users" -version = "0.5.0" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ - "getrandom 0.2.15", + "getrandom 0.2.16", "libredox", - "thiserror 2.0.12", + "thiserror 2.0.16", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax", ] [[package]] name = "regex-lite" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" - -[[package]] -name = "regex-syntax" -version = "0.6.29" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +checksum = "943f41321c63ef1c92fd763bfe054d2668f7f225a5c29f0105903dc2fc04ba30" [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] name = "rend" @@ -5937,9 +6000,9 @@ checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" [[package]] name = "reqwest" -version = "0.12.15" +version = "0.12.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" dependencies = [ "base64 0.22.1", "bytes", @@ -5954,28 +6017,25 @@ dependencies = [ "hyper-rustls", "hyper-tls", "hyper-util", - "ipnet", "js-sys", "log", "mime", "native-tls", - "once_cell", "percent-encoding", "pin-project-lite", "quinn", "rustls", - "rustls-pemfile", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", - "system-configuration", "tokio", "tokio-native-tls", "tokio-rustls", "tokio-util", "tower", + "tower-http", "tower-service", "url", "wasm-bindgen", @@ -5983,7 +6043,6 @@ dependencies = [ "wasm-streams", "web-sys", "webpki-roots", - "windows-registry", ] [[package]] @@ -5994,7 +6053,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", "cfg-if", - "getrandom 0.2.15", + "getrandom 0.2.16", "libc", "untrusted", "windows-sys 0.52.0", @@ -6002,13 +6061,13 @@ dependencies = [ [[package]] name = "rkyv" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e147371c75553e1e2fcdb483944a8540b8438c31426279553b9a8182a9b7b65" +checksum = "19f5c3e5da784cd8c69d32cdc84673f3204536ca56e1fa01be31a74b92c932ac" dependencies = [ "bytecheck", "bytes", - "hashbrown 0.15.2", + "hashbrown 0.15.5", "indexmap", "munge", "ptr_meta", @@ -6021,9 +6080,9 @@ dependencies = [ [[package]] name = "rkyv_derive" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246b40ac189af6c675d124b802e8ef6d5246c53e17367ce9501f8f66a81abb7a" +checksum = "4270433626cffc9c4c1d3707dd681f2a2718d3d7b09ad754bec137acecda8d22" dependencies = [ "proc-macro2", "quote", @@ -6047,7 +6106,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" dependencies = [ "base64 0.21.7", - "bitflags 2.9.0", + "bitflags 2.9.4", "serde", "serde_derive", ] @@ -6062,7 +6121,7 @@ dependencies = [ "libdeflater", "mio", "num_cpus", - "rand 0.9.1", + "rand 0.9.2", "serde", "tracing", "tracing-subscriber", @@ -6070,9 +6129,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc-hash" @@ -6092,7 +6151,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "errno", "libc", "linux-raw-sys 0.4.15", @@ -6101,15 +6160,15 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.3" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96" +checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "errno", "libc", - "linux-raw-sys 0.9.3", - "windows-sys 0.59.0", + "linux-raw-sys 0.9.4", + "windows-sys 0.60.2", ] [[package]] @@ -6127,15 +6186,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - [[package]] name = "rustls-pki-types" version = "1.12.0" @@ -6159,9 +6209,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "rusty-fork" @@ -6192,9 +6242,9 @@ dependencies = [ [[package]] name = "scc" -version = "2.3.4" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22b2d775fb28f245817589471dd49c5edf64237f4a19d10ce9a92ff4651a27f4" +checksum = "46e6f046b7fef48e2660c57ed794263155d713de679057f2d0c169bfc6e756cc" dependencies = [ "sdd", ] @@ -6255,9 +6305,9 @@ dependencies = [ [[package]] name = "sdd" -version = "3.0.8" +version = "3.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "584e070911c7017da6cb2eb0788d09f43d789029b5877d3e5ecc8acf86ceee21" +checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca" [[package]] name = "security-framework" @@ -6265,7 +6315,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -6320,9 +6370,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.143" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" dependencies = [ "itoa", "memchr", @@ -6343,9 +6393,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ "serde", ] @@ -6426,9 +6476,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] @@ -6461,12 +6511,9 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "slotmap" @@ -6479,9 +6526,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.14.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "smithay-client-toolkit" @@ -6489,7 +6536,7 @@ version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "calloop", "calloop-wayland-source", "cursor-icon", @@ -6530,18 +6577,18 @@ dependencies = [ [[package]] name = "snafu" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "223891c85e2a29c3fe8fb900c1fae5e69c2e42415e3177752e8718475efa5019" +checksum = "4800ae0e2ebdfaea32ffb9745642acdc378740dcbd74d3fb3cd87572a34810c6" dependencies = [ "snafu-derive", ] [[package]] name = "snafu-derive" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c3c6b7927ffe7ecaa769ee0e3994da3b8cafc8f444578982c83ecb161af917" +checksum = "186f5ba9999528053fb497fdf0dd330efcc69cfe4ad03776c9d704bc54fee10f" dependencies = [ "heck", "proc-macro2", @@ -6551,12 +6598,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.8" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -6575,7 +6622,7 @@ version = "0.3.0+sdk-1.3.268.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", ] [[package]] @@ -6653,9 +6700,9 @@ checksum = "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3acf9e02fb" [[package]] name = "syn" -version = "2.0.101" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -6682,9 +6729,9 @@ dependencies = [ [[package]] name = "synstructure" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", @@ -6704,7 +6751,7 @@ dependencies = [ "fnv", "once_cell", "plist", - "regex-syntax 0.8.5", + "regex-syntax", "serde", "serde_derive", "serde_json", @@ -6719,7 +6766,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -6774,15 +6821,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.19.1" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e" dependencies = [ "fastrand 2.3.0", - "getrandom 0.3.2", + "getrandom 0.3.3", "once_cell", - "rustix 1.0.3", - "windows-sys 0.59.0", + "rustix 1.0.8", + "windows-sys 0.60.2", ] [[package]] @@ -6796,12 +6843,12 @@ dependencies = [ [[package]] name = "terminal_size" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45c6481c4829e4cc63825e62c49186a34538b7b2750b73b266581ffb612fb5ed" +checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" dependencies = [ - "rustix 1.0.3", - "windows-sys 0.59.0", + "rustix 1.0.8", + "windows-sys 0.60.2", ] [[package]] @@ -6815,11 +6862,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.16", ] [[package]] @@ -6835,9 +6882,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" dependencies = [ "proc-macro2", "quote", @@ -6846,12 +6893,11 @@ dependencies = [ [[package]] name = "thread_local" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", - "once_cell", ] [[package]] @@ -6887,12 +6933,11 @@ dependencies = [ [[package]] name = "time" -version = "0.3.41" +version = "0.3.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +checksum = "8ca967379f9d8eb8058d86ed467d81d03e81acd45757e4ca341c24affbe8e8e3" dependencies = [ "deranged", - "itoa", "libc", "num-conv", "num_threads", @@ -6904,15 +6949,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +checksum = "a9108bb380861b07264b950ded55a44a14a4adc68b9f5efd85aafc3aa4d40a68" [[package]] name = "time-macros" -version = "0.2.22" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +checksum = "7182799245a7264ce590b349d90338f1c1affad93d2639aed5f8f69c090b334c" dependencies = [ "num-conv", "time-core", @@ -6945,9 +6990,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.7.6" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" dependencies = [ "displaydoc", "zerovec", @@ -6965,9 +7010,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -6980,21 +7025,23 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.45.0" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", + "slab", "socket2", "tokio-macros", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -7030,16 +7077,16 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.15" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", "futures-io", "futures-sink", "futures-util", - "hashbrown 0.15.2", + "hashbrown 0.15.5", "pin-project-lite", "slab", "tokio", @@ -7047,21 +7094,21 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.20" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.24", + "toml_edit 0.22.27", ] [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ "serde", ] @@ -7079,17 +7126,24 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.22.24" +version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", "serde", "serde_spanned", "toml_datetime", - "winnow 0.7.4", + "toml_write", + "winnow 0.7.13", ] +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + [[package]] name = "tower" version = "0.5.2" @@ -7105,6 +7159,24 @@ dependencies = [ "tower-service", ] +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags 2.9.4", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" @@ -7142,9 +7214,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", @@ -7153,9 +7225,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", "valuable", @@ -7189,14 +7261,14 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "regex", + "regex-automata", "sharded-slab", "smallvec", "thread_local", @@ -7230,9 +7302,9 @@ dependencies = [ [[package]] name = "tracy-client" -version = "0.18.0" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d90a2c01305b02b76fdd89ac8608bae27e173c829a35f7d76a345ab5d33836db" +checksum = "ef54005d3d760186fd662dad4b7bb27ecd5531cdef54d1573ebd3f20a9205ed7" dependencies = [ "loom", "once_cell", @@ -7241,9 +7313,9 @@ dependencies = [ [[package]] name = "tracy-client-sys" -version = "0.24.3" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69fff37da548239c3bf9e64a12193d261e8b22b660991c6fd2df057c168f435f" +checksum = "319c70195101a93f56db4c74733e272d720768e13471f400c78406a326b172b0" dependencies = [ "cc", "windows-targets 0.52.6", @@ -7263,11 +7335,11 @@ checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" [[package]] name = "type-map" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb68604048ff8fa93347f02441e4487594adc20bb8a084f9e564d2b827a0a9f" +checksum = "cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90" dependencies = [ - "rustc-hash 1.1.0", + "rustc-hash 2.1.1", ] [[package]] @@ -7282,6 +7354,12 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +[[package]] +name = "typewit" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e75c3b0d61c1d0e12b4b0fd5111f377c918e0227e9eb67434dcf9e6084646c6" + [[package]] name = "uds_windows" version = "1.1.0" @@ -7331,9 +7409,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.4" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", @@ -7341,12 +7419,6 @@ dependencies = [ "serde", ] -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - [[package]] name = "utf8_iter" version = "1.0.4" @@ -7361,11 +7433,11 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.16.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ - "getrandom 0.3.2", + "getrandom 0.3.3", "js-sys", "serde", "wasm-bindgen", @@ -7533,7 +7605,7 @@ name = "valence_math" version = "0.2.0-alpha.1+mc.1.20.1" source = "git+https://github.com/TestingPlant/valence?branch=feat-open#7c664716cd1e7b30de4e38cfc0ee8d1ecc7b0bd5" dependencies = [ - "glam 0.30.4", + "glam 0.30.5", ] [[package]] @@ -7787,17 +7859,17 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" -version = "0.14.2+wasi-0.2.4" +version = "0.14.3+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "6a51ae83037bdd272a9e28ce236db8c07016dd0d50c27038b3f407533c030c95" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] @@ -7886,13 +7958,13 @@ dependencies = [ [[package]] name = "wayland-backend" -version = "0.3.8" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7208998eaa3870dad37ec8836979581506e0c5c64c20c9e79e9d2a10d6f47bf" +checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" dependencies = [ "cc", "downcast-rs 1.2.1", - "rustix 0.38.44", + "rustix 1.0.8", "scoped-tls", "smallvec", "wayland-sys", @@ -7900,12 +7972,12 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.8" +version = "0.31.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2120de3d33638aaef5b9f4472bff75f07c56379cf76ea320bd3a3d65ecaf73f" +checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" dependencies = [ - "bitflags 2.9.0", - "rustix 0.38.44", + "bitflags 2.9.4", + "rustix 1.0.8", "wayland-backend", "wayland-scanner", ] @@ -7916,29 +7988,29 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "cursor-icon", "wayland-backend", ] [[package]] name = "wayland-cursor" -version = "0.31.8" +version = "0.31.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a93029cbb6650748881a00e4922b076092a6a08c11e7fbdb923f064b23968c5d" +checksum = "447ccc440a881271b19e9989f75726d60faa09b95b0200a9b7eb5cc47c3eeb29" dependencies = [ - "rustix 0.38.44", + "rustix 1.0.8", "wayland-client", "xcursor", ] [[package]] name = "wayland-protocols" -version = "0.32.6" +version = "0.32.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0781cf46869b37e36928f7b432273c0995aa8aed9552c556fb18754420541efc" +checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "wayland-backend", "wayland-client", "wayland-scanner", @@ -7946,11 +8018,11 @@ dependencies = [ [[package]] name = "wayland-protocols-plasma" -version = "0.3.6" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ccaacc76703fefd6763022ac565b590fcade92202492381c95b2edfdf7d46b3" +checksum = "a07a14257c077ab3279987c4f8bb987851bf57081b93710381daea94f2c2c032" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7959,11 +8031,11 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.3.6" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248a02e6f595aad796561fa82d25601bd2c8c3b145b1c7453fc8f94c1a58f8b2" +checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "wayland-backend", "wayland-client", "wayland-protocols", @@ -7972,20 +8044,20 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.31.6" +version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" +checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" dependencies = [ "proc-macro2", - "quick-xml 0.37.2", + "quick-xml 0.37.5", "quote", ] [[package]] name = "wayland-sys" -version = "0.31.6" +version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" +checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" dependencies = [ "dlib", "log", @@ -8015,44 +8087,43 @@ dependencies = [ [[package]] name = "webbrowser" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5df295f8451142f1856b1bd86a606dfe9587d439bc036e319c827700dbd555e" +checksum = "aaf4f3c0ba838e82b4e5ccc4157003fb8c324ee24c058470ffb82820becbde98" dependencies = [ - "core-foundation 0.10.0", - "home", + "core-foundation 0.10.1", "jni", "log", "ndk-context", - "objc2 0.6.0", - "objc2-foundation 0.3.0", + "objc2 0.6.2", + "objc2-foundation 0.3.1", "url", "web-sys", ] [[package]] name = "webpki-roots" -version = "0.26.8" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" +checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" dependencies = [ "rustls-pki-types", ] [[package]] name = "weezl" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" +checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" [[package]] name = "wgpu" -version = "24.0.3" +version = "24.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35904fb00ba2d2e0a4d002fcbbb6e1b89b574d272a50e5fc95f6e81cf281c245" +checksum = "6b0b3436f0729f6cdf2e6e9201f3d39dc95813fad61d826c1ed07918b4539353" dependencies = [ "arrayvec", - "bitflags 2.9.0", + "bitflags 2.9.4", "cfg_aliases", "document-features", "js-sys", @@ -8073,13 +8144,13 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "24.0.2" +version = "24.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671c25545d479b47d3f0a8e373aceb2060b67c6eb841b24ac8c32348151c7a0c" +checksum = "7f0aa306497a238d169b9dc70659105b4a096859a34894544ca81719242e1499" dependencies = [ "arrayvec", "bit-vec 0.8.0", - "bitflags 2.9.0", + "bitflags 2.9.4", "cfg_aliases", "document-features", "indexmap", @@ -8091,22 +8162,22 @@ dependencies = [ "raw-window-handle", "rustc-hash 1.1.0", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.16", "wgpu-hal", "wgpu-types", ] [[package]] name = "wgpu-hal" -version = "24.0.2" +version = "24.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4317a17171dc20e6577bf606796794580accae0716a69edbc7388c86a3ec9f23" +checksum = "f112f464674ca69f3533248508ee30cb84c67cf06c25ff6800685f5e0294e259" dependencies = [ "android_system_properties", "arrayvec", "ash", "bit-set 0.8.0", - "bitflags 2.9.0", + "bitflags 2.9.4", "block", "bytemuck", "cfg_aliases", @@ -8134,12 +8205,12 @@ dependencies = [ "renderdoc-sys", "rustc-hash 1.1.0", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.16", "wasm-bindgen", "web-sys", "wgpu-types", - "windows", - "windows-core", + "windows 0.58.0", + "windows-core 0.58.0", ] [[package]] @@ -8148,7 +8219,7 @@ version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50ac044c0e76c03a0378e7786ac505d010a873665e2d51383dcff8dd227dc69c" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "js-sys", "log", "serde", @@ -8173,11 +8244,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "0978bf7171b3d90bac376700cb56d606feb40f251a475a5d6634613564460b22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -8192,23 +8263,69 @@ version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ - "windows-core", + "windows-core 0.58.0", "windows-targets 0.52.6", ] +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + [[package]] name = "windows-core" version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" dependencies = [ - "windows-implement", - "windows-interface", + "windows-implement 0.58.0", + "windows-interface 0.58.0", "windows-result 0.2.0", "windows-strings 0.1.0", "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement 0.60.0", + "windows-interface 0.59.1", + "windows-link", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link", + "windows-threading", +] + [[package]] name = "windows-implement" version = "0.58.0" @@ -8220,6 +8337,17 @@ dependencies = [ "syn", ] +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-interface" version = "0.58.0" @@ -8231,21 +8359,42 @@ dependencies = [ "syn", ] +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "windows-link" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link", +] [[package]] name = "windows-registry" -version = "0.4.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" dependencies = [ - "windows-result 0.3.2", - "windows-strings 0.3.1", - "windows-targets 0.53.0", + "windows-link", + "windows-result 0.3.4", + "windows-strings 0.4.2", ] [[package]] @@ -8259,9 +8408,9 @@ dependencies = [ [[package]] name = "windows-result" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ "windows-link", ] @@ -8278,9 +8427,9 @@ dependencies = [ [[package]] name = "windows-strings" -version = "0.3.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ "windows-link", ] @@ -8296,29 +8445,29 @@ dependencies = [ [[package]] name = "windows-sys" -version = "0.48.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] name = "windows-sys" -version = "0.52.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ "windows-targets 0.52.6", ] [[package]] name = "windows-sys" -version = "0.59.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.52.6", + "windows-targets 0.53.3", ] [[package]] @@ -8336,21 +8485,6 @@ dependencies = [ "windows_x86_64_msvc 0.42.2", ] -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - [[package]] name = "windows-targets" version = "0.52.6" @@ -8369,10 +8503,11 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.0" +version = "0.53.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ + "windows-link", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -8384,16 +8519,19 @@ dependencies = [ ] [[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" +name = "windows-threading" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link", +] [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.5" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" [[package]] name = "windows_aarch64_gnullvm" @@ -8413,12 +8551,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" @@ -8437,12 +8569,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -8473,12 +8599,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - [[package]] name = "windows_i686_msvc" version = "0.52.6" @@ -8497,12 +8617,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" @@ -8521,12 +8635,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" @@ -8545,12 +8653,6 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -8565,14 +8667,14 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winit" -version = "0.30.9" +version = "0.30.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a809eacf18c8eca8b6635091543f02a5a06ddf3dad846398795460e6e0ae3cc0" +checksum = "c66d4b9ed69c4009f6321f762d6e61ad8a2389cd431b97cb1e146812e9e6c732" dependencies = [ "ahash", "android-activity", "atomic-waker", - "bitflags 2.9.0", + "bitflags 2.9.4", "block2", "bytemuck", "calloop", @@ -8587,7 +8689,7 @@ dependencies = [ "memmap2", "ndk", "objc2 0.5.2", - "objc2-app-kit", + "objc2-app-kit 0.2.2", "objc2-foundation 0.2.2", "objc2-ui-kit", "orbclient", @@ -8626,33 +8728,24 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.4" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" dependencies = [ "memchr", ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.9.0", -] - -[[package]] -name = "write16" -version = "1.0.0" +name = "wit-bindgen" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" +checksum = "052283831dbae3d879dc7f51f3d92703a316ca49f91540417d38591826127814" [[package]] name = "writeable" -version = "0.5.5" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "wyz" @@ -8676,40 +8769,40 @@ dependencies = [ [[package]] name = "x11rb" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" +checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" dependencies = [ "as-raw-xcb-connection", "gethostname", "libc", "libloading", "once_cell", - "rustix 0.38.44", + "rustix 1.0.8", "x11rb-protocol", ] [[package]] name = "x11rb-protocol" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" +checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" [[package]] name = "xattr" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d65cbf2f12c15564212d48f4e3dfb87923d25d611f2aed18f4cb23f0413d89e" +checksum = "af3a19837351dc82ba89f8a125e22a3c475f05aba604acc023d62b2739ae2909" dependencies = [ "libc", - "rustix 1.0.3", + "rustix 1.0.8", ] [[package]] name = "xcursor" -version = "0.3.8" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" +checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" [[package]] name = "xdg-home" @@ -8727,7 +8820,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.4", "dlib", "log", "once_cell", @@ -8742,9 +8835,9 @@ checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" [[package]] name = "xml-rs" -version = "0.8.25" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" +checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" [[package]] name = "yaml-rust" @@ -8763,9 +8856,9 @@ checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" [[package]] name = "yoke" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" dependencies = [ "serde", "stable_deref_trait", @@ -8775,9 +8868,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.7.5" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", @@ -8802,7 +8895,7 @@ dependencies = [ "async-trait", "blocking", "enumflags2", - "event-listener 5.4.0", + "event-listener 5.4.1", "futures-core", "futures-sink", "futures-util", @@ -8886,38 +8979,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "zerocopy-derive 0.7.35", -] - -[[package]] -name = "zerocopy" -version = "0.8.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" -dependencies = [ - "zerocopy-derive 0.8.24", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" dependencies = [ - "proc-macro2", - "quote", - "syn", + "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.24" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", @@ -8951,11 +9024,22 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + [[package]] name = "zerovec" -version = "0.10.4" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ "yoke", "zerofrom", @@ -8964,9 +9048,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index a0e018cd..03de2b95 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -99,7 +99,11 @@ quote = '1.0.39' rand = "0.9.1" rayon = '1.10.0' rkyv = '0.8.8' -rustls = { version = '0.23.31', default-features = false, features = ['logging', 'std', 'tls12'] } +rustls = { version = '0.23.31', default-features = false, features = [ + 'logging', + 'std', + 'tls12', +] } rustls-pki-types = '1.12.0' rustls-webpki = '0.103.4' serde = '1.0.217' @@ -115,7 +119,10 @@ thread_local = '1.1.8' tikv-jemallocator = '0.6.0' time = '0.3.41' tokio = '1.45.0' -tokio-rustls = { version = '0.26.2', default-features = false, features = ['logging', 'tls12'] } +tokio-rustls = { version = '0.26.2', default-features = false, features = [ + 'logging', + 'tls12', +] } toml = '0.8.14' tracing-appender = '0.2.3' uuid = '1.16.0' @@ -143,7 +150,16 @@ features = ['derive'] version = '4.5.38' [workspace.dependencies.derive_more] -features = ['display', 'from', 'into', 'deref', 'deref_mut', 'debug', 'constructor', 'add'] +features = [ + 'display', + 'from', + 'into', + 'deref', + 'deref_mut', + 'debug', + 'constructor', + 'add', +] version = "2.0.1" [workspace.dependencies.divan] @@ -230,11 +246,9 @@ version = '0.12.12' path = 'crates/hyperion-respawn' [workspace.dependencies.roaring] -features = ['simd'] version = '0.10.12' [workspace.dependencies.rustc-hash] -features = ['nightly'] version = '2.0.0' [workspace.dependencies.sha2] diff --git a/clippy.toml b/clippy.toml index f6814e08..9964af6a 100644 --- a/clippy.toml +++ b/clippy.toml @@ -3,3 +3,4 @@ cognitive-complexity-threshold = 200 excessive-nesting-threshold = 7 too-many-lines-threshold = 200 +msrv = "1.89.0" diff --git a/crates/bvh-region/src/lib.rs b/crates/bvh-region/src/lib.rs index 94599431..92eee7a1 100644 --- a/crates/bvh-region/src/lib.rs +++ b/crates/bvh-region/src/lib.rs @@ -1,6 +1,3 @@ -#![feature(portable_simd)] -#![feature(gen_blocks)] -#![feature(coroutines)] #![allow(clippy::redundant_pub_crate, clippy::pedantic)] // https://www.haroldserrano.com/blog/visualizing-the-boundary-volume-hierarchy-collision-algorithm diff --git a/crates/hyperion/Cargo.toml b/crates/hyperion/Cargo.toml index da02210c..d8d63468 100644 --- a/crates/hyperion/Cargo.toml +++ b/crates/hyperion/Cargo.toml @@ -48,7 +48,7 @@ paste = { workspace = true } rayon = { workspace = true } reqwest = { workspace = true } rkyv = { workspace = true } -roaring = { workspace = true, features = ["simd"] } +roaring = { workspace = true } rustc-hash = { workspace = true } rustls = { workspace = true } rustls-pki-types = { workspace = true } diff --git a/crates/simd-utils/Cargo.toml b/crates/simd-utils/Cargo.toml index 271cadcc..03c944b7 100644 --- a/crates/simd-utils/Cargo.toml +++ b/crates/simd-utils/Cargo.toml @@ -6,6 +6,10 @@ authors = ["Andrew Gazelka "] readme = "README.md" publish = false +[features] +default = [] +nightly = [] + [dependencies] [dev-dependencies] diff --git a/crates/simd-utils/src/lib.rs b/crates/simd-utils/src/lib.rs index 99da38c6..e7d899b6 100644 --- a/crates/simd-utils/src/lib.rs +++ b/crates/simd-utils/src/lib.rs @@ -1,16 +1,22 @@ -#![feature(portable_simd)] -#![feature(trusted_len)] -#![feature(slice_as_chunks)] -#![feature(pointer_is_aligned_to)] +#![cfg_attr(feature = "nightly", feature(portable_simd))] +#![cfg_attr(feature = "nightly", feature(trusted_len))] +#![cfg_attr(feature = "nightly", feature(pointer_is_aligned_to))] +#[cfg(feature = "nightly")] use core::simd; +#[cfg(feature = "nightly")] use std::{ iter::zip, simd::{LaneCount, Mask, MaskElement, Simd, SupportedLaneCount, cmp::SimdPartialEq}, }; +#[cfg(not(feature = "nightly"))] +use std::iter::zip; + +#[cfg(feature = "nightly")] use crate::one_bit_positions::OneBitPositionsExt; +#[cfg(feature = "nightly")] mod one_bit_positions; /// Efficiently compares two slices and copies `current` into `prev`, calling `on_diff` for each difference found. @@ -43,6 +49,7 @@ mod one_bit_positions; /// - `prev` and `current` must have the same length /// - Type `T` must support SIMD operations and comparisons /// - SIMD alignment must not exceed 64 bytes +#[cfg(feature = "nightly")] pub fn copy_and_get_diff( prev: &mut [T], current: &[T], @@ -151,8 +158,21 @@ pub fn copy_and_get_diff( } } +/// Fallback implementation for stable Rust (non-SIMD) +#[cfg(not(feature = "nightly"))] +pub fn copy_and_get_diff( + prev: &mut [T], + current: &[T], + on_diff: impl FnMut(usize, &T, &T), +) where + T: Copy + PartialEq + std::fmt::Debug, +{ + copy_and_get_diff_scalar(0, prev, current, on_diff); +} + /// Scalar (non-SIMD) implementation of [`copy_and_get_diff`] for handling small sections /// or remainders that can't be processed with SIMD. + fn copy_and_get_diff_scalar( start_idx: usize, prev: &mut [T], diff --git a/rust-toolchain.toml b/rust-toolchain.toml index abeea7ec..edc4de49 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] -channel = "nightly-2025-02-22" +channel = "1.89.0" components = ["rustfmt", "clippy"] profile = "minimal" From 5acfbdc57410169de3f87783468719fdc13b85e6 Mon Sep 17 00:00:00 2001 From: Andrew Gazelka Date: Tue, 2 Sep 2025 17:57:23 -0700 Subject: [PATCH 2/9] update --- .cursor/rules/general.mdc | 7 + Cargo.lock | 2099 +---------------- Cargo.toml | 44 +- crates/bvh-region/src/query/ray.rs | 51 +- crates/bvh-region/tests/simple.rs | 11 +- crates/geometry/src/aabb.rs | 12 +- crates/hyperion-clap-macros/src/lib.rs | 9 +- crates/hyperion-command/src/lib.rs | 2 - crates/hyperion-command/src/system.rs | 9 +- crates/hyperion-inventory/src/lib.rs | 27 +- crates/hyperion-item/src/builder/book.rs | 1 + crates/hyperion-palette/Cargo.toml | 4 + crates/hyperion-palette/src/indirect.rs | 13 + crates/hyperion-palette/src/lib.rs | 2 +- crates/hyperion-proxy/Cargo.toml | 2 +- crates/hyperion-proxy/src/cache.rs | 104 +- crates/hyperion-proxy/src/egress.rs | 8 +- crates/hyperion-proxy/src/lib.rs | 12 +- crates/hyperion-stats/Cargo.toml | 4 + crates/hyperion-stats/src/lib.rs | 20 +- crates/hyperion-utils/src/cached_save.rs | 5 +- crates/hyperion/Cargo.toml | 4 + crates/hyperion/src/common/config.rs | 1 + crates/hyperion/src/common/util/mojang.rs | 2 +- crates/hyperion/src/egress/stats.rs | 1 - crates/hyperion/src/ingress/mod.rs | 5 +- crates/hyperion/src/lib.rs | 75 +- crates/hyperion/src/net/encoder/util.rs | 11 + crates/hyperion/src/net/proxy.rs | 15 +- .../hyperion/src/simulation/blocks/manager.rs | 4 +- crates/hyperion/src/simulation/blocks/mod.rs | 9 +- crates/hyperion/src/simulation/handlers.rs | 12 +- .../hyperion/src/simulation/metadata/mod.rs | 12 +- crates/hyperion/src/simulation/packet.rs | 1 + crates/hyperion/src/storage/buf.rs | 6 +- crates/hyperion/tests/collision.rs | 1 - crates/hyperion/tests/spatial.rs | 5 +- crates/packet-channel/Cargo.toml | 8 +- crates/packet-channel/src/lib.rs | 34 +- crates/simd-utils/src/lib.rs | 59 +- events/bedwars/src/lib.rs | 5 - events/bedwars/src/plugin/block.rs | 2 +- events/bedwars/src/plugin/regeneration.rs | 2 +- events/bedwars/src/plugin/spawn.rs | 4 +- tools/packet-inspector/Cargo.toml | 42 - tools/packet-inspector/README.md | 66 - tools/packet-inspector/build.rs | 217 -- tools/packet-inspector/extracted/packets.json | 1052 --------- tools/packet-inspector/src/app.rs | 197 -- tools/packet-inspector/src/app/connection.rs | 44 - tools/packet-inspector/src/app/filter.rs | 152 -- tools/packet-inspector/src/app/hex_viewer.rs | 72 - tools/packet-inspector/src/app/packet_list.rs | 279 --- tools/packet-inspector/src/app/text_viewer.rs | 378 --- tools/packet-inspector/src/lib.rs | 325 --- tools/packet-inspector/src/main.rs | 32 - tools/packet-inspector/src/main_cli.rs | 86 - tools/packet-inspector/src/packet_io.rs | 200 -- tools/packet-inspector/src/packet_registry.rs | 116 - tools/packet-inspector/src/shared_state.rs | 134 -- tools/packet-inspector/src/tri_checkbox.rs | 137 -- tools/rust-mc-bot/src/packet_utils.rs | 6 +- 62 files changed, 476 insertions(+), 5783 deletions(-) create mode 100644 .cursor/rules/general.mdc delete mode 100644 tools/packet-inspector/Cargo.toml delete mode 100644 tools/packet-inspector/README.md delete mode 100644 tools/packet-inspector/build.rs delete mode 100644 tools/packet-inspector/extracted/packets.json delete mode 100644 tools/packet-inspector/src/app.rs delete mode 100644 tools/packet-inspector/src/app/connection.rs delete mode 100644 tools/packet-inspector/src/app/filter.rs delete mode 100644 tools/packet-inspector/src/app/hex_viewer.rs delete mode 100644 tools/packet-inspector/src/app/packet_list.rs delete mode 100644 tools/packet-inspector/src/app/text_viewer.rs delete mode 100644 tools/packet-inspector/src/lib.rs delete mode 100644 tools/packet-inspector/src/main.rs delete mode 100644 tools/packet-inspector/src/main_cli.rs delete mode 100644 tools/packet-inspector/src/packet_io.rs delete mode 100644 tools/packet-inspector/src/packet_registry.rs delete mode 100644 tools/packet-inspector/src/shared_state.rs delete mode 100644 tools/packet-inspector/src/tri_checkbox.rs diff --git a/.cursor/rules/general.mdc b/.cursor/rules/general.mdc new file mode 100644 index 00000000..ae0d2f4a --- /dev/null +++ b/.cursor/rules/general.mdc @@ -0,0 +1,7 @@ +--- +description: +globs: +alwaysApply: true +--- + +latest msrv is 1.89.0 \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index e5bebd95..2de560ac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12,124 +12,12 @@ dependencies = [ "regex", ] -[[package]] -name = "ab_glyph" -version = "0.2.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e074464580a518d16a7126262fffaaa47af89d4099d4cb403f8ed938ba12ee7d" -dependencies = [ - "ab_glyph_rasterizer", - "owned_ttf_parser", -] - -[[package]] -name = "ab_glyph_rasterizer" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" - -[[package]] -name = "accesskit" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3d3b8f9bae46a948369bc4a03e815d4ed6d616bd00de4051133a5019dc31c5a" -dependencies = [ - "enumn", - "serde", -] - [[package]] name = "accesskit" version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "becf0eb5215b6ecb0a739c31c21bd83c4f326524c9b46b7e882d77559b60a529" -[[package]] -name = "accesskit_atspi_common" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c5dd55e6e94949498698daf4d48fb5659e824d7abec0d394089656ceaf99d4f" -dependencies = [ - "accesskit 0.17.1", - "accesskit_consumer", - "atspi-common", - "serde", - "thiserror 1.0.69", - "zvariant", -] - -[[package]] -name = "accesskit_consumer" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f47983a1084940ba9a39c077a8c63e55c619388be5476ac04c804cfbd1e63459" -dependencies = [ - "accesskit 0.17.1", - "hashbrown 0.15.5", - "immutable-chunkmap", -] - -[[package]] -name = "accesskit_macos" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7329821f3bd1101e03a7d2e03bd339e3ac0dc64c70b4c9f9ae1949e3ba8dece1" -dependencies = [ - "accesskit 0.17.1", - "accesskit_consumer", - "hashbrown 0.15.5", - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "accesskit_unix" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcee751cc20d88678c33edaf9c07e8b693cd02819fe89053776f5313492273f5" -dependencies = [ - "accesskit 0.17.1", - "accesskit_atspi_common", - "async-channel 2.5.0", - "async-executor", - "async-task", - "atspi", - "futures-lite 2.6.1", - "futures-util", - "serde", - "zbus", -] - -[[package]] -name = "accesskit_windows" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24fcd5d23d70670992b823e735e859374d694a3d12bfd8dd32bd3bd8bedb5d81" -dependencies = [ - "accesskit 0.17.1", - "accesskit_consumer", - "hashbrown 0.15.5", - "paste", - "static_assertions", - "windows 0.58.0", - "windows-core 0.58.0", -] - -[[package]] -name = "accesskit_winit" -version = "0.23.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6a48dad5530b6deb9fc7a52cc6c3bf72cdd9eb8157ac9d32d69f2427a5e879" -dependencies = [ - "accesskit 0.17.1", - "accesskit_macos", - "accesskit_unix", - "accesskit_windows", - "raw-window-handle", - "winit", -] - [[package]] name = "addr2line" version = "0.24.2" @@ -154,7 +42,6 @@ dependencies = [ "cfg-if", "getrandom 0.3.3", "once_cell", - "serde", "version_check", "zerocopy", ] @@ -308,26 +195,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "arboard" -version = "3.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf" -dependencies = [ - "clipboard-win", - "image 0.25.6", - "log", - "objc2 0.6.2", - "objc2-app-kit 0.3.1", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-foundation 0.3.1", - "parking_lot", - "percent-encoding", - "windows-sys 0.60.2", - "x11rb", -] - [[package]] name = "arc-swap" version = "1.7.1" @@ -346,12 +213,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -[[package]] -name = "as-raw-xcb-connection" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" - [[package]] name = "ash" version = "0.38.0+1.3.281" @@ -432,24 +293,6 @@ dependencies = [ "futures-lite 2.6.1", ] -[[package]] -name = "async-io" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19634d6336019ef220f09fd31168ce5c184b295cbf80345437cc36094ef223ca" -dependencies = [ - "async-lock", - "cfg-if", - "concurrent-queue", - "futures-io", - "futures-lite 2.6.1", - "parking", - "polling", - "rustix 1.0.8", - "slab", - "windows-sys 0.60.2", -] - [[package]] name = "async-lock" version = "3.4.1" @@ -461,53 +304,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "async-process" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65daa13722ad51e6ab1a1b9c01299142bc75135b337923cfa10e79bbbd669f00" -dependencies = [ - "async-channel 2.5.0", - "async-io", - "async-lock", - "async-signal", - "async-task", - "blocking", - "cfg-if", - "event-listener 5.4.1", - "futures-lite 2.6.1", - "rustix 1.0.8", -] - -[[package]] -name = "async-recursion" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "async-signal" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f567af260ef69e1d52c2b560ce0ea230763e6fbb9214a85d768760a920e3e3c1" -dependencies = [ - "async-io", - "async-lock", - "atomic-waker", - "cfg-if", - "futures-core", - "futures-io", - "rustix 1.0.8", - "signal-hook-registry", - "slab", - "windows-sys 0.60.2", -] - [[package]] name = "async-task" version = "4.7.1" @@ -517,17 +313,6 @@ dependencies = [ "portable-atomic", ] -[[package]] -name = "async-trait" -version = "0.1.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "atomic-waker" version = "1.1.2" @@ -547,57 +332,6 @@ dependencies = [ "portable-atomic-util", ] -[[package]] -name = "atspi" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be534b16650e35237bb1ed189ba2aab86ce65e88cc84c66f4935ba38575cecbf" -dependencies = [ - "atspi-common", - "atspi-connection", - "atspi-proxies", -] - -[[package]] -name = "atspi-common" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1909ed2dc01d0a17505d89311d192518507e8a056a48148e3598fef5e7bb6ba7" -dependencies = [ - "enumflags2", - "serde", - "static_assertions", - "zbus", - "zbus-lockstep", - "zbus-lockstep-macros", - "zbus_names", - "zvariant", -] - -[[package]] -name = "atspi-connection" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "430c5960624a4baaa511c9c0fcc2218e3b58f5dbcc47e6190cafee344b873333" -dependencies = [ - "atspi-common", - "atspi-proxies", - "futures-lite 2.6.1", - "zbus", -] - -[[package]] -name = "atspi-proxies" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e6c5de3e524cf967569722446bcd458d5032348554d9a17d7d72b041ab7496" -dependencies = [ - "atspi-common", - "serde", - "zbus", - "zvariant", -] - [[package]] name = "autocfg" version = "1.5.0" @@ -644,7 +378,7 @@ dependencies = [ "envy", "fastrand 2.3.0", "geometry", - "glam 0.29.3", + "glam", "hyperion", "hyperion-clap", "hyperion-genmap", @@ -666,9 +400,9 @@ dependencies = [ "tracing-subscriber", "uuid", "valence_bytes", - "valence_protocol 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", + "valence_protocol", "valence_server", - "valence_text 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", + "valence_text", ] [[package]] @@ -686,7 +420,7 @@ version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed3561712cf49074d89e9989bfc2e6c6add5d33288f689db9a0c333300d2d004" dependencies = [ - "accesskit 0.18.0", + "accesskit", "bevy_app 0.16.1", "bevy_derive 0.16.1", "bevy_ecs 0.16.1", @@ -1059,7 +793,7 @@ dependencies = [ "approx", "bevy_reflect", "derive_more 1.0.0", - "glam 0.29.3", + "glam", "itertools 0.14.0", "libm", "rand 0.8.5", @@ -1101,7 +835,7 @@ version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bb60c753b968a2de0fd279b76a3d19517695e771edb4c23575c7f92156315de" dependencies = [ - "glam 0.29.3", + "glam", ] [[package]] @@ -1150,7 +884,7 @@ dependencies = [ "downcast-rs 2.0.2", "erased-serde", "foldhash", - "glam 0.29.3", + "glam", "serde", "smallvec", "smol_str", @@ -1528,15 +1262,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "block2" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" -dependencies = [ - "objc2 0.5.2", -] - [[package]] name = "blocking" version = "1.6.2" @@ -1562,19 +1287,6 @@ version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" -[[package]] -name = "bvh" -version = "0.1.0" -source = "git+https://github.com/TestingPlant/bvh-data#9bffb03a4b894a7884c9ec0da986bdde732ac704" -dependencies = [ - "arrayvec", - "bytes", - "fast_hilbert", - "glam 0.29.3", - "heapless", - "more-asserts", -] - [[package]] name = "bvh-region" version = "0.1.0" @@ -1585,7 +1297,7 @@ dependencies = [ "derive_more 2.0.1", "fastrand 2.3.0", "geometry", - "glam 0.29.3", + "glam", "num-traits", "ordered-float 5.0.0", "plotters", @@ -1657,32 +1369,6 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" -[[package]] -name = "calloop" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" -dependencies = [ - "bitflags 2.9.4", - "log", - "polling", - "rustix 0.38.44", - "slab", - "thiserror 1.0.69", -] - -[[package]] -name = "calloop-wayland-source" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" -dependencies = [ - "calloop", - "rustix 0.38.44", - "wayland-backend", - "wayland-client", -] - [[package]] name = "cast" version = "0.3.0" @@ -1746,15 +1432,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" -[[package]] -name = "cgl" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" -dependencies = [ - "libc", -] - [[package]] name = "ciborium" version = "0.2.2" @@ -1834,15 +1511,6 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" -[[package]] -name = "clipboard-win" -version = "5.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" -dependencies = [ - "error-code", -] - [[package]] name = "cmake" version = "0.1.54" @@ -1988,35 +1656,12 @@ dependencies = [ "libc", ] -[[package]] -name = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "core-foundation-sys" version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" -[[package]] -name = "core-graphics" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "core-graphics-types", - "foreign-types 0.5.0", - "libc", -] - [[package]] name = "core-graphics-types" version = "0.1.3" @@ -2024,7 +1669,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ "bitflags 1.3.2", - "core-foundation 0.9.4", + "core-foundation", "libc", ] @@ -2153,16 +1798,10 @@ version = "3.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46f93780a459b7d656ef7f071fe699c4d3d2cb201c4b24d085b6ddc505276e73" dependencies = [ - "nix 0.30.1", + "nix", "windows-sys 0.59.0", ] -[[package]] -name = "cursor-icon" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" - [[package]] name = "darling" version = "0.21.3" @@ -2297,22 +1936,6 @@ dependencies = [ "windows-sys 0.60.2", ] -[[package]] -name = "dispatch" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" - -[[package]] -name = "dispatch2" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" -dependencies = [ - "bitflags 2.9.4", - "objc2 0.6.2", -] - [[package]] name = "displaydoc" version = "0.2.5" @@ -2353,15 +1976,6 @@ dependencies = [ "syn", ] -[[package]] -name = "dlib" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" -dependencies = [ - "libloading", -] - [[package]] name = "document-features" version = "0.2.11" @@ -2399,188 +2013,20 @@ dependencies = [ ] [[package]] -name = "dpi" -version = "0.1.2" +name = "either" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] -name = "duplicate" -version = "2.0.0" +name = "encase" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97af9b5f014e228b33e77d75ee0e6e87960124f0f4b16337b586a6bec91867b1" -dependencies = [ - "heck", - "proc-macro2", - "proc-macro2-diagnostics", -] - -[[package]] -name = "ecolor" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc4feb366740ded31a004a0e4452fbf84e80ef432ecf8314c485210229672fd1" -dependencies = [ - "bytemuck", - "emath", - "serde", -] - -[[package]] -name = "eframe" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0dfe0859f3fb1bc6424c57d41e10e9093fe938f426b691e42272c2f336d915c" -dependencies = [ - "ahash", - "bytemuck", - "document-features", - "egui", - "egui-wgpu", - "egui-winit", - "egui_glow", - "glow", - "glutin", - "glutin-winit", - "home", - "image 0.25.6", - "js-sys", - "log", - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", - "parking_lot", - "percent-encoding", - "pollster", - "profiling", - "raw-window-handle", - "ron", - "serde", - "static_assertions", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "web-time", - "wgpu", - "winapi", - "windows-sys 0.59.0", - "winit", -] - -[[package]] -name = "egui" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd34cec49ab55d85ebf70139cb1ccd29c977ef6b6ba4fe85489d6877ee9ef3" -dependencies = [ - "accesskit 0.17.1", - "ahash", - "bitflags 2.9.4", - "emath", - "epaint", - "log", - "nohash-hasher", - "profiling", - "ron", - "serde", -] - -[[package]] -name = "egui-wgpu" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d319dfef570f699b6e9114e235e862a2ddcf75f0d1a061de9e1328d92146d820" -dependencies = [ - "ahash", - "bytemuck", - "document-features", - "egui", - "epaint", - "log", - "profiling", - "thiserror 1.0.69", - "type-map", - "web-time", - "wgpu", - "winit", -] - -[[package]] -name = "egui-winit" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d9dfbb78fe4eb9c3a39ad528b90ee5915c252e77bbab9d4ebc576541ab67e13" -dependencies = [ - "accesskit_winit", - "ahash", - "arboard", - "bytemuck", - "egui", - "log", - "profiling", - "raw-window-handle", - "serde", - "smithay-clipboard", - "web-time", - "webbrowser", - "winit", -] - -[[package]] -name = "egui_dock" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea7536fb0243aea55c1ca123a41a18253e16520d427a7213da584b9e2cb3973" -dependencies = [ - "duplicate", - "egui", - "paste", - "serde", -] - -[[package]] -name = "egui_glow" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "910906e3f042ea6d2378ec12a6fd07698e14ddae68aed2d819ffe944a73aab9e" -dependencies = [ - "ahash", - "bytemuck", - "egui", - "glow", - "log", - "memoffset", - "profiling", - "wasm-bindgen", - "web-sys", - "winit", -] - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - -[[package]] -name = "emath" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e4cadcff7a5353ba72b7fea76bf2122b5ebdbc68e8155aa56dfdea90083fe1b" -dependencies = [ - "bytemuck", - "serde", -] - -[[package]] -name = "encase" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0a05902cf601ed11d564128448097b98ebe3c6574bd7b6a653a3d56d54aa020" +checksum = "b0a05902cf601ed11d564128448097b98ebe3c6574bd7b6a653a3d56d54aa020" dependencies = [ "const_panic", "encase_derive", - "glam 0.29.3", + "glam", "thiserror 1.0.69", ] @@ -2613,44 +2059,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "endi" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" - -[[package]] -name = "enumflags2" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" -dependencies = [ - "enumflags2_derive", - "serde", -] - -[[package]] -name = "enumflags2_derive" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "enumn" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "enumset" version = "1.1.10" @@ -2681,31 +2089,6 @@ dependencies = [ "serde", ] -[[package]] -name = "epaint" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fcc0f5a7c613afd2dee5e4b30c3e6acafb8ad6f0edb06068811f708a67c562" -dependencies = [ - "ab_glyph", - "ahash", - "bytemuck", - "ecolor", - "emath", - "epaint_default_fonts", - "log", - "nohash-hasher", - "parking_lot", - "profiling", - "serde", -] - -[[package]] -name = "epaint_default_fonts" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7e7a64c02cf7a5b51e745a9e45f60660a286f151c238b9d397b3e923f5082f" - [[package]] name = "equator" version = "0.4.2" @@ -2752,12 +2135,6 @@ dependencies = [ "windows-sys 0.60.2", ] -[[package]] -name = "error-code" -version = "3.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" - [[package]] name = "euclid" version = "0.22.11" @@ -2794,22 +2171,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "fancy-regex" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2" -dependencies = [ - "bit-set 0.5.3", - "regex", -] - -[[package]] -name = "fast_hilbert" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3faa84f4bea4fba03e05500ec1fad62efe4a07632100f1cbef165bb22dcb77fc" - [[package]] name = "fastrand" version = "1.9.0" @@ -2875,18 +2236,6 @@ dependencies = [ "miniz_oxide", ] -[[package]] -name = "flume" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" -dependencies = [ - "futures-core", - "futures-sink", - "nanorand", - "spin", -] - [[package]] name = "fnv" version = "1.0.7" @@ -3102,7 +2451,7 @@ name = "geometry" version = "0.1.0" dependencies = [ "approx", - "glam 0.29.3", + "glam", "itertools 0.14.0", "ordered-float 5.0.0", "rand 0.9.2", @@ -3110,16 +2459,6 @@ dependencies = [ "tango-bench", ] -[[package]] -name = "gethostname" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc257fdb4038301ce4b9cd1b3b51704509692bb3ff716a410cbd07925d9dae55" -dependencies = [ - "rustix 1.0.8", - "windows-targets 0.52.6", -] - [[package]] name = "getrandom" version = "0.2.16" @@ -3186,12 +2525,6 @@ dependencies = [ "serde", ] -[[package]] -name = "glam" -version = "0.30.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d1aab06663bdce00d6ca5e5ed586ec8d18033a771906c993a1e3755b368d85" - [[package]] name = "glob" version = "0.3.3" @@ -3216,63 +2549,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "glutin" -version = "0.32.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12124de845cacfebedff80e877bb37b5b75c34c5a4c89e47e1cdd67fb6041325" -dependencies = [ - "bitflags 2.9.4", - "cfg_aliases", - "cgl", - "dispatch2", - "glutin_egl_sys", - "glutin_glx_sys", - "glutin_wgl_sys", - "libloading", - "objc2 0.6.2", - "objc2-app-kit 0.3.1", - "objc2-core-foundation", - "objc2-foundation 0.3.1", - "once_cell", - "raw-window-handle", - "wayland-sys", - "windows-sys 0.52.0", - "x11-dl", -] - -[[package]] -name = "glutin-winit" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85edca7075f8fc728f28cb8fbb111a96c3b89e930574369e3e9c27eb75d3788f" -dependencies = [ - "cfg_aliases", - "glutin", - "raw-window-handle", - "winit", -] - -[[package]] -name = "glutin_egl_sys" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c4680ba6195f424febdc3ba46e7a42a0e58743f2edb115297b86d7f8ecc02d2" -dependencies = [ - "gl_generator", - "windows-sys 0.52.0", -] - -[[package]] -name = "glutin_glx_sys" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7bb2938045a88b612499fbcba375a77198e01306f52272e692f8c1f3751185" -dependencies = [ - "gl_generator", - "x11-dl", -] - [[package]] name = "glutin_wgl_sys" version = "0.6.1" @@ -3489,7 +2765,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c9e718d32b6e6b2b32354e1b0367025efdd0b11d6a740b905ddf5db1074679" dependencies = [ "constgebra", - "glam 0.29.3", + "glam", "tinyvec", ] @@ -3499,15 +2775,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" -[[package]] -name = "home" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" -dependencies = [ - "windows-sys 0.59.0", -] - [[package]] name = "http" version = "1.3.1" @@ -3659,7 +2926,7 @@ dependencies = [ "fastrand 2.3.0", "flate2", "geometry", - "glam 0.29.3", + "glam", "heapless", "heed", "humantime", @@ -3710,13 +2977,13 @@ dependencies = [ "uuid", "valence_anvil", "valence_bytes", - "valence_generated 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", - "valence_ident 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", - "valence_nbt 0.8.0 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", - "valence_protocol 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", + "valence_generated", + "valence_ident", + "valence_nbt", + "valence_protocol", "valence_registry", "valence_server", - "valence_text 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", + "valence_text", ] [[package]] @@ -3732,7 +2999,7 @@ dependencies = [ "hyperion-utils", "tracing", "valence_bytes", - "valence_protocol 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", + "valence_protocol", ] [[package]] @@ -3764,7 +3031,7 @@ dependencies = [ "bevy", "derive-build", "slotmap", - "valence_protocol 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", + "valence_protocol", ] [[package]] @@ -3787,7 +3054,7 @@ dependencies = [ "hyperion-utils", "serde", "tracing", - "valence_protocol 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", + "valence_protocol", ] [[package]] @@ -3800,8 +3067,8 @@ dependencies = [ "roaring", "snafu", "tracing", - "valence_generated 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", - "valence_protocol 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", + "valence_generated", + "valence_protocol", ] [[package]] @@ -3815,7 +3082,7 @@ dependencies = [ "hyperion-inventory", "hyperion-utils", "tracing", - "valence_protocol 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", + "valence_protocol", ] [[package]] @@ -3840,7 +3107,7 @@ version = "0.1.0" dependencies = [ "anyhow", "roaring", - "valence_protocol 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", + "valence_protocol", ] [[package]] @@ -3862,7 +3129,7 @@ dependencies = [ name = "hyperion-proto" version = "0.1.0" dependencies = [ - "glam 0.29.3", + "glam", "rkyv", ] @@ -3872,13 +3139,12 @@ version = "0.1.0" dependencies = [ "anyhow", "arrayvec", - "bvh", "bytes", "clap", "colored", "dotenvy", "envy", - "glam 0.29.3", + "glam", "heapless", "hyperion-proto", "kanal", @@ -3931,7 +3197,7 @@ dependencies = [ "serde_json", "thiserror 2.0.16", "uuid", - "valence_protocol 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", + "valence_protocol", ] [[package]] @@ -3952,7 +3218,7 @@ dependencies = [ "tokio", "tokio-util", "tracing", - "valence_protocol 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", + "valence_protocol", ] [[package]] @@ -4091,17 +3357,6 @@ dependencies = [ "bytemuck", "byteorder-lite", "num-traits", - "png", - "tiff", -] - -[[package]] -name = "immutable-chunkmap" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2194c61e2a29841937e84ec2264a905985c397ccccfbd4783191d3285fa92ef" -dependencies = [ - "arrayvec", ] [[package]] @@ -4340,7 +3595,7 @@ checksum = "391290121bad3d37fbddad76d8f5d1c1c314cfc646d143d7e07a3086ddff0ce3" dependencies = [ "bitflags 2.9.4", "libc", - "redox_syscall 0.5.17", + "redox_syscall", ] [[package]] @@ -4353,18 +3608,6 @@ dependencies = [ "libc", ] -[[package]] -name = "linked-hash-map" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" - -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - [[package]] name = "linux-raw-sys" version = "0.9.4" @@ -4481,15 +3724,6 @@ dependencies = [ "libc", ] -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - [[package]] name = "metal" version = "0.31.0" @@ -4608,15 +3842,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "nanorand" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" -dependencies = [ - "getrandom 0.2.16", -] - [[package]] name = "native-tls" version = "0.2.14" @@ -4662,7 +3887,6 @@ dependencies = [ "log", "ndk-sys 0.6.0+11769913", "num_enum", - "raw-window-handle", "thiserror 1.0.69", ] @@ -4690,19 +3914,6 @@ dependencies = [ "jni-sys", ] -[[package]] -name = "nix" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" -dependencies = [ - "bitflags 2.9.4", - "cfg-if", - "cfg_aliases", - "libc", - "memoffset", -] - [[package]] name = "nix" version = "0.30.1" @@ -4715,12 +3926,6 @@ dependencies = [ "libc", ] -[[package]] -name = "nohash-hasher" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" - [[package]] name = "nom" version = "7.1.3" @@ -4823,15 +4028,6 @@ dependencies = [ "syn", ] -[[package]] -name = "num_threads" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" -dependencies = [ - "libc", -] - [[package]] name = "objc" version = "0.2.7" @@ -4841,277 +4037,6 @@ dependencies = [ "malloc_buf", ] -[[package]] -name = "objc-sys" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" - -[[package]] -name = "objc2" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" -dependencies = [ - "objc-sys", - "objc2-encode", -] - -[[package]] -name = "objc2" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561f357ba7f3a2a61563a186a163d0a3a5247e1089524a3981d49adb775078bc" -dependencies = [ - "objc2-encode", -] - -[[package]] -name = "objc2-app-kit" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" -dependencies = [ - "bitflags 2.9.4", - "block2", - "libc", - "objc2 0.5.2", - "objc2-core-data", - "objc2-core-image", - "objc2-foundation 0.2.2", - "objc2-quartz-core", -] - -[[package]] -name = "objc2-app-kit" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" -dependencies = [ - "bitflags 2.9.4", - "objc2 0.6.2", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-foundation 0.3.1", -] - -[[package]] -name = "objc2-cloud-kit" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" -dependencies = [ - "bitflags 2.9.4", - "block2", - "objc2 0.5.2", - "objc2-core-location", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-contacts" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" -dependencies = [ - "block2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-core-data" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" -dependencies = [ - "bitflags 2.9.4", - "block2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-core-foundation" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" -dependencies = [ - "bitflags 2.9.4", - "dispatch2", - "objc2 0.6.2", -] - -[[package]] -name = "objc2-core-graphics" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" -dependencies = [ - "bitflags 2.9.4", - "dispatch2", - "objc2 0.6.2", - "objc2-core-foundation", - "objc2-io-surface", -] - -[[package]] -name = "objc2-core-image" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" -dependencies = [ - "block2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", - "objc2-metal", -] - -[[package]] -name = "objc2-core-location" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" -dependencies = [ - "block2", - "objc2 0.5.2", - "objc2-contacts", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-encode" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" - -[[package]] -name = "objc2-foundation" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" -dependencies = [ - "bitflags 2.9.4", - "block2", - "dispatch", - "libc", - "objc2 0.5.2", -] - -[[package]] -name = "objc2-foundation" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" -dependencies = [ - "bitflags 2.9.4", - "objc2 0.6.2", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-io-surface" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" -dependencies = [ - "bitflags 2.9.4", - "objc2 0.6.2", - "objc2-core-foundation", -] - -[[package]] -name = "objc2-link-presentation" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" -dependencies = [ - "block2", - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-metal" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" -dependencies = [ - "bitflags 2.9.4", - "block2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-quartz-core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" -dependencies = [ - "bitflags 2.9.4", - "block2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", - "objc2-metal", -] - -[[package]] -name = "objc2-symbols" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" -dependencies = [ - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-ui-kit" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" -dependencies = [ - "bitflags 2.9.4", - "block2", - "objc2 0.5.2", - "objc2-cloud-kit", - "objc2-core-data", - "objc2-core-image", - "objc2-core-location", - "objc2-foundation 0.2.2", - "objc2-link-presentation", - "objc2-quartz-core", - "objc2-symbols", - "objc2-uniform-type-identifiers", - "objc2-user-notifications", -] - -[[package]] -name = "objc2-uniform-type-identifiers" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" -dependencies = [ - "block2", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-user-notifications" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" -dependencies = [ - "bitflags 2.9.4", - "block2", - "objc2 0.5.2", - "objc2-core-location", - "objc2-foundation 0.2.2", -] - [[package]] name = "object" version = "0.36.7" @@ -5199,15 +4124,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" -[[package]] -name = "orbclient" -version = "0.3.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" -dependencies = [ - "libredox", -] - [[package]] name = "ordered-float" version = "4.6.0" @@ -5226,25 +4142,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "ordered-stream" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" -dependencies = [ - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "owned_ttf_parser" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" -dependencies = [ - "ttf-parser", -] - [[package]] name = "packet-channel" version = "0.1.0" @@ -5254,32 +4151,7 @@ dependencies = [ "divan", "more-asserts", "proptest", - "valence_protocol 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", -] - -[[package]] -name = "packet-inspector" -version = "0.1.0" -dependencies = [ - "anyhow", - "bytes", - "eframe", - "egui", - "egui_dock", - "flate2", - "flume", - "itertools 0.14.0", - "proc-macro2", - "quote", - "serde", - "serde_json", - "syn", - "syntect", - "time", - "tokio", - "tracing", - "valence_build_utils 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-open)", - "valence_protocol 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-open)", + "valence_protocol", ] [[package]] @@ -5326,7 +4198,7 @@ checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.17", + "redox_syscall", "smallvec", "windows-targets 0.52.6", ] @@ -5450,19 +4322,6 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" -[[package]] -name = "plist" -version = "1.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3af6b589e163c5a788fab00ce0c0366f6efbb9959c2f9874b224936af7fce7e1" -dependencies = [ - "base64 0.22.1", - "indexmap", - "quick-xml 0.38.3", - "serde", - "time", -] - [[package]] name = "plotters" version = "0.3.7" @@ -5517,26 +4376,6 @@ dependencies = [ "miniz_oxide", ] -[[package]] -name = "polling" -version = "3.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5bd19146350fe804f7cb2669c851c03d69da628803dab0d98018142aaa5d829" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi", - "pin-project-lite", - "rustix 1.0.8", - "windows-sys 0.60.2", -] - -[[package]] -name = "pollster" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" - [[package]] name = "portable-atomic" version = "1.11.1" @@ -5619,19 +4458,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "proc-macro2-diagnostics" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "version_check", - "yansi", -] - [[package]] name = "profiling" version = "1.0.17" @@ -5684,34 +4510,6 @@ version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" -[[package]] -name = "quick-xml" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "quick-xml" -version = "0.37.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" -dependencies = [ - "memchr", -] - -[[package]] -name = "quick-xml" -version = "0.38.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42a232e7487fc2ef313d96dde7948e7a3c05101870d8985e4fd8d26aedd27b89" -dependencies = [ - "memchr", -] - [[package]] name = "quinn" version = "0.11.9" @@ -5919,15 +4717,6 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0d463f2884048e7153449a55166f91028d5b0ea53c79377099ce4e8cf0cf9bb" -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.5.17" @@ -6145,19 +4934,6 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags 2.9.4", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", -] - [[package]] name = "rustix" version = "1.0.8" @@ -6167,7 +4943,7 @@ dependencies = [ "bitflags 2.9.4", "errno", "libc", - "linux-raw-sys 0.9.4", + "linux-raw-sys", "windows-sys 0.60.2", ] @@ -6290,19 +5066,6 @@ dependencies = [ "syn", ] -[[package]] -name = "sctk-adwaita" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" -dependencies = [ - "ab_glyph", - "log", - "memmap2", - "smithay-client-toolkit", - "tiny-skia", -] - [[package]] name = "sdd" version = "3.0.10" @@ -6316,7 +5079,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ "bitflags 2.9.4", - "core-foundation 0.9.4", + "core-foundation", "core-foundation-sys", "libc", "security-framework-sys", @@ -6380,17 +5143,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_repr" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "serde_spanned" version = "0.6.9" @@ -6437,17 +5189,6 @@ dependencies = [ "syn", ] -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - [[package]] name = "sha2" version = "0.10.9" @@ -6530,42 +5271,6 @@ version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" -[[package]] -name = "smithay-client-toolkit" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" -dependencies = [ - "bitflags 2.9.4", - "calloop", - "calloop-wayland-source", - "cursor-icon", - "libc", - "log", - "memmap2", - "rustix 0.38.44", - "thiserror 1.0.69", - "wayland-backend", - "wayland-client", - "wayland-csd-frame", - "wayland-cursor", - "wayland-protocols", - "wayland-protocols-wlr", - "wayland-scanner", - "xkeysym", -] - -[[package]] -name = "smithay-clipboard" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc8216eec463674a0e90f29e0ae41a4db573ec5b56b1c6c1c71615d249b6d846" -dependencies = [ - "libc", - "smithay-client-toolkit", - "wayland-backend", -] - [[package]] name = "smol_str" version = "0.2.2" @@ -6612,7 +5317,6 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" dependencies = [ - "lock_api", "portable-atomic", ] @@ -6643,12 +5347,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "strict-num" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" - [[package]] name = "strsim" version = "0.11.1" @@ -6738,28 +5436,6 @@ dependencies = [ "syn", ] -[[package]] -name = "syntect" -version = "5.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "874dcfa363995604333cf947ae9f751ca3af4522c60886774c4963943b4746b1" -dependencies = [ - "bincode", - "bitflags 1.3.2", - "fancy-regex", - "flate2", - "fnv", - "once_cell", - "plist", - "regex-syntax", - "serde", - "serde_derive", - "serde_json", - "thiserror 1.0.69", - "walkdir", - "yaml-rust", -] - [[package]] name = "system-configuration" version = "0.6.1" @@ -6767,7 +5443,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ "bitflags 2.9.4", - "core-foundation 0.9.4", + "core-foundation", "system-configuration-sys", ] @@ -6828,7 +5504,7 @@ dependencies = [ "fastrand 2.3.0", "getrandom 0.3.3", "once_cell", - "rustix 1.0.8", + "rustix", "windows-sys 0.60.2", ] @@ -6847,7 +5523,7 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0" dependencies = [ - "rustix 1.0.8", + "rustix", "windows-sys 0.60.2", ] @@ -6900,17 +5576,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "tiff" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" -dependencies = [ - "flate2", - "jpeg-decoder", - "weezl", -] - [[package]] name = "tikv-jemalloc-sys" version = "0.6.0+5.3.0-1-ge13ca993e8ccb9ba9847cc330696e02839f328f7" @@ -6938,9 +5603,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ca967379f9d8eb8058d86ed467d81d03e81acd45757e4ca341c24affbe8e8e3" dependencies = [ "deranged", - "libc", "num-conv", - "num_threads", "powerfmt", "serde", "time-core", @@ -6963,31 +5626,6 @@ dependencies = [ "time-core", ] -[[package]] -name = "tiny-skia" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" -dependencies = [ - "arrayref", - "arrayvec", - "bytemuck", - "cfg-if", - "log", - "tiny-skia-path", -] - -[[package]] -name = "tiny-skia-path" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" -dependencies = [ - "arrayref", - "bytemuck", - "strict-num", -] - [[package]] name = "tinystr" version = "0.8.1" @@ -7327,21 +5965,6 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" -[[package]] -name = "ttf-parser" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" - -[[package]] -name = "type-map" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90" -dependencies = [ - "rustc-hash 2.1.1", -] - [[package]] name = "typeid" version = "1.0.3" @@ -7360,17 +5983,6 @@ version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e75c3b0d61c1d0e12b4b0fd5111f377c918e0227e9eb67434dcf9e6084646c6" -[[package]] -name = "uds_windows" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" -dependencies = [ - "memoffset", - "tempfile", - "winapi", -] - [[package]] name = "unarray" version = "0.1.4" @@ -7383,12 +5995,6 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - [[package]] name = "unicode-width" version = "0.1.14" @@ -7446,7 +6052,7 @@ dependencies = [ [[package]] name = "valence_anvil" version = "0.1.0" -source = "git+https://github.com/TestingPlant/valence?branch=feat-bytes#fb792dcb6669b64c5dc2366eb3d074b293def046" +source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" dependencies = [ "bitfield-struct 0.9.5", "bitvec", @@ -7455,24 +6061,14 @@ dependencies = [ "lru", "thiserror 1.0.69", "valence_bytes", - "valence_nbt 0.8.0 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", + "valence_nbt", "valence_server", ] [[package]] name = "valence_build_utils" version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+https://github.com/TestingPlant/valence?branch=feat-bytes#fb792dcb6669b64c5dc2366eb3d074b293def046" -dependencies = [ - "anyhow", - "proc-macro2", - "syn", -] - -[[package]] -name = "valence_build_utils" -version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+https://github.com/TestingPlant/valence?branch=feat-open#7c664716cd1e7b30de4e38cfc0ee8d1ecc7b0bd5" +source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" dependencies = [ "anyhow", "proc-macro2", @@ -7482,7 +6078,7 @@ dependencies = [ [[package]] name = "valence_bytes" version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+https://github.com/TestingPlant/valence?branch=feat-bytes#fb792dcb6669b64c5dc2366eb3d074b293def046" +source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" dependencies = [ "bytes", ] @@ -7490,7 +6086,7 @@ dependencies = [ [[package]] name = "valence_entity" version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+https://github.com/TestingPlant/valence?branch=feat-bytes#fb792dcb6669b64c5dc2366eb3d074b293def046" +source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" dependencies = [ "anyhow", "bevy_app 0.12.1", @@ -7508,35 +6104,18 @@ dependencies = [ "syn", "tracing", "uuid", - "valence_build_utils 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", - "valence_generated 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", - "valence_math 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", - "valence_nbt 0.8.0 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", - "valence_protocol 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", + "valence_build_utils", + "valence_generated", + "valence_math", + "valence_nbt", + "valence_protocol", "valence_server_common", ] [[package]] name = "valence_generated" version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+https://github.com/TestingPlant/valence?branch=feat-bytes#fb792dcb6669b64c5dc2366eb3d074b293def046" -dependencies = [ - "anyhow", - "heck", - "proc-macro2", - "quote", - "serde", - "serde_json", - "uuid", - "valence_build_utils 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", - "valence_ident 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", - "valence_math 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", -] - -[[package]] -name = "valence_generated" -version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+https://github.com/TestingPlant/valence?branch=feat-open#7c664716cd1e7b30de4e38cfc0ee8d1ecc7b0bd5" +source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" dependencies = [ "anyhow", "heck", @@ -7545,47 +6124,27 @@ dependencies = [ "serde", "serde_json", "uuid", - "valence_build_utils 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-open)", - "valence_ident 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-open)", - "valence_math 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-open)", + "valence_build_utils", + "valence_ident", + "valence_math", ] [[package]] name = "valence_ident" version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+https://github.com/TestingPlant/valence?branch=feat-bytes#fb792dcb6669b64c5dc2366eb3d074b293def046" +source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" dependencies = [ "bytes", "serde", "thiserror 1.0.69", "valence_bytes", - "valence_ident_macros 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", -] - -[[package]] -name = "valence_ident" -version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+https://github.com/TestingPlant/valence?branch=feat-open#7c664716cd1e7b30de4e38cfc0ee8d1ecc7b0bd5" -dependencies = [ - "serde", - "thiserror 1.0.69", - "valence_ident_macros 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-open)", + "valence_ident_macros", ] [[package]] name = "valence_ident_macros" version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+https://github.com/TestingPlant/valence?branch=feat-bytes#fb792dcb6669b64c5dc2366eb3d074b293def046" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "valence_ident_macros" -version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+https://github.com/TestingPlant/valence?branch=feat-open#7c664716cd1e7b30de4e38cfc0ee8d1ecc7b0bd5" +source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" dependencies = [ "proc-macro2", "quote", @@ -7595,23 +6154,15 @@ dependencies = [ [[package]] name = "valence_math" version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+https://github.com/TestingPlant/valence?branch=feat-bytes#fb792dcb6669b64c5dc2366eb3d074b293def046" +source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" dependencies = [ - "glam 0.29.3", -] - -[[package]] -name = "valence_math" -version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+https://github.com/TestingPlant/valence?branch=feat-open#7c664716cd1e7b30de4e38cfc0ee8d1ecc7b0bd5" -dependencies = [ - "glam 0.30.5", + "glam", ] [[package]] name = "valence_nbt" version = "0.8.0" -source = "git+https://github.com/TestingPlant/valence?branch=feat-bytes#fb792dcb6669b64c5dc2366eb3d074b293def046" +source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" dependencies = [ "byteorder", "cesu8", @@ -7621,86 +6172,38 @@ dependencies = [ "uuid", ] -[[package]] -name = "valence_nbt" -version = "0.8.0" -source = "git+https://github.com/TestingPlant/valence?branch=feat-open#7c664716cd1e7b30de4e38cfc0ee8d1ecc7b0bd5" -dependencies = [ - "byteorder", - "cesu8", - "uuid", -] - -[[package]] -name = "valence_protocol" -version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+https://github.com/TestingPlant/valence?branch=feat-bytes#fb792dcb6669b64c5dc2366eb3d074b293def046" -dependencies = [ - "anyhow", - "base64 0.22.1", - "bevy_ecs 0.12.1", - "bitfield-struct 0.9.5", - "byteorder", - "bytes", - "derive_more 1.0.0", - "flate2", - "serde", - "serde_json", - "thiserror 1.0.69", - "tracing", - "url", - "uuid", - "valence_bytes", - "valence_generated 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", - "valence_ident 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", - "valence_math 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", - "valence_nbt 0.8.0 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", - "valence_protocol_macros 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", - "valence_text 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", -] - [[package]] name = "valence_protocol" version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+https://github.com/TestingPlant/valence?branch=feat-open#7c664716cd1e7b30de4e38cfc0ee8d1ecc7b0bd5" +source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" dependencies = [ "anyhow", "base64 0.22.1", "bevy_ecs 0.12.1", "bitfield-struct 0.9.5", "byteorder", - "bytes", - "derive_more 1.0.0", - "flate2", - "serde", - "serde_json", - "thiserror 1.0.69", - "tracing", - "url", - "uuid", - "valence_generated 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-open)", - "valence_ident 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-open)", - "valence_math 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-open)", - "valence_nbt 0.8.0 (git+https://github.com/TestingPlant/valence?branch=feat-open)", - "valence_protocol_macros 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-open)", - "valence_text 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-open)", -] - -[[package]] -name = "valence_protocol_macros" -version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+https://github.com/TestingPlant/valence?branch=feat-bytes#fb792dcb6669b64c5dc2366eb3d074b293def046" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", + "bytes", + "derive_more 1.0.0", + "flate2", + "serde", + "serde_json", + "thiserror 1.0.69", + "tracing", + "url", + "uuid", + "valence_bytes", + "valence_generated", + "valence_ident", + "valence_math", + "valence_nbt", + "valence_protocol_macros", + "valence_text", ] [[package]] name = "valence_protocol_macros" version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+https://github.com/TestingPlant/valence?branch=feat-open#7c664716cd1e7b30de4e38cfc0ee8d1ecc7b0bd5" +source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" dependencies = [ "heck", "proc-macro2", @@ -7711,7 +6214,7 @@ dependencies = [ [[package]] name = "valence_registry" version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+https://github.com/TestingPlant/valence?branch=feat-bytes#fb792dcb6669b64c5dc2366eb3d074b293def046" +source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" dependencies = [ "anyhow", "bevy_app 0.12.1", @@ -7720,16 +6223,16 @@ dependencies = [ "serde", "serde_json", "tracing", - "valence_ident 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", - "valence_nbt 0.8.0 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", - "valence_protocol 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", + "valence_ident", + "valence_nbt", + "valence_protocol", "valence_server_common", ] [[package]] name = "valence_server" version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+https://github.com/TestingPlant/valence?branch=feat-bytes#fb792dcb6669b64c5dc2366eb3d074b293def046" +source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" dependencies = [ "anyhow", "arrayvec", @@ -7747,10 +6250,10 @@ dependencies = [ "uuid", "valence_bytes", "valence_entity", - "valence_generated 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", - "valence_math 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", - "valence_nbt 0.8.0 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", - "valence_protocol 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", + "valence_generated", + "valence_math", + "valence_nbt", + "valence_protocol", "valence_registry", "valence_server_common", ] @@ -7758,40 +6261,27 @@ dependencies = [ [[package]] name = "valence_server_common" version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+https://github.com/TestingPlant/valence?branch=feat-bytes#fb792dcb6669b64c5dc2366eb3d074b293def046" +source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" dependencies = [ "bevy_app 0.12.1", "bevy_ecs 0.12.1", "derive_more 1.0.0", "rand 0.8.5", "uuid", - "valence_protocol 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", -] - -[[package]] -name = "valence_text" -version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+https://github.com/TestingPlant/valence?branch=feat-bytes#fb792dcb6669b64c5dc2366eb3d074b293def046" -dependencies = [ - "serde", - "serde_json", - "thiserror 1.0.69", - "uuid", - "valence_ident 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", - "valence_nbt 0.8.0 (git+https://github.com/TestingPlant/valence?branch=feat-bytes)", + "valence_protocol", ] [[package]] name = "valence_text" version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+https://github.com/TestingPlant/valence?branch=feat-open#7c664716cd1e7b30de4e38cfc0ee8d1ecc7b0bd5" +source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" dependencies = [ "serde", "serde_json", "thiserror 1.0.69", "uuid", - "valence_ident 0.2.0-alpha.1+mc.1.20.1 (git+https://github.com/TestingPlant/valence?branch=feat-open)", - "valence_nbt 0.8.0 (git+https://github.com/TestingPlant/valence?branch=feat-open)", + "valence_ident", + "valence_nbt", ] [[package]] @@ -7956,115 +6446,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "wayland-backend" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" -dependencies = [ - "cc", - "downcast-rs 1.2.1", - "rustix 1.0.8", - "scoped-tls", - "smallvec", - "wayland-sys", -] - -[[package]] -name = "wayland-client" -version = "0.31.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" -dependencies = [ - "bitflags 2.9.4", - "rustix 1.0.8", - "wayland-backend", - "wayland-scanner", -] - -[[package]] -name = "wayland-csd-frame" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" -dependencies = [ - "bitflags 2.9.4", - "cursor-icon", - "wayland-backend", -] - -[[package]] -name = "wayland-cursor" -version = "0.31.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447ccc440a881271b19e9989f75726d60faa09b95b0200a9b7eb5cc47c3eeb29" -dependencies = [ - "rustix 1.0.8", - "wayland-client", - "xcursor", -] - -[[package]] -name = "wayland-protocols" -version = "0.32.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" -dependencies = [ - "bitflags 2.9.4", - "wayland-backend", - "wayland-client", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-plasma" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a07a14257c077ab3279987c4f8bb987851bf57081b93710381daea94f2c2c032" -dependencies = [ - "bitflags 2.9.4", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols-wlr" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec" -dependencies = [ - "bitflags 2.9.4", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-scanner", -] - -[[package]] -name = "wayland-scanner" -version = "0.31.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" -dependencies = [ - "proc-macro2", - "quick-xml 0.37.5", - "quote", -] - -[[package]] -name = "wayland-sys" -version = "0.31.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" -dependencies = [ - "dlib", - "log", - "once_cell", - "pkg-config", -] - [[package]] name = "web-sys" version = "0.3.77" @@ -8085,22 +6466,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webbrowser" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf4f3c0ba838e82b4e5ccc4157003fb8c324ee24c058470ffb82820becbde98" -dependencies = [ - "core-foundation 0.10.1", - "jni", - "log", - "ndk-context", - "objc2 0.6.2", - "objc2-foundation 0.3.1", - "url", - "web-sys", -] - [[package]] name = "webpki-roots" version = "1.0.2" @@ -8665,58 +7030,6 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" -[[package]] -name = "winit" -version = "0.30.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66d4b9ed69c4009f6321f762d6e61ad8a2389cd431b97cb1e146812e9e6c732" -dependencies = [ - "ahash", - "android-activity", - "atomic-waker", - "bitflags 2.9.4", - "block2", - "bytemuck", - "calloop", - "cfg_aliases", - "concurrent-queue", - "core-foundation 0.9.4", - "core-graphics", - "cursor-icon", - "dpi", - "js-sys", - "libc", - "memmap2", - "ndk", - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", - "objc2-ui-kit", - "orbclient", - "percent-encoding", - "pin-project", - "raw-window-handle", - "redox_syscall 0.4.1", - "rustix 0.38.44", - "sctk-adwaita", - "smithay-client-toolkit", - "smol_str", - "tracing", - "unicode-segmentation", - "wasm-bindgen", - "wasm-bindgen-futures", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "wayland-protocols-plasma", - "web-sys", - "web-time", - "windows-sys 0.52.0", - "x11-dl", - "x11rb", - "xkbcommon-dl", -] - [[package]] name = "winnow" version = "0.5.40" @@ -8756,38 +7069,6 @@ dependencies = [ "tap", ] -[[package]] -name = "x11-dl" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" -dependencies = [ - "libc", - "once_cell", - "pkg-config", -] - -[[package]] -name = "x11rb" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" -dependencies = [ - "as-raw-xcb-connection", - "gethostname", - "libc", - "libloading", - "once_cell", - "rustix 1.0.8", - "x11rb-protocol", -] - -[[package]] -name = "x11rb-protocol" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" - [[package]] name = "xattr" version = "1.5.1" @@ -8795,65 +7076,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af3a19837351dc82ba89f8a125e22a3c475f05aba604acc023d62b2739ae2909" dependencies = [ "libc", - "rustix 1.0.8", -] - -[[package]] -name = "xcursor" -version = "0.3.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" - -[[package]] -name = "xdg-home" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "xkbcommon-dl" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" -dependencies = [ - "bitflags 2.9.4", - "dlib", - "log", - "once_cell", - "xkeysym", + "rustix", ] -[[package]] -name = "xkeysym" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" - [[package]] name = "xml-rs" version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" -[[package]] -name = "yaml-rust" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" -dependencies = [ - "linked-hash-map", -] - -[[package]] -name = "yansi" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" - [[package]] name = "yoke" version = "0.8.0" @@ -8878,105 +7109,6 @@ dependencies = [ "synstructure", ] -[[package]] -name = "zbus" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" -dependencies = [ - "async-broadcast", - "async-executor", - "async-fs", - "async-io", - "async-lock", - "async-process", - "async-recursion", - "async-task", - "async-trait", - "blocking", - "enumflags2", - "event-listener 5.4.1", - "futures-core", - "futures-sink", - "futures-util", - "hex", - "nix 0.29.0", - "ordered-stream", - "rand 0.8.5", - "serde", - "serde_repr", - "sha1", - "static_assertions", - "tracing", - "uds_windows", - "windows-sys 0.52.0", - "xdg-home", - "zbus_macros", - "zbus_names", - "zvariant", -] - -[[package]] -name = "zbus-lockstep" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca2c5dceb099bddaade154055c926bb8ae507a18756ba1d8963fd7b51d8ed1d" -dependencies = [ - "zbus_xml", - "zvariant", -] - -[[package]] -name = "zbus-lockstep-macros" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "709ab20fc57cb22af85be7b360239563209258430bccf38d8b979c5a2ae3ecce" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "zbus-lockstep", - "zbus_xml", - "zvariant", -] - -[[package]] -name = "zbus_macros" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", - "zvariant_utils", -] - -[[package]] -name = "zbus_names" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" -dependencies = [ - "serde", - "static_assertions", - "zvariant", -] - -[[package]] -name = "zbus_xml" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3f374552b954f6abb4bd6ce979e6c9b38fb9d0cd7cc68a7d796e70c9f3a233" -dependencies = [ - "quick-xml 0.30.0", - "serde", - "static_assertions", - "zbus_names", - "zvariant", -] - [[package]] name = "zerocopy" version = "0.8.26" @@ -9056,40 +7188,3 @@ dependencies = [ "quote", "syn", ] - -[[package]] -name = "zvariant" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" -dependencies = [ - "endi", - "enumflags2", - "serde", - "static_assertions", - "zvariant_derive", -] - -[[package]] -name = "zvariant_derive" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn", - "zvariant_utils", -] - -[[package]] -name = "zvariant_utils" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] diff --git a/Cargo.toml b/Cargo.toml index 03de2b95..d98749e1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,7 +40,7 @@ members = [ 'crates/packet-channel', 'crates/simd-utils', 'events/bedwars', - 'tools/packet-inspector', + # 'tools/packet-inspector', 'tools/rust-mc-bot', ] resolver = '2' @@ -130,8 +130,6 @@ uuid = '1.16.0' [workspace.dependencies.hyperion-proxy-module] path = "crates/hyperion-proxy-module" -[workspace.dependencies.bvh] -git = 'https://github.com/TestingPlant/bvh-data' [workspace.dependencies.bvh-region] path = 'crates/bvh-region' @@ -278,47 +276,47 @@ features = ['timer-fallback'] version = '0.11.4' [workspace.dependencies.valence_anvil] -branch = 'feat-bytes' +git = 'file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence' +rev = 'a1252ee' features = ['parsing'] -git = 'https://github.com/TestingPlant/valence' [workspace.dependencies.valence_build_utils] -branch = 'feat-bytes' -git = 'https://github.com/TestingPlant/valence' +git = 'file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence' +rev = 'a1252ee' [workspace.dependencies.valence_bytes] -branch = 'feat-bytes' -git = 'https://github.com/TestingPlant/valence' +git = 'file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence' +rev = 'a1252ee' [workspace.dependencies.valence_generated] -branch = 'feat-bytes' -git = 'https://github.com/TestingPlant/valence' +git = 'file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence' +rev = 'a1252ee' [workspace.dependencies.valence_ident] -branch = 'feat-bytes' -git = 'https://github.com/TestingPlant/valence' +git = 'file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence' +rev = 'a1252ee' [workspace.dependencies.valence_nbt] -branch = 'feat-bytes' +git = 'file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence' +rev = 'a1252ee' features = ['serde'] -git = 'https://github.com/TestingPlant/valence' [workspace.dependencies.valence_protocol] -branch = 'feat-bytes' +git = 'file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence' +rev = 'a1252ee' features = ['compression'] -git = 'https://github.com/TestingPlant/valence' [workspace.dependencies.valence_registry] -branch = 'feat-bytes' -git = 'https://github.com/TestingPlant/valence' +git = 'file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence' +rev = 'a1252ee' [workspace.dependencies.valence_server] -branch = 'feat-bytes' -git = 'https://github.com/TestingPlant/valence' +git = 'file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence' +rev = 'a1252ee' [workspace.dependencies.valence_text] -branch = 'feat-bytes' -git = 'https://github.com/TestingPlant/valence' +git = 'file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence' +rev = 'a1252ee' [workspace.dependencies.bedwars] path = "events/bedwars" diff --git a/crates/bvh-region/src/query/ray.rs b/crates/bvh-region/src/query/ray.rs index cc7ad832..50caa0ff 100644 --- a/crates/bvh-region/src/query/ray.rs +++ b/crates/bvh-region/src/query/ray.rs @@ -24,11 +24,12 @@ impl Bvh { Node::Leaf(elems) => { // Only a leaf: check all elements directly. for elem in elems { - if let Some(t) = get_aabb(elem).intersect_ray(&ray) { - if t < closest_t && t.into_inner() >= 0.0 { - closest_t = t; - closest_elem = Some(elem); - } + if let Some(t) = get_aabb(elem).intersect_ray(&ray) + && t < closest_t + && t.into_inner() >= 0.0 + { + closest_t = t; + closest_elem = Some(elem); } } } @@ -36,13 +37,13 @@ impl Bvh { let mut heap: BinaryHeap<_> = BinaryHeap::new(); // Check if the ray hits the root node's AABB - if let Some(t) = internal.aabb.intersect_ray(&ray) { - if t.into_inner() >= 0.0 { - heap.push(Reverse(NodeOrd { - node: internal, - by: t, - })); - } + if let Some(t) = internal.aabb.intersect_ray(&ray) + && t.into_inner() >= 0.0 + { + heap.push(Reverse(NodeOrd { + node: internal, + by: t, + })); } while let Some(Reverse(current)) = heap.pop() { @@ -57,22 +58,24 @@ impl Bvh { for child in node.children(self) { match child { Node::Internal(child_node) => { - if let Some(t) = child_node.aabb.intersect_ray(&ray) { - if t < closest_t && t.into_inner() >= 0.0 { - heap.push(Reverse(NodeOrd { - node: child_node, - by: t, - })); - } + if let Some(t) = child_node.aabb.intersect_ray(&ray) + && t < closest_t + && t.into_inner() >= 0.0 + { + heap.push(Reverse(NodeOrd { + node: child_node, + by: t, + })); } } Node::Leaf(elems) => { for elem in elems { - if let Some(t) = get_aabb(elem).intersect_ray(&ray) { - if t < closest_t && t.into_inner() >= 0.0 { - closest_t = t; - closest_elem = Some(elem); - } + if let Some(t) = get_aabb(elem).intersect_ray(&ray) + && t < closest_t + && t.into_inner() >= 0.0 + { + closest_t = t; + closest_elem = Some(elem); } } } diff --git a/crates/bvh-region/tests/simple.rs b/crates/bvh-region/tests/simple.rs index 04a58fda..b279de76 100644 --- a/crates/bvh-region/tests/simple.rs +++ b/crates/bvh-region/tests/simple.rs @@ -252,11 +252,12 @@ fn brute_force_closest_ray(elements: &[Aabb], ray: Ray) -> Option<(&Aabb, NotNan let mut closest_elem = None; for aabb in elements { - if let Some(t) = aabb.intersect_ray(&ray) { - if t < closest_t && t.into_inner() >= 0.0 { - closest_t = t; - closest_elem = Some(aabb); - } + if let Some(t) = aabb.intersect_ray(&ray) + && t < closest_t + && t.into_inner() >= 0.0 + { + closest_t = t; + closest_elem = Some(aabb); } } diff --git a/crates/geometry/src/aabb.rs b/crates/geometry/src/aabb.rs index ab78d4e2..80182e4e 100644 --- a/crates/geometry/src/aabb.rs +++ b/crates/geometry/src/aabb.rs @@ -308,18 +308,18 @@ impl Aabb { } #[must_use] - pub fn mid_x(&self) -> f32 { - (self.min.x + self.max.x) / 2.0 + pub const fn mid_x(&self) -> f32 { + f32::midpoint(self.min.x, self.max.x) } #[must_use] - pub fn mid_y(&self) -> f32 { - (self.min.y + self.max.y) / 2.0 + pub const fn mid_y(&self) -> f32 { + f32::midpoint(self.min.y, self.max.y) } #[must_use] - pub fn mid_z(&self) -> f32 { - (self.min.z + self.max.z) / 2.0 + pub const fn mid_z(&self) -> f32 { + f32::midpoint(self.min.z, self.max.z) } #[inline] diff --git a/crates/hyperion-clap-macros/src/lib.rs b/crates/hyperion-clap-macros/src/lib.rs index fe412b7c..60323c25 100644 --- a/crates/hyperion-clap-macros/src/lib.rs +++ b/crates/hyperion-clap-macros/src/lib.rs @@ -11,12 +11,13 @@ pub fn derive_command_permission(input: TokenStream) -> TokenStream { // Extract the group from the `#[command_permission(group = "Admin")]` attribute let mut group = None; for attr in &input.attrs { + #[allow(clippy::collapsible_if)] if attr.path().is_ident("command_permission") { if let Err(err) = attr.parse_nested_meta(|meta| { - if meta.path.is_ident("group") { - if let Ok(Lit::Str(lit)) = meta.value()?.parse::() { - group = Some(lit); - } + if meta.path.is_ident("group") + && let Ok(Lit::Str(lit)) = meta.value()?.parse::() + { + group = Some(lit); } Ok(()) }) { diff --git a/crates/hyperion-command/src/lib.rs b/crates/hyperion-command/src/lib.rs index 97ac8962..07364f84 100644 --- a/crates/hyperion-command/src/lib.rs +++ b/crates/hyperion-command/src/lib.rs @@ -1,5 +1,3 @@ -#![feature(iter_intersperse)] - use bevy::prelude::*; mod component; diff --git a/crates/hyperion-command/src/system.rs b/crates/hyperion-command/src/system.rs index ceafc67b..89d2a52d 100644 --- a/crates/hyperion-command/src/system.rs +++ b/crates/hyperion-command/src/system.rs @@ -54,10 +54,11 @@ fn execute_commands( let mut msg = String::new(); write!(&mut msg, "§cAvailable commands: §r[").unwrap(); - for w in registry - .get_permitted(world, packet.sender()) - .intersperse(", ") - { + let permitted: Vec<_> = registry.get_permitted(world, packet.sender()).collect(); + for (i, w) in permitted.iter().enumerate() { + if i > 0 { + write!(&mut msg, ", ").unwrap(); + } write!(&mut msg, "{w}").unwrap(); } diff --git a/crates/hyperion-inventory/src/lib.rs b/crates/hyperion-inventory/src/lib.rs index aaf1f07c..1068f81c 100644 --- a/crates/hyperion-inventory/src/lib.rs +++ b/crates/hyperion-inventory/src/lib.rs @@ -1,5 +1,5 @@ -#![feature(thread_local)] -use std::{cell::Cell, cmp::min, num::Wrapping}; +// thread_local feature removed for stable compatibility +use std::{cmp::min, num::Wrapping}; use bevy::prelude::*; use derive_more::{Deref, DerefMut}; @@ -418,12 +418,10 @@ impl PlayerInventory { stack.item }); - let result = registry + registry .get_result_2x2(items) .cloned() - .unwrap_or(ItemStack::EMPTY); - - result + .unwrap_or(ItemStack::EMPTY) } #[must_use] @@ -523,16 +521,19 @@ pub const OFFHAND_SLOT: u16 = 45; /// /// We are skipping 0 because it is reserved for the player's inventory. pub fn non_zero_window_id() -> u8 { - #[thread_local] - static ID: Cell = Cell::new(0); + // Use regular static with AtomicU8 instead of thread_local Cell for stable compatibility + use std::sync::atomic::{AtomicU8, Ordering}; + static ID: AtomicU8 = AtomicU8::new(0); - ID.set(ID.get().wrapping_add(1)); + let current = ID.fetch_add(1, Ordering::Relaxed); + let next = current.wrapping_add(1); - if ID.get() == 0 { - ID.set(1); + if next == 0 { + ID.store(1, Ordering::Relaxed); + 1 + } else { + next } - - ID.get() } pub trait ItemKindExt { diff --git a/crates/hyperion-item/src/builder/book.rs b/crates/hyperion-item/src/builder/book.rs index 78480f40..2765f58d 100644 --- a/crates/hyperion-item/src/builder/book.rs +++ b/crates/hyperion-item/src/builder/book.rs @@ -34,6 +34,7 @@ impl BookBuilder { let page = page.into(); let json = format!(r#"{{"text":"{page}"}}"#); + #[allow(clippy::collapsible_if)] if let Some(nbt) = &mut self.item.nbt { if let nbt::Value::List(nbt::List::String(pages)) = nbt.get_mut("pages").unwrap() { pages.push(json); diff --git a/crates/hyperion-palette/Cargo.toml b/crates/hyperion-palette/Cargo.toml index 4dea52fa..1d04440f 100644 --- a/crates/hyperion-palette/Cargo.toml +++ b/crates/hyperion-palette/Cargo.toml @@ -1,3 +1,7 @@ +[features] +default = [] +nightly = [] + [dependencies] anyhow.workspace = true roaring.workspace = true diff --git a/crates/hyperion-palette/src/indirect.rs b/crates/hyperion-palette/src/indirect.rs index ffdfe8b2..ee320ad2 100644 --- a/crates/hyperion-palette/src/indirect.rs +++ b/crates/hyperion-palette/src/indirect.rs @@ -1,3 +1,4 @@ +#[cfg(feature = "nightly")] use std::simd::{Simd, cmp::SimdPartialEq}; use crate::{Data, HALF_LEN, LEN}; @@ -24,6 +25,7 @@ impl Indirect { } } + #[cfg(feature = "nightly")] pub fn index_of(&self, data: Data) -> Option { // Create a SIMD vector filled with the search element let search_simd: Simd = Simd::splat(data); @@ -41,6 +43,17 @@ impl Indirect { mask.first_set().map(|idx| idx as u8) } + #[cfg(not(feature = "nightly"))] + pub fn index_of(&self, data: Data) -> Option { + // Fallback: linear search + for (idx, &palette_data) in self.palette.iter().enumerate() { + if palette_data == data { + return u8::try_from(idx).ok(); + } + } + None + } + pub unsafe fn get_unchecked(&self, index: usize) -> Data { debug_assert!(index < LEN, "index {index} is out of bounds"); diff --git a/crates/hyperion-palette/src/lib.rs b/crates/hyperion-palette/src/lib.rs index 26bf0a1d..95c8d394 100644 --- a/crates/hyperion-palette/src/lib.rs +++ b/crates/hyperion-palette/src/lib.rs @@ -1,4 +1,4 @@ -#![feature(portable_simd)] +#![cfg_attr(feature = "nightly", feature(portable_simd))] use std::{clone::Clone, iter::FusedIterator}; diff --git a/crates/hyperion-proxy/Cargo.toml b/crates/hyperion-proxy/Cargo.toml index fed9c256..8ed3d31f 100644 --- a/crates/hyperion-proxy/Cargo.toml +++ b/crates/hyperion-proxy/Cargo.toml @@ -12,7 +12,7 @@ tokio = { workspace = true, features = ["full", "tracing"] } tokio-rustls = { workspace = true } tokio-util = { workspace = true, features = ["full"] } anyhow = { workspace = true } -bvh = { workspace = true } + bytes = { workspace = true } clap = { workspace = true } glam = { workspace = true } diff --git a/crates/hyperion-proxy/src/cache.rs b/crates/hyperion-proxy/src/cache.rs index 11fb8566..704db9ce 100644 --- a/crates/hyperion-proxy/src/cache.rs +++ b/crates/hyperion-proxy/src/cache.rs @@ -1,6 +1,6 @@ use std::collections::HashSet; -use bvh::{Aabb, Bvh, Data, Point}; +// BVH removed for stable compatibility use bytes::Bytes; use glam::I16Vec2; use hyperion_proto::ArchivedServerToProxyMessage; @@ -19,19 +19,9 @@ struct Player { chunk_position: I16Vec2, } -impl Point for Player { - fn point(&self) -> I16Vec2 { - self.chunk_position - } -} +// Point trait removed for stable compatibility -impl Data for Player { - type Unit = u64; - - fn data<'a: 'c, 'b: 'c, 'c>(&'a self, (): Self::Context<'b>) -> &'c [Self::Unit] { - std::slice::from_ref(&self.stream) - } -} +// Data trait removed for stable compatibility pub struct Channel { /// List of connection ids that are pending a subscription to this channel @@ -54,7 +44,8 @@ pub struct BufferedEgress { channel_manager: ChannelManager, /// Reference to the underlying egress handler. egress: Egress, - player_bvh: Bvh>, + /// Simple player list (replaces BVH for stable compatibility) + players: Vec, } impl BufferedEgress { @@ -64,7 +55,7 @@ impl BufferedEgress { Self { channel_manager: ChannelManager::default(), egress, - player_bvh: Bvh::default(), + players: Vec::new(), } } @@ -77,8 +68,12 @@ impl BufferedEgress { let mut players = Vec::with_capacity(packet.stream.len()); for (stream, position) in packet.stream.iter().zip(packet.positions.iter()) { - let Ok(stream) = rkyv::deserialize::(stream); - let Ok(position) = rkyv::deserialize::<_, !>(position); + let Ok(stream) = rkyv::deserialize::(stream) else { + continue; + }; + let Ok(position) = rkyv::deserialize::<_, rkyv::rancor::Error>(position) else { + continue; + }; let position = I16Vec2::from(position); players.push(Player { @@ -87,7 +82,7 @@ impl BufferedEgress { }); } - self.player_bvh = Bvh::build(&mut players, ()); + self.players = players; } ArchivedServerToProxyMessage::AddChannel(packet) => { let unsubscribe_packets = match rkyv::deserialize::<_, rkyv::rancor::Error>( @@ -132,26 +127,24 @@ impl BufferedEgress { continue; }; - let Ok(channel_position) = rkyv::deserialize::<_, !>(&update.position); + let Ok(channel_position) = + rkyv::deserialize::<_, rkyv::rancor::Error>(&update.position) + else { + continue; + }; let channel_position = I16Vec2::from(channel_position); - let min = channel_position - I16Vec2::splat(RADIUS); - let max = channel_position + I16Vec2::splat(RADIUS); - - let aabb = Aabb::new(min, max); - - let slices = self.player_bvh.get_in(aabb); + let _min = channel_position - I16Vec2::splat(RADIUS); + let _max = channel_position + I16Vec2::splat(RADIUS); + // Simple fallback: check all players (less efficient than BVH) let mut should_remain_subscribed = HashSet::new(); - for slice in slices { - let (_, streams) = self.player_bvh.inner(); - - let start = slice.start as usize; - let end = slice.end as usize; - - let streams = &streams[start..end]; - for &stream in streams { + for player in &self.players { + let player_pos = player.chunk_position; + let distance = (player_pos - channel_position).abs(); + if distance.x <= RADIUS && distance.y <= RADIUS { + let stream = player.stream; let Some(player) = players.get(&stream) else { error!("bvh contains invalid stream id {stream}"); continue; @@ -252,7 +245,10 @@ impl BufferedEgress { ArchivedServerToProxyMessage::BroadcastGlobal(packet) => { let data = Bytes::from(rkyv::deserialize::<_, rkyv::rancor::Error>(&packet.data).unwrap()); - let Ok(exclude) = rkyv::deserialize::(&packet.exclude); + let Ok(exclude) = rkyv::deserialize::(&packet.exclude) + else { + return; + }; let players = self.egress.player_registry.pin_owned(); @@ -265,28 +261,32 @@ impl BufferedEgress { } } ArchivedServerToProxyMessage::BroadcastLocal(packet) => { - let Ok(center_x) = rkyv::deserialize::(&packet.center.x); - let Ok(center_z) = rkyv::deserialize::(&packet.center.z); - let Ok(player_id_to_exclude) = rkyv::deserialize::(&packet.exclude); + let Ok(center_x) = rkyv::deserialize::(&packet.center.x) + else { + return; + }; + let Ok(center_z) = rkyv::deserialize::(&packet.center.z) + else { + return; + }; + let Ok(player_id_to_exclude) = + rkyv::deserialize::(&packet.exclude) + else { + return; + }; let data = Bytes::from(rkyv::deserialize::<_, rkyv::rancor::Error>(&packet.data).unwrap()); let position = I16Vec2::new(center_x, center_z); - let min = position - I16Vec2::splat(RADIUS); - let max = position + I16Vec2::splat(RADIUS); - - let aabb = Aabb::new(min, max); - - let slices = self.player_bvh.get_in(aabb); - - for slice in slices { - let (_, streams) = self.player_bvh.inner(); - - let start = slice.start as usize; - let end = slice.end as usize; - - let streams = &streams[start..end]; - for &stream in streams { + let _min = position - I16Vec2::splat(RADIUS); + let _max = position + I16Vec2::splat(RADIUS); + + // Simple fallback: check all players (less efficient than BVH) + for player in &self.players { + let player_pos = player.chunk_position; + let distance = (player_pos - position).abs(); + if distance.x <= RADIUS && distance.y <= RADIUS { + let stream = player.stream; if stream == player_id_to_exclude { continue; } diff --git a/crates/hyperion-proxy/src/egress.rs b/crates/hyperion-proxy/src/egress.rs index 7b31eea5..68ce1c8e 100644 --- a/crates/hyperion-proxy/src/egress.rs +++ b/crates/hyperion-proxy/src/egress.rs @@ -45,7 +45,9 @@ impl Egress { pub fn handle_set_receive_broadcasts(&self, pkt: &ArchivedSetReceiveBroadcasts) { let player_registry = self.player_registry; let players = player_registry.pin(); - let Ok(stream) = rkyv::deserialize::(&pkt.stream); + let Ok(stream) = rkyv::deserialize::(&pkt.stream) else { + return; + }; let Some(player) = players.get(&stream) else { error!("Player not found for stream {stream:?}"); @@ -59,7 +61,9 @@ impl Egress { pub fn handle_shutdown(&self, pkt: &ArchivedShutdown) { let player_registry = self.player_registry; let players = player_registry.pin(); - let Ok(stream) = rkyv::deserialize::(&pkt.stream); + let Ok(stream) = rkyv::deserialize::(&pkt.stream) else { + return; + }; if let Some(result) = players.get(&stream) { result.shutdown(); diff --git a/crates/hyperion-proxy/src/lib.rs b/crates/hyperion-proxy/src/lib.rs index 3fb025aa..7d776a55 100644 --- a/crates/hyperion-proxy/src/lib.rs +++ b/crates/hyperion-proxy/src/lib.rs @@ -1,9 +1,3 @@ -#![feature(maybe_uninit_slice)] -#![feature(allocator_api)] -#![feature(let_chains)] -#![feature(never_type)] -#![feature(stmt_expr_attributes)] -#![feature(gen_blocks)] #![allow( clippy::redundant_pub_crate, clippy::cast_possible_truncation, @@ -63,8 +57,8 @@ async fn connect(addr: impl ToSocketAddrs + Debug + Clone) -> TcpStream { } } -#[derive(Debug, PartialEq)] -enum ShutdownType { +#[derive(Debug, PartialEq, Eq)] +pub enum ShutdownType { Reconnect, Full, } @@ -333,6 +327,6 @@ where } } -trait HyperionListener: Listener + 'static {} +pub trait HyperionListener: Listener + 'static {} impl + 'static> HyperionListener for L {} diff --git a/crates/hyperion-stats/Cargo.toml b/crates/hyperion-stats/Cargo.toml index 6a18cdee..3d3ce1b4 100644 --- a/crates/hyperion-stats/Cargo.toml +++ b/crates/hyperion-stats/Cargo.toml @@ -2,6 +2,10 @@ harness = false name = "parallel_stats" +[features] +default = [] +nightly = [] + [dependencies] [dev-dependencies] diff --git a/crates/hyperion-stats/src/lib.rs b/crates/hyperion-stats/src/lib.rs index 7d54f091..c1d62c73 100644 --- a/crates/hyperion-stats/src/lib.rs +++ b/crates/hyperion-stats/src/lib.rs @@ -1,7 +1,8 @@ -#![feature(portable_simd)] -#![feature(array_chunks)] -#![feature(iter_array_chunks)] +#![cfg_attr(feature = "nightly", feature(portable_simd))] +#![cfg_attr(feature = "nightly", feature(array_chunks))] +#![cfg_attr(feature = "nightly", feature(iter_array_chunks))] +#[cfg(feature = "nightly")] use std::simd::{f64x4, num::SimdFloat}; #[derive(Debug, Clone)] @@ -29,6 +30,7 @@ impl ParallelStats { /// Update multiple parallel running statistics with SIMD /// Each slice must be the same length as width + #[cfg(feature = "nightly")] pub fn update(&mut self, values: &[f64]) { assert_eq!(values.len(), self.width, "Input length must match width"); @@ -48,6 +50,18 @@ impl ParallelStats { } } + /// Update multiple parallel running statistics (stable fallback) + #[cfg(not(feature = "nightly"))] + pub fn update(&mut self, values: &[f64]) { + assert_eq!(values.len(), self.width, "Input length must match width"); + + // Fallback: process all elements with scalar operations + for (i, &value) in values.iter().enumerate() { + self.update_single(i, value); + } + } + + #[cfg(feature = "nightly")] fn simd_update(&mut self, chunk_start: usize, chunk_end: usize, values: &[f64]) { let values_simd = f64x4::from_slice(values); let means_simd = f64x4::from_slice(&self.means[chunk_start..chunk_end]); diff --git a/crates/hyperion-utils/src/cached_save.rs b/crates/hyperion-utils/src/cached_save.rs index eacdb6f9..7cefd82e 100644 --- a/crates/hyperion-utils/src/cached_save.rs +++ b/crates/hyperion-utils/src/cached_save.rs @@ -39,9 +39,8 @@ pub fn cached_save( let byte_stream = response.bytes_stream(); // Convert the byte stream into an AsyncRead - let reader = StreamReader::new(byte_stream.map(|result| { - result.map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e)) - })); + let reader = + StreamReader::new(byte_stream.map(|result| result.map_err(std::io::Error::other))); let directory = directory.clone(); let handle = tokio::task::spawn_blocking(move || { diff --git a/crates/hyperion/Cargo.toml b/crates/hyperion/Cargo.toml index d8d63468..a1595822 100644 --- a/crates/hyperion/Cargo.toml +++ b/crates/hyperion/Cargo.toml @@ -85,6 +85,10 @@ serial_test = { workspace = true } tracing-appender = { workspace = true } tracing-subscriber = { workspace = true } +[features] +default = [] +nightly = [] + [lints] workspace = true diff --git a/crates/hyperion/src/common/config.rs b/crates/hyperion/src/common/config.rs index 9a32b776..f540391a 100644 --- a/crates/hyperion/src/common/config.rs +++ b/crates/hyperion/src/common/config.rs @@ -76,6 +76,7 @@ impl Config { info!("configuration file not found, using defaults"); // make required folders + #[allow(clippy::collapsible_if)] if let Some(parent) = path.as_ref().parent() { if let Err(e) = std::fs::create_dir_all(parent) { // this might happen on a read-only filesystem (i.e., diff --git a/crates/hyperion/src/common/util/mojang.rs b/crates/hyperion/src/common/util/mojang.rs index 893508ca..b4e9f74f 100644 --- a/crates/hyperion/src/common/util/mojang.rs +++ b/crates/hyperion/src/common/util/mojang.rs @@ -36,7 +36,7 @@ impl ApiProvider { username_base_url: "https://api.mojang.com/users/profiles/minecraft", uuid_base_url: "https://sessionserver.mojang.com/session/minecraft/profile", max_requests: 600, - interval: Duration::from_mins(10), + interval: Duration::from_secs(10 * 60), }; fn username_url(&self, username: &str) -> String { diff --git a/crates/hyperion/src/egress/stats.rs b/crates/hyperion/src/egress/stats.rs index 72e053ec..3688ba94 100644 --- a/crates/hyperion/src/egress/stats.rs +++ b/crates/hyperion/src/egress/stats.rs @@ -15,7 +15,6 @@ impl Plugin for StatsPlugin { } } -#[expect(clippy::missing_const_for_fn, reason = "false positive")] fn global_update(mut compose: ResMut<'_, Compose>) { let global = compose.global_mut(); diff --git a/crates/hyperion/src/ingress/mod.rs b/crates/hyperion/src/ingress/mod.rs index 1b137eac..20bc0f49 100644 --- a/crates/hyperion/src/ingress/mod.rs +++ b/crates/hyperion/src/ingress/mod.rs @@ -232,10 +232,11 @@ pub fn process_login_hello( fn offline_uuid(username: &str) -> uuid::Uuid { let digest = sha2::Sha256::digest(username); let digest: [u8; 32] = digest.into(); - let (&digest, ..) = digest.split_array_ref::<16>(); + let digest = &digest[0..16]; // todo: I have no idea which way we should go (be or le) - let digest = u128::from_be_bytes(digest); + let digest_array: [u8; 16] = digest.try_into().expect("slice is exactly 16 bytes"); + let digest = u128::from_be_bytes(digest_array); uuid::Uuid::from_u128(digest) } diff --git a/crates/hyperion/src/lib.rs b/crates/hyperion/src/lib.rs index a3ed2a21..24be1cc7 100644 --- a/crates/hyperion/src/lib.rs +++ b/crates/hyperion/src/lib.rs @@ -1,34 +1,20 @@ //! Hyperion -#![feature(type_alias_impl_trait)] -#![feature(io_error_more)] -#![feature(trusted_len)] -#![feature(allocator_api)] -#![feature(read_buf)] -#![feature(core_io_borrowed_buf)] -#![feature(maybe_uninit_slice)] -#![feature(duration_millis_float)] -#![feature(iter_array_chunks)] -#![feature(assert_matches)] -#![feature(try_trait_v2)] -#![feature(let_chains)] -#![feature(ptr_metadata)] -#![feature(stmt_expr_attributes)] -#![feature(array_try_map)] -#![feature(split_array)] -#![feature(never_type)] -#![feature(duration_constructors)] -#![feature(array_chunks)] -#![feature(portable_simd)] -#![feature(trivial_bounds)] -#![feature(pointer_is_aligned_to)] -#![feature(thread_local)] +#![cfg_attr(feature = "nightly", feature(allocator_api))] +#![cfg_attr(feature = "nightly", feature(read_buf))] +#![cfg_attr(feature = "nightly", feature(core_io_borrowed_buf))] +#![cfg_attr(feature = "nightly", feature(maybe_uninit_slice))] +#![cfg_attr(feature = "nightly", feature(iter_array_chunks))] +#![cfg_attr(feature = "nightly", feature(let_chains))] +#![cfg_attr(feature = "nightly", feature(never_type))] +#![cfg_attr(feature = "nightly", feature(array_chunks))] +#![cfg_attr(feature = "nightly", feature(portable_simd))] pub const CHUNK_HEIGHT_SPAN: u32 = 384; // 512; // usually 384 -use std::{ - alloc::Allocator, fmt::Debug, io::Write, net::SocketAddr, path::Path, sync::Arc, time::Duration, -}; +#[cfg(feature = "nightly")] +use std::alloc::Allocator; +use std::{fmt::Debug, io::Write, net::SocketAddr, path::Path, sync::Arc, time::Duration}; use bevy::prelude::*; use egress::EgressPlugin; @@ -96,7 +82,7 @@ pub fn adjust_file_descriptor_limits(recommended_min: u64) -> std::io::Result<() rlim_max: 0, // Initialize hard limit to 0 }; - if unsafe { getrlimit(RLIMIT_NOFILE, &mut limits) } == 0 { + if unsafe { getrlimit(RLIMIT_NOFILE, &raw mut limits) } == 0 { // Create a stack-allocated buffer... info!("current soft limit: {}", limits.rlim_cur); @@ -117,7 +103,7 @@ pub fn adjust_file_descriptor_limits(recommended_min: u64) -> std::io::Result<() info!("setting soft limit to: {}", limits.rlim_cur); - if unsafe { setrlimit(RLIMIT_NOFILE, &limits) } != 0 { + if unsafe { setrlimit(RLIMIT_NOFILE, &raw const limits) } != 0 { error!("Failed to set the file handle limits"); return Err(std::io::Error::last_os_error()); } @@ -282,22 +268,38 @@ impl Plugin for HyperionCore { } } +#[cfg(feature = "nightly")] /// A scratch buffer for intermediate operations. This will return an empty [`Vec`] when calling [`Scratch::obtain`]. #[derive(Debug)] pub struct Scratch { inner: Box<[u8], A>, } +#[cfg(not(feature = "nightly"))] +/// A scratch buffer for intermediate operations. This will return an empty [`Vec`] when calling [`Scratch::obtain`]. +#[derive(Debug)] +pub struct Scratch { + inner: Box<[u8]>, +} + +#[cfg(feature = "nightly")] impl Default for Scratch { fn default() -> Self { std::alloc::Global.into() } } +#[cfg(not(feature = "nightly"))] +impl Default for Scratch { + fn default() -> Self { + Self { + inner: vec![0u8; MAX_PACKET_SIZE].into_boxed_slice(), + } + } +} + /// Nice for getting a buffer that can be used for intermediate work pub trait ScratchBuffer: sealed::Sealed + Debug { - /// The type of the allocator the [`Vec`] uses. - type Allocator: Allocator; /// Obtains a buffer that can be used for intermediate work. The contents are unspecified. fn obtain(&mut self) -> &mut [u8]; } @@ -306,16 +308,27 @@ mod sealed { pub trait Sealed {} } +#[cfg(feature = "nightly")] impl sealed::Sealed for Scratch {} +#[cfg(not(feature = "nightly"))] +impl sealed::Sealed for Scratch {} + +#[cfg(feature = "nightly")] impl ScratchBuffer for Scratch { - type Allocator = A; + fn obtain(&mut self) -> &mut [u8] { + &mut self.inner + } +} +#[cfg(not(feature = "nightly"))] +impl ScratchBuffer for Scratch { fn obtain(&mut self) -> &mut [u8] { &mut self.inner } } +#[cfg(feature = "nightly")] impl From for Scratch { fn from(allocator: A) -> Self { // A zeroed slice is allocated to avoid reading from uninitialized memory, which is UB. diff --git a/crates/hyperion/src/net/encoder/util.rs b/crates/hyperion/src/net/encoder/util.rs index 5db8955c..0c72f56d 100644 --- a/crates/hyperion/src/net/encoder/util.rs +++ b/crates/hyperion/src/net/encoder/util.rs @@ -1,8 +1,12 @@ +#[cfg(not(feature = "nightly"))] +use std::io::Read; +#[cfg(feature = "nightly")] use std::{ alloc::Allocator, io::{BorrowedBuf, Read}, }; +#[cfg(feature = "nightly")] #[allow(dead_code, reason = "this might be used in the future")] pub fn read_to_end( r: &mut R, @@ -41,6 +45,13 @@ pub fn read_to_end( } } +#[cfg(not(feature = "nightly"))] +#[allow(dead_code, reason = "this might be used in the future")] +pub fn read_to_end(r: &mut R, buf: &mut Vec) -> std::io::Result<()> { + r.read_to_end(buf)?; + Ok(()) +} + #[cfg(test)] mod tests { use std::io::{Cursor, Read}; diff --git a/crates/hyperion/src/net/proxy.rs b/crates/hyperion/src/net/proxy.rs index 18570532..58833edc 100644 --- a/crates/hyperion/src/net/proxy.rs +++ b/crates/hyperion/src/net/proxy.rs @@ -86,7 +86,10 @@ async fn handle_proxy_messages( match result { ArchivedProxyToServerMessage::PlayerConnect(message) => { - let Ok(stream) = rkyv::deserialize::(&message.stream); + let Ok(stream) = rkyv::deserialize::(&message.stream) + else { + continue; + }; let (sender, receiver) = packet_channel::channel(DEFAULT_FRAGMENT_SIZE); if player_packet_sender.insert(stream, sender).is_some() { @@ -112,7 +115,10 @@ async fn handle_proxy_messages( }); } ArchivedProxyToServerMessage::PlayerDisconnect(message) => { - let Ok(stream) = rkyv::deserialize::(&message.stream); + let Ok(stream) = rkyv::deserialize::(&message.stream) + else { + continue; + }; if player_packet_sender.remove(&stream).is_none() { error!( @@ -131,7 +137,10 @@ async fn handle_proxy_messages( }); } ArchivedProxyToServerMessage::PlayerPackets(message) => { - let Ok(stream) = rkyv::deserialize::(&message.stream); + let Ok(stream) = rkyv::deserialize::(&message.stream) + else { + continue; + }; let Some(sender) = player_packet_sender.get_mut(&stream) else { error!( diff --git a/crates/hyperion/src/simulation/blocks/manager.rs b/crates/hyperion/src/simulation/blocks/manager.rs index fd99daa5..11eb5dfc 100644 --- a/crates/hyperion/src/simulation/blocks/manager.rs +++ b/crates/hyperion/src/simulation/blocks/manager.rs @@ -113,6 +113,7 @@ impl RegionManagerTask { } async fn get_or_create_region(&mut self, coord: IVec2) -> std::io::Result> { + #[allow(clippy::collapsible_if)] if let Some(region) = self.regions.get(&coord) { if let Some(region) = region.upgrade() { return Ok(region); @@ -124,8 +125,7 @@ impl RegionManagerTask { async fn create_and_insert_region(&mut self, coord: IVec2) -> std::io::Result> { let file = self.region_file(coord.x, coord.y).await?; - let region = - Region::open(&file).map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e))?; + let region = Region::open(&file).map_err(std::io::Error::other)?; let region = Arc::new(region); let region_weak = Arc::downgrade(®ion); self.regions.insert(coord, region_weak); diff --git a/crates/hyperion/src/simulation/blocks/mod.rs b/crates/hyperion/src/simulation/blocks/mod.rs index 41ef29bd..19593254 100644 --- a/crates/hyperion/src/simulation/blocks/mod.rs +++ b/crates/hyperion/src/simulation/blocks/mod.rs @@ -1,6 +1,6 @@ //! Constructs for working with blocks. -use std::{future::Future, ops::Try, path::Path, pin::Pin, sync::Arc}; +use std::{future::Future, path::Path, pin::Pin, sync::Arc}; use anyhow::Context; use bevy::prelude::*; @@ -256,10 +256,9 @@ impl Blocks { /// Returns all loaded blocks within the range from `start` to `end` (inclusive). #[expect(clippy::excessive_nesting)] - pub fn get_blocks(&self, start: IVec3, end: IVec3, mut f: F) -> R + pub fn get_blocks(&self, start: IVec3, end: IVec3, mut f: F) -> anyhow::Result<()> where - F: FnMut(IVec3, BlockState) -> R, - R: Try, + F: FnMut(IVec3, BlockState) -> anyhow::Result<()>, { const START_Y: i32 = -64; @@ -343,7 +342,7 @@ impl Blocks { } } - R::from_output(()) + Ok(()) } /// Get a block diff --git a/crates/hyperion/src/simulation/handlers.rs b/crates/hyperion/src/simulation/handlers.rs index 0b924dfa..4bef28c4 100644 --- a/crates/hyperion/src/simulation/handlers.rs +++ b/crates/hyperion/src/simulation/handlers.rs @@ -283,12 +283,11 @@ pub fn is_grounded(position: &Vec3, blocks: &Blocks) -> bool { } fn has_block_collision(position: &Vec3, size: EntitySize, blocks: &Blocks) -> bool { - use std::ops::ControlFlow; - let (min, max) = block_bounds(*position, size); let shrunk = aabb(*position, size).shrink(0.01); - let res = blocks.get_blocks(min, max, |pos, block| { + let mut has_collision = false; + let _unused = blocks.get_blocks(min, max, |pos, block| { let pos = Vec3::new(pos.x as f32, pos.y as f32, pos.z as f32); for aabb in block.collision_shapes() { @@ -296,14 +295,15 @@ fn has_block_collision(position: &Vec3, size: EntitySize, blocks: &Blocks) -> bo let aabb = aabb.move_by(pos); if shrunk.collides(&aabb) { - return ControlFlow::Break(false); + has_collision = true; + return Err(anyhow::anyhow!("early exit")); // Early exit on collision } } - ControlFlow::Continue(()) + Ok(()) }); - res.is_break() + has_collision } fn hand_swing( diff --git a/crates/hyperion/src/simulation/metadata/mod.rs b/crates/hyperion/src/simulation/metadata/mod.rs index 1e0cd7d9..ab983d67 100644 --- a/crates/hyperion/src/simulation/metadata/mod.rs +++ b/crates/hyperion/src/simulation/metadata/mod.rs @@ -131,15 +131,7 @@ macro_rules! define_metadata_component { value: $type, } - #[allow(warnings)] - impl PartialOrd for $name - where - $type: PartialOrd, - { - fn partial_cmp(&self, other: &Self) -> Option { - self.value.partial_cmp(&other.value) - } - } + // PartialOrd implementation removed as it's not required and causes issues with types like Vec3, Quat, etc. impl Metadata for $name { type Type = $type; @@ -192,7 +184,7 @@ macro_rules! define_and_register_components { impl MetadataChanges { #[must_use] - pub fn is_empty(&self) -> bool { + pub const fn is_empty(&self) -> bool { self.0.is_empty() } diff --git a/crates/hyperion/src/simulation/packet.rs b/crates/hyperion/src/simulation/packet.rs index 874aed0a..f3714974 100644 --- a/crates/hyperion/src/simulation/packet.rs +++ b/crates/hyperion/src/simulation/packet.rs @@ -11,6 +11,7 @@ use crate::net::ConnectionId; pub struct Packet { sender: Entity, connection_id: ConnectionId, + #[allow(clippy::struct_field_names)] packet_id: u64, #[deref] diff --git a/crates/hyperion/src/storage/buf.rs b/crates/hyperion/src/storage/buf.rs index 049c6d4b..f0be59e5 100644 --- a/crates/hyperion/src/storage/buf.rs +++ b/crates/hyperion/src/storage/buf.rs @@ -24,8 +24,7 @@ unsafe impl Buf for bytes::BytesMut { // self self.reserve(len); let cap = self.spare_capacity_mut(); - let cap = unsafe { cap.assume_init_mut() }; - cap + unsafe { std::slice::from_raw_parts_mut(cap.as_mut_ptr().cast::(), cap.len()) } } fn advance(&mut self, len: usize) -> Self::Output { @@ -42,8 +41,7 @@ unsafe impl Buf for Vec { // self self.reserve(len); let cap = self.spare_capacity_mut(); - let cap = unsafe { cap.assume_init_mut() }; - cap + unsafe { std::slice::from_raw_parts_mut(cap.as_mut_ptr().cast::(), cap.len()) } } fn advance(&mut self, len: usize) -> Self::Output { diff --git a/crates/hyperion/tests/collision.rs b/crates/hyperion/tests/collision.rs index 2bd116a2..daffeb10 100644 --- a/crates/hyperion/tests/collision.rs +++ b/crates/hyperion/tests/collision.rs @@ -1,4 +1,3 @@ -#![feature(assert_matches)] #![allow( clippy::print_stdout, reason = "the purpose of not having printing to stdout is so that tracing is used properly \ diff --git a/crates/hyperion/tests/spatial.rs b/crates/hyperion/tests/spatial.rs index ae450b03..786ddad1 100644 --- a/crates/hyperion/tests/spatial.rs +++ b/crates/hyperion/tests/spatial.rs @@ -1,11 +1,10 @@ -#![feature(assert_matches)] #![allow( clippy::print_stdout, reason = "the purpose of not having printing to stdout is so that tracing is used properly \ for the core libraries. These are tests, so it doesn't matter" )] -use std::{assert_matches::assert_matches, collections::HashSet}; +use std::collections::HashSet; use approx::assert_relative_eq; use bevy::{app::FixedMain, prelude::*}; @@ -69,7 +68,7 @@ fn spatial() { assert_relative_eq!(distance.into_inner(), 0.0); let ray = Ray::from_points(Vec3::new(12.0, 0.0, 0.0), Vec3::new(13.0, 1.0, 1.0)); - assert_matches!(spatial.first_ray_collision(ray, query), None); + assert!(spatial.first_ray_collision(ray, query).is_none()); }, ); app.world_mut().run_system(system).unwrap(); diff --git a/crates/packet-channel/Cargo.toml b/crates/packet-channel/Cargo.toml index ce97ee66..7082f3f4 100644 --- a/crates/packet-channel/Cargo.toml +++ b/crates/packet-channel/Cargo.toml @@ -2,6 +2,10 @@ harness = false name = "packet_channel" +[features] +default = [] +nightly = [] + [dependencies] arc-swap = { workspace = true } bevy = { workspace = true } @@ -9,8 +13,8 @@ more-asserts = { workspace = true } valence_protocol = { workspace = true } [dev-dependencies] -divan = {workspace = true} -proptest = {workspace = true} +divan = { workspace = true } +proptest = { workspace = true } [lints] workspace = true diff --git a/crates/packet-channel/src/lib.rs b/crates/packet-channel/src/lib.rs index a9c32967..a83d146b 100644 --- a/crates/packet-channel/src/lib.rs +++ b/crates/packet-channel/src/lib.rs @@ -1,8 +1,33 @@ -#![feature(let_chains)] -#![feature(sync_unsafe_cell)] +#![cfg_attr(feature = "nightly", feature(let_chains))] +#![cfg_attr(feature = "nightly", feature(sync_unsafe_cell))] + +#[cfg(feature = "nightly")] +use std::cell::SyncUnsafeCell; + +#[cfg(not(feature = "nightly"))] +mod sync_unsafe_cell { + use std::cell::UnsafeCell; + + /// A stable-compatible wrapper for `SyncUnsafeCell` + #[repr(transparent)] + pub struct SyncUnsafeCell(UnsafeCell); + + impl SyncUnsafeCell { + #[allow(dead_code)] + pub const fn new(value: T) -> Self { + Self(UnsafeCell::new(value)) + } + + pub const fn get(&self) -> *mut T { + self.0.get() + } + } + + // SAFETY: This is safe because we're only using this in the same way as SyncUnsafeCell + unsafe impl Sync for SyncUnsafeCell {} +} use std::{ - cell::SyncUnsafeCell, mem::{MaybeUninit, size_of}, num::NonZeroU32, ops::{Deref, Range}, @@ -15,6 +40,8 @@ use std::{ use arc_swap::ArcSwapOption; use bevy::prelude::*; use more_asserts::debug_assert_le; +#[cfg(not(feature = "nightly"))] +use sync_unsafe_cell::SyncUnsafeCell; use valence_protocol::MAX_PACKET_SIZE; /// Reference counted fragment. Fragments are a fixed-size block of data which may contain one or @@ -417,7 +444,6 @@ impl RawPacket { Self { fragment, range } } - #[expect(clippy::missing_const_for_fn, reason = "false positive")] #[must_use] pub fn fragment_id(&self) -> usize { self.fragment.id diff --git a/crates/simd-utils/src/lib.rs b/crates/simd-utils/src/lib.rs index e7d899b6..a3d65284 100644 --- a/crates/simd-utils/src/lib.rs +++ b/crates/simd-utils/src/lib.rs @@ -4,15 +4,14 @@ #[cfg(feature = "nightly")] use core::simd; +#[cfg(not(feature = "nightly"))] +use std::iter::zip; #[cfg(feature = "nightly")] use std::{ iter::zip, simd::{LaneCount, Mask, MaskElement, Simd, SupportedLaneCount, cmp::SimdPartialEq}, }; -#[cfg(not(feature = "nightly"))] -use std::iter::zip; - #[cfg(feature = "nightly")] use crate::one_bit_positions::OneBitPositionsExt; @@ -172,7 +171,6 @@ pub fn copy_and_get_diff( /// Scalar (non-SIMD) implementation of [`copy_and_get_diff`] for handling small sections /// or remainders that can't be processed with SIMD. - fn copy_and_get_diff_scalar( start_idx: usize, prev: &mut [T], @@ -196,17 +194,22 @@ fn copy_and_get_diff_scalar( #[cfg(test)] mod tests { + use std::fmt::Debug; + + use super::*; + const LANES: usize = 8; - const SIMD_U32_ALIGN: usize = std::mem::align_of::>(); - use std::fmt::Debug; + #[cfg(feature = "nightly")] + const SIMD_U32_ALIGN: usize = std::mem::align_of::>(); + #[cfg(feature = "nightly")] use aligned_vec::{AVec, RuntimeAlign}; + #[cfg(feature = "nightly")] use proptest::prelude::*; - use super::*; - - // Helper function to collect differences + // Helper function to collect differences (SIMD version) + #[cfg(feature = "nightly")] fn collect_diffs(prev_raw: &[T], current_raw: &[T]) -> Vec<(usize, T, T)> where Simd: AsMut<[T; LANES]> + SimdPartialEq, @@ -226,7 +229,24 @@ mod tests { diffs } + // Helper function to collect differences (non-SIMD version) + #[cfg(not(feature = "nightly"))] + fn collect_diffs(prev_raw: &[T], current_raw: &[T]) -> Vec<(usize, T, T)> + where + T: Copy + PartialEq + Debug, + { + let mut prev = prev_raw.to_vec(); + let current = current_raw; + + let mut diffs = Vec::new(); + copy_and_get_diff::<_, LANES>(&mut prev, current, |idx, prev, curr| { + diffs.push((idx, *prev, *curr)); + }); + diffs + } + // Generate arrays of various sizes to test SIMD boundary conditions + #[cfg(feature = "nightly")] fn generate_array_strategy(min_size: usize) -> impl Strategy> where T: simd::SimdElement + Arbitrary + 'static, @@ -235,6 +255,7 @@ mod tests { } // Generate arrays of an exact size + #[cfg(feature = "nightly")] fn generate_exact_array_strategy(size: usize) -> impl Strategy> where T: simd::SimdElement + Arbitrary + 'static, @@ -245,12 +266,12 @@ mod tests { // Helper to verify that all differences are captured correctly fn verify_differences(prev: &[T], current: &[T], diffs: &[(usize, T, T)]) where - T: simd::SimdElement + PartialEq + Debug + Clone, + T: PartialEq + Debug + Clone, { let mut expected_diffs = Vec::new(); for (idx, (p, c)) in zip(prev, current).enumerate() { if p != c { - expected_diffs.push((idx, *p, *c)); + expected_diffs.push((idx, p.clone(), c.clone())); } } assert_eq!( @@ -260,6 +281,22 @@ mod tests { ); } + // Simple non-SIMD test for stable Rust + #[cfg(not(feature = "nightly"))] + #[test] + fn test_basic_functionality() { + let prev = vec![1u32, 2, 3, 4, 5]; + let current = vec![1u32, 3, 3, 5, 5]; + + let diffs = collect_diffs(&prev, ¤t); + verify_differences(&prev, ¤t, &diffs); + + // Verify that the expected differences were found + let expected_diffs = vec![(1, 2u32, 3u32), (3, 4u32, 5u32)]; + assert_eq!(diffs, expected_diffs); + } + + #[cfg(feature = "nightly")] proptest! { // Test with u32 arrays of various sizes #[test] diff --git a/events/bedwars/src/lib.rs b/events/bedwars/src/lib.rs index 4337b8c7..5b0982e6 100644 --- a/events/bedwars/src/lib.rs +++ b/events/bedwars/src/lib.rs @@ -1,8 +1,3 @@ -#![feature(allocator_api)] -#![feature(let_chains)] -#![feature(stmt_expr_attributes)] -#![feature(exact_size_is_empty)] - use std::net::SocketAddr; use bevy::prelude::*; diff --git a/events/bedwars/src/plugin/block.rs b/events/bedwars/src/plugin/block.rs index b6b5f630..73d6e6c5 100644 --- a/events/bedwars/src/plugin/block.rs +++ b/events/bedwars/src/plugin/block.rs @@ -68,7 +68,7 @@ fn handle_placed_blocks( } }; - if block.collision_shapes().is_empty() { + if block.collision_shapes().len() == 0 { blocks .to_confirm .push(EntityAndSequence::new(*from, *sequence)); diff --git a/events/bedwars/src/plugin/regeneration.rs b/events/bedwars/src/plugin/regeneration.rs index 21c7d8ff..48a78a87 100644 --- a/events/bedwars/src/plugin/regeneration.rs +++ b/events/bedwars/src/plugin/regeneration.rs @@ -30,7 +30,7 @@ fn regenerate( let current_tick = compose.global().tick; for (mut last_damaged, prev_health, mut health) in query { - if *health < **prev_health { + if **health < ***prev_health { last_damaged.tick = current_tick; } diff --git a/events/bedwars/src/plugin/spawn.rs b/events/bedwars/src/plugin/spawn.rs index ba1d45ed..a2c2aca8 100644 --- a/events/bedwars/src/plugin/spawn.rs +++ b/events/bedwars/src/plugin/spawn.rs @@ -111,7 +111,7 @@ pub fn is_valid_spawn_block( return false; }; - if ground.collision_shapes().is_empty() { + if ground.collision_shapes().len() == 0 { return false; } @@ -122,7 +122,7 @@ pub fn is_valid_spawn_block( for displacement in DISPLACEMENTS { let above = pos + displacement; if let Some(block) = blocks.get_block(above) { - if !block.collision_shapes().is_empty() { + if block.collision_shapes().len() != 0 { return false; } diff --git a/tools/packet-inspector/Cargo.toml b/tools/packet-inspector/Cargo.toml deleted file mode 100644 index 5dd74d40..00000000 --- a/tools/packet-inspector/Cargo.toml +++ /dev/null @@ -1,42 +0,0 @@ -[package] -name = "packet-inspector" -description = "A simple Minecraft proxy for inspecting packets." -version.workspace = true -edition.workspace = true -repository.workspace = true -documentation.workspace = true -license.workspace = true -publish = false - -[lints] -workspace = true - -[dependencies] -valence_protocol = { git = 'https://github.com/TestingPlant/valence', branch = 'feat-open', features = ["compression"] } -anyhow.workspace = true -bytes.workspace = true -flate2.workspace = true -flume.workspace = true -tokio = { workspace = true, features = ["full"] } -tracing.workspace = true -time = { workspace = true, features = ["local-offset"] } -egui.workspace = true -eframe = { workspace = true, features = [ - "persistence", - "wgpu", -] } -egui_dock = { workspace = true, features = ["serde"] } -itertools.workspace = true -syntect = { workspace = true, default-features = false, features = [ - "default-fancy", -] } -serde = { workspace = true, features = ["derive"] } - -[build-dependencies] -anyhow.workspace = true -syn = { workspace = true, features = ["full"] } -valence_build_utils = { git = 'https://github.com/TestingPlant/valence', branch = 'feat-open' } -quote = { workspace = true, features = ["proc-macro"] } -serde_json = { workspace = true, features = ["raw_value"] } -proc-macro2.workspace = true -serde = { workspace = true, features = ["derive"] } diff --git a/tools/packet-inspector/README.md b/tools/packet-inspector/README.md deleted file mode 100644 index 4cff51ef..00000000 --- a/tools/packet-inspector/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# Packet Inspector - -![packet inspector screenshot](https://raw.githubusercontent.com/valence-rs/valence/main/assets/packet-inspector.png) - -The packet inspector is a Minecraft proxy for viewing the contents of packets as -they are sent/received. It uses Valence's protocol facilities to display packet -contents. This was made for three purposes: - -- Check that packets between Valence and client are matching your expectations. -- Check that packets between vanilla server and client are parsed correctly by - Valence. -- Understand how the protocol works between the vanilla server and client. - -# Usage - -Firstly, we should have a server running that we're going to be -proxying/inspecting. - -```sh -cargo r -r --example game_of_life -``` - -Next up, we need to run the proxy server, To launch in a GUI environment, simply run `packet_inspector`. - -```sh -cargo r -r -p packet_inspector -``` - -Then click the "Start Listening" button in the top left of the UI. - -The client can now connect to `localhost:25566`. You should see packets streaming in on the GUI. - -## Quick start with Vanilla Server via Docker - -Start the server - -```sh -docker run -e EULA=TRUE -e ONLINE_MODE=false -e ANNOUNCE_PLAYER_ACHIEVEMENTS=false -e GENERATE_STRUCTURES=false -e SPAWN_ANIMALS=false -e SPAWN_MONSTERS=false -e SPAWN_NPCS=false -e SPAWN_PROTECTION=0 -e VIEW_DISTANCE=16 -e MODE=creative -e LEVEL_TYPE=flat -e RCON_CMDS_STARTUP="gamerule doWeatherCycle false" -d -p 25565:25565 --name mc itzg/minecraft-server -``` - -View server logs - -```sh -docker logs -f mc -``` - -Server Rcon - -```sh -docker exec -i mc rcon-cli -``` - -In a separate terminal, start the packet inspector. - -```sh -cargo r -r -p packet_inspector --no-default-features --features cli -- 127.0.0.1:25566 127.0.0.1:25565 -``` - -Open Minecraft and connect to `localhost:25566`. - -Clean up - -``` -docker stop mc -docker rm mc -``` diff --git a/tools/packet-inspector/build.rs b/tools/packet-inspector/build.rs deleted file mode 100644 index c03470f6..00000000 --- a/tools/packet-inspector/build.rs +++ /dev/null @@ -1,217 +0,0 @@ -use std::collections::HashMap; - -use proc_macro2::TokenStream; -use quote::quote; -use serde::Deserialize; -use valence_build_utils::write_generated_file; - -#[derive(Deserialize)] -struct Packet { - name: String, - side: String, - state: String, - id: i32, -} - -pub fn main() -> anyhow::Result<()> { - let packets: Vec = serde_json::from_str(include_str!("extracted/packets.json"))?; - - write_packets(&packets)?; - write_transformer(&packets)?; - - Ok(()) -} - -fn write_packets(packets: &Vec) -> anyhow::Result<()> { - let mut consts = quote! { - #[allow(clippy::unseparated_literal_suffix)] - - }; - - let len = packets.len(); - - let mut p: Vec = Vec::new(); - - for packet in packets { - let name = packet.name.strip_suffix("Packet").unwrap_or(&packet.name); - // lowercase the last character of name - let name = { - let mut chars = name.chars(); - let last_char = chars.next_back().unwrap(); - let last_char = last_char.to_lowercase().to_string(); - let mut name = chars.collect::(); - name.push_str(&last_char); - name - }; - - // if the packet is clientbound, but the name does not ends with S2c, add it - let name = if packet.side == "clientbound" && !name.ends_with("S2c") { - format!("{name}S2c") - } else { - name - }; - - // same for serverbound - let name = if packet.side == "serverbound" && !name.ends_with("C2s") { - format!("{name}C2s") - } else { - name - }; - - let id = packet.id; - let side = match packet.side.as_str() { - "clientbound" => quote! { valence_protocol::PacketSide::Clientbound }, - "serverbound" => quote! { valence_protocol::PacketSide::Serverbound }, - _ => unreachable!(), - }; - - let state = match packet.state.as_str() { - "handshaking" => quote! { valence_protocol::PacketState::Handshaking }, - "status" => quote! { valence_protocol::PacketState::Status }, - "login" => quote! { valence_protocol::PacketState::Login }, - "play" => quote! { valence_protocol::PacketState::Play }, - _ => unreachable!(), - }; - - // const STD_PACKETS = - // [PacketSide::Client(PacketState::Handshaking(Packet{..})), ..]; - p.push(quote! { - crate::packet_registry::Packet { - id: #id, - side: #side, - state: #state, - timestamp: None, - name: #name, - data: None, - } - }); - } - - consts.extend([quote! { - pub const STD_PACKETS: [crate::packet_registry::Packet; #len] = [ - #(#p),* - ]; - }]); - - write_generated_file(consts, "packets.rs")?; - - Ok(()) -} - -fn write_transformer(packets: &[Packet]) -> anyhow::Result<()> { - // HashMap>> - let grouped_packets = HashMap::>>::new(); - - let mut grouped_packets = packets.iter().fold(grouped_packets, |mut acc, packet| { - let side = match packet.side.as_str() { - "serverbound" => "Serverbound".to_owned(), - "clientbound" => "Clientbound".to_owned(), - _ => panic!("Invalid side"), - }; - - let state = match packet.state.as_str() { - "handshaking" => "Handshaking".to_owned(), - "status" => "Status".to_owned(), - "login" => "Login".to_owned(), - "play" => "Play".to_owned(), - _ => panic!("Invalid state"), - }; - - let name = packet - .name - .strip_suffix("Packet") - .unwrap_or(&packet.name) - .to_owned(); - - // lowercase the last character of name - let name = { - let mut chars = name.chars(); - let last_char = chars.next_back().unwrap(); - let last_char = last_char.to_lowercase().to_string(); - let mut name = chars.collect::(); - name.push_str(&last_char); - name - }; - - // if the packet is clientbound, but the name does not ends with S2c, add it - let name = if side == "Clientbound" && !name.ends_with("S2c") { - format!("{name}S2c") - } else { - name - }; - - // same for serverbound - let name = if side == "Serverbound" && !name.ends_with("C2s") { - format!("{name}C2s") - } else { - name - }; - - let state_map = acc.entry(side).or_default(); - let id_map = state_map.entry(state).or_default(); - id_map.push(name); - - acc - }); - - let mut generated = TokenStream::new(); - - for (side, state_map) in &mut grouped_packets { - let mut side_arms = TokenStream::new(); - for (state, id_map) in state_map.iter_mut() { - let mut match_arms = TokenStream::new(); - - for name in id_map.iter_mut() { - let name = syn::parse_str::(name).unwrap(); - - match_arms.extend(quote! { - #name::ID => { - Ok(format!("{:#?}", #name::decode(&mut data))) - } - }); - } - - let state = syn::parse_str::(state).unwrap(); - - side_arms.extend(quote! { - valence_protocol::PacketState::#state => match packet.id { - #match_arms - _ => Ok(NOT_AVAILABLE.to_owned()), - }, - }); - } - - if side == "Clientbound" { - side_arms.extend(quote! { - _ => Ok(NOT_AVAILABLE.to_owned()), - }); - } - - let side = syn::parse_str::(side).unwrap(); - - generated.extend(quote! { - valence_protocol::PacketSide::#side => match packet.state { - #side_arms - }, - }); - } - - // wrap generated in a function definition - let generated = quote! { - const NOT_AVAILABLE: &str = "Not yet implemented"; - - #[allow(clippy::match_wildcard_for_single_variants)] - pub(crate) fn packet_to_string(packet: &ProxyPacket) -> Result> { - let bytes = packet.data.as_ref().unwrap(); - let mut data = &bytes.clone()[..]; - - match packet.side { - #generated - } - } - }; - - write_generated_file(generated, "packet_to_string.rs")?; - - Ok(()) -} diff --git a/tools/packet-inspector/extracted/packets.json b/tools/packet-inspector/extracted/packets.json deleted file mode 100644 index b9d6c757..00000000 --- a/tools/packet-inspector/extracted/packets.json +++ /dev/null @@ -1,1052 +0,0 @@ -[ - { - "name": "HandshakeC2SPacket", - "side": "serverbound", - "state": "handshaking", - "id": 0 - }, - { - "name": "TeleportConfirmC2SPacket", - "side": "serverbound", - "state": "play", - "id": 0 - }, - { - "name": "QueryBlockNbtC2SPacket", - "side": "serverbound", - "state": "play", - "id": 1 - }, - { - "name": "UpdateDifficultyC2SPacket", - "side": "serverbound", - "state": "play", - "id": 2 - }, - { - "name": "MessageAcknowledgmentC2SPacket", - "side": "serverbound", - "state": "play", - "id": 3 - }, - { - "name": "CommandExecutionC2SPacket", - "side": "serverbound", - "state": "play", - "id": 4 - }, - { - "name": "ChatMessageC2SPacket", - "side": "serverbound", - "state": "play", - "id": 5 - }, - { - "name": "PlayerSessionC2SPacket", - "side": "serverbound", - "state": "play", - "id": 6 - }, - { - "name": "ClientStatusC2SPacket", - "side": "serverbound", - "state": "play", - "id": 7 - }, - { - "name": "ClientSettingsC2SPacket", - "side": "serverbound", - "state": "play", - "id": 8 - }, - { - "name": "RequestCommandCompletionsC2SPacket", - "side": "serverbound", - "state": "play", - "id": 9 - }, - { - "name": "ButtonClickC2SPacket", - "side": "serverbound", - "state": "play", - "id": 10 - }, - { - "name": "ClickSlotC2SPacket", - "side": "serverbound", - "state": "play", - "id": 11 - }, - { - "name": "CloseHandledScreenC2SPacket", - "side": "serverbound", - "state": "play", - "id": 12 - }, - { - "name": "CustomPayloadC2SPacket", - "side": "serverbound", - "state": "play", - "id": 13 - }, - { - "name": "BookUpdateC2SPacket", - "side": "serverbound", - "state": "play", - "id": 14 - }, - { - "name": "QueryEntityNbtC2SPacket", - "side": "serverbound", - "state": "play", - "id": 15 - }, - { - "name": "PlayerInteractEntityC2SPacket", - "side": "serverbound", - "state": "play", - "id": 16 - }, - { - "name": "JigsawGeneratingC2SPacket", - "side": "serverbound", - "state": "play", - "id": 17 - }, - { - "name": "KeepAliveC2SPacket", - "side": "serverbound", - "state": "play", - "id": 18 - }, - { - "name": "UpdateDifficultyLockC2SPacket", - "side": "serverbound", - "state": "play", - "id": 19 - }, - { - "name": "PositionAndOnGround", - "side": "serverbound", - "state": "play", - "id": 20 - }, - { - "name": "Full", - "side": "serverbound", - "state": "play", - "id": 21 - }, - { - "name": "LookAndOnGround", - "side": "serverbound", - "state": "play", - "id": 22 - }, - { - "name": "OnGroundOnly", - "side": "serverbound", - "state": "play", - "id": 23 - }, - { - "name": "VehicleMoveC2SPacket", - "side": "serverbound", - "state": "play", - "id": 24 - }, - { - "name": "BoatPaddleStateC2SPacket", - "side": "serverbound", - "state": "play", - "id": 25 - }, - { - "name": "PickFromInventoryC2SPacket", - "side": "serverbound", - "state": "play", - "id": 26 - }, - { - "name": "CraftRequestC2SPacket", - "side": "serverbound", - "state": "play", - "id": 27 - }, - { - "name": "UpdatePlayerAbilitiesC2SPacket", - "side": "serverbound", - "state": "play", - "id": 28 - }, - { - "name": "PlayerActionC2SPacket", - "side": "serverbound", - "state": "play", - "id": 29 - }, - { - "name": "ClientCommandC2SPacket", - "side": "serverbound", - "state": "play", - "id": 30 - }, - { - "name": "PlayerInputC2SPacket", - "side": "serverbound", - "state": "play", - "id": 31 - }, - { - "name": "PlayPongC2SPacket", - "side": "serverbound", - "state": "play", - "id": 32 - }, - { - "name": "RecipeCategoryOptionsC2SPacket", - "side": "serverbound", - "state": "play", - "id": 33 - }, - { - "name": "RecipeBookDataC2SPacket", - "side": "serverbound", - "state": "play", - "id": 34 - }, - { - "name": "RenameItemC2SPacket", - "side": "serverbound", - "state": "play", - "id": 35 - }, - { - "name": "ResourcePackStatusC2SPacket", - "side": "serverbound", - "state": "play", - "id": 36 - }, - { - "name": "AdvancementTabC2SPacket", - "side": "serverbound", - "state": "play", - "id": 37 - }, - { - "name": "SelectMerchantTradeC2SPacket", - "side": "serverbound", - "state": "play", - "id": 38 - }, - { - "name": "UpdateBeaconC2SPacket", - "side": "serverbound", - "state": "play", - "id": 39 - }, - { - "name": "UpdateSelectedSlotC2SPacket", - "side": "serverbound", - "state": "play", - "id": 40 - }, - { - "name": "UpdateCommandBlockC2SPacket", - "side": "serverbound", - "state": "play", - "id": 41 - }, - { - "name": "UpdateCommandBlockMinecartC2SPacket", - "side": "serverbound", - "state": "play", - "id": 42 - }, - { - "name": "CreativeInventoryActionC2SPacket", - "side": "serverbound", - "state": "play", - "id": 43 - }, - { - "name": "UpdateJigsawC2SPacket", - "side": "serverbound", - "state": "play", - "id": 44 - }, - { - "name": "UpdateStructureBlockC2SPacket", - "side": "serverbound", - "state": "play", - "id": 45 - }, - { - "name": "UpdateSignC2SPacket", - "side": "serverbound", - "state": "play", - "id": 46 - }, - { - "name": "HandSwingC2SPacket", - "side": "serverbound", - "state": "play", - "id": 47 - }, - { - "name": "SpectatorTeleportC2SPacket", - "side": "serverbound", - "state": "play", - "id": 48 - }, - { - "name": "PlayerInteractBlockC2SPacket", - "side": "serverbound", - "state": "play", - "id": 49 - }, - { - "name": "PlayerInteractItemC2SPacket", - "side": "serverbound", - "state": "play", - "id": 50 - }, - { - "name": "QueryRequestC2SPacket", - "side": "serverbound", - "state": "status", - "id": 0 - }, - { - "name": "QueryPingC2SPacket", - "side": "serverbound", - "state": "status", - "id": 1 - }, - { - "name": "LoginHelloC2SPacket", - "side": "serverbound", - "state": "login", - "id": 0 - }, - { - "name": "LoginKeyC2SPacket", - "side": "serverbound", - "state": "login", - "id": 1 - }, - { - "name": "LoginQueryResponseC2SPacket", - "side": "serverbound", - "state": "login", - "id": 2 - }, - { - "name": "BundleSplitterPacket", - "side": "clientbound", - "state": "play", - "id": 0 - }, - { - "name": "EntitySpawnS2CPacket", - "side": "clientbound", - "state": "play", - "id": 1 - }, - { - "name": "ExperienceOrbSpawnS2CPacket", - "side": "clientbound", - "state": "play", - "id": 2 - }, - { - "name": "PlayerSpawnS2CPacket", - "side": "clientbound", - "state": "play", - "id": 3 - }, - { - "name": "EntityAnimationS2CPacket", - "side": "clientbound", - "state": "play", - "id": 4 - }, - { - "name": "StatisticsS2CPacket", - "side": "clientbound", - "state": "play", - "id": 5 - }, - { - "name": "PlayerActionResponseS2CPacket", - "side": "clientbound", - "state": "play", - "id": 6 - }, - { - "name": "BlockBreakingProgressS2CPacket", - "side": "clientbound", - "state": "play", - "id": 7 - }, - { - "name": "BlockEntityUpdateS2CPacket", - "side": "clientbound", - "state": "play", - "id": 8 - }, - { - "name": "BlockEventS2CPacket", - "side": "clientbound", - "state": "play", - "id": 9 - }, - { - "name": "BlockUpdateS2CPacket", - "side": "clientbound", - "state": "play", - "id": 10 - }, - { - "name": "BossBarS2CPacket", - "side": "clientbound", - "state": "play", - "id": 11 - }, - { - "name": "DifficultyS2CPacket", - "side": "clientbound", - "state": "play", - "id": 12 - }, - { - "name": "ChunkBiomeDataS2CPacket", - "side": "clientbound", - "state": "play", - "id": 13 - }, - { - "name": "ClearTitleS2CPacket", - "side": "clientbound", - "state": "play", - "id": 14 - }, - { - "name": "CommandSuggestionsS2CPacket", - "side": "clientbound", - "state": "play", - "id": 15 - }, - { - "name": "CommandTreeS2CPacket", - "side": "clientbound", - "state": "play", - "id": 16 - }, - { - "name": "CloseScreenS2CPacket", - "side": "clientbound", - "state": "play", - "id": 17 - }, - { - "name": "InventoryS2CPacket", - "side": "clientbound", - "state": "play", - "id": 18 - }, - { - "name": "ScreenHandlerPropertyUpdateS2CPacket", - "side": "clientbound", - "state": "play", - "id": 19 - }, - { - "name": "ScreenHandlerSlotUpdateS2CPacket", - "side": "clientbound", - "state": "play", - "id": 20 - }, - { - "name": "CooldownUpdateS2CPacket", - "side": "clientbound", - "state": "play", - "id": 21 - }, - { - "name": "ChatSuggestionsS2CPacket", - "side": "clientbound", - "state": "play", - "id": 22 - }, - { - "name": "CustomPayloadS2CPacket", - "side": "clientbound", - "state": "play", - "id": 23 - }, - { - "name": "EntityDamageS2CPacket", - "side": "clientbound", - "state": "play", - "id": 24 - }, - { - "name": "RemoveMessageS2CPacket", - "side": "clientbound", - "state": "play", - "id": 25 - }, - { - "name": "DisconnectS2CPacket", - "side": "clientbound", - "state": "play", - "id": 26 - }, - { - "name": "ProfilelessChatMessageS2CPacket", - "side": "clientbound", - "state": "play", - "id": 27 - }, - { - "name": "EntityStatusS2CPacket", - "side": "clientbound", - "state": "play", - "id": 28 - }, - { - "name": "ExplosionS2CPacket", - "side": "clientbound", - "state": "play", - "id": 29 - }, - { - "name": "UnloadChunkS2CPacket", - "side": "clientbound", - "state": "play", - "id": 30 - }, - { - "name": "GameStateChangeS2CPacket", - "side": "clientbound", - "state": "play", - "id": 31 - }, - { - "name": "OpenHorseScreenS2CPacket", - "side": "clientbound", - "state": "play", - "id": 32 - }, - { - "name": "DamageTiltS2CPacket", - "side": "clientbound", - "state": "play", - "id": 33 - }, - { - "name": "WorldBorderInitializeS2CPacket", - "side": "clientbound", - "state": "play", - "id": 34 - }, - { - "name": "KeepAliveS2CPacket", - "side": "clientbound", - "state": "play", - "id": 35 - }, - { - "name": "ChunkDataS2CPacket", - "side": "clientbound", - "state": "play", - "id": 36 - }, - { - "name": "WorldEventS2CPacket", - "side": "clientbound", - "state": "play", - "id": 37 - }, - { - "name": "ParticleS2CPacket", - "side": "clientbound", - "state": "play", - "id": 38 - }, - { - "name": "LightUpdateS2CPacket", - "side": "clientbound", - "state": "play", - "id": 39 - }, - { - "name": "GameJoinS2CPacket", - "side": "clientbound", - "state": "play", - "id": 40 - }, - { - "name": "MapUpdateS2CPacket", - "side": "clientbound", - "state": "play", - "id": 41 - }, - { - "name": "SetTradeOffersS2CPacket", - "side": "clientbound", - "state": "play", - "id": 42 - }, - { - "name": "MoveRelative", - "side": "clientbound", - "state": "play", - "id": 43 - }, - { - "name": "RotateAndMoveRelative", - "side": "clientbound", - "state": "play", - "id": 44 - }, - { - "name": "Rotate", - "side": "clientbound", - "state": "play", - "id": 45 - }, - { - "name": "VehicleMoveS2CPacket", - "side": "clientbound", - "state": "play", - "id": 46 - }, - { - "name": "OpenWrittenBookS2CPacket", - "side": "clientbound", - "state": "play", - "id": 47 - }, - { - "name": "OpenScreenS2CPacket", - "side": "clientbound", - "state": "play", - "id": 48 - }, - { - "name": "SignEditorOpenS2CPacket", - "side": "clientbound", - "state": "play", - "id": 49 - }, - { - "name": "PlayPingS2CPacket", - "side": "clientbound", - "state": "play", - "id": 50 - }, - { - "name": "CraftFailedResponseS2CPacket", - "side": "clientbound", - "state": "play", - "id": 51 - }, - { - "name": "PlayerAbilitiesS2CPacket", - "side": "clientbound", - "state": "play", - "id": 52 - }, - { - "name": "ChatMessageS2CPacket", - "side": "clientbound", - "state": "play", - "id": 53 - }, - { - "name": "EndCombatS2CPacket", - "side": "clientbound", - "state": "play", - "id": 54 - }, - { - "name": "EnterCombatS2CPacket", - "side": "clientbound", - "state": "play", - "id": 55 - }, - { - "name": "DeathMessageS2CPacket", - "side": "clientbound", - "state": "play", - "id": 56 - }, - { - "name": "PlayerRemoveS2CPacket", - "side": "clientbound", - "state": "play", - "id": 57 - }, - { - "name": "PlayerListS2CPacket", - "side": "clientbound", - "state": "play", - "id": 58 - }, - { - "name": "LookAtS2CPacket", - "side": "clientbound", - "state": "play", - "id": 59 - }, - { - "name": "PlayerPositionLookS2CPacket", - "side": "clientbound", - "state": "play", - "id": 60 - }, - { - "name": "UnlockRecipesS2CPacket", - "side": "clientbound", - "state": "play", - "id": 61 - }, - { - "name": "EntitiesDestroyS2CPacket", - "side": "clientbound", - "state": "play", - "id": 62 - }, - { - "name": "RemoveEntityStatusEffectS2CPacket", - "side": "clientbound", - "state": "play", - "id": 63 - }, - { - "name": "ResourcePackSendS2CPacket", - "side": "clientbound", - "state": "play", - "id": 64 - }, - { - "name": "PlayerRespawnS2CPacket", - "side": "clientbound", - "state": "play", - "id": 65 - }, - { - "name": "EntitySetHeadYawS2CPacket", - "side": "clientbound", - "state": "play", - "id": 66 - }, - { - "name": "ChunkDeltaUpdateS2CPacket", - "side": "clientbound", - "state": "play", - "id": 67 - }, - { - "name": "SelectAdvancementTabS2CPacket", - "side": "clientbound", - "state": "play", - "id": 68 - }, - { - "name": "ServerMetadataS2CPacket", - "side": "clientbound", - "state": "play", - "id": 69 - }, - { - "name": "OverlayMessageS2CPacket", - "side": "clientbound", - "state": "play", - "id": 70 - }, - { - "name": "WorldBorderCenterChangedS2CPacket", - "side": "clientbound", - "state": "play", - "id": 71 - }, - { - "name": "WorldBorderInterpolateSizeS2CPacket", - "side": "clientbound", - "state": "play", - "id": 72 - }, - { - "name": "WorldBorderSizeChangedS2CPacket", - "side": "clientbound", - "state": "play", - "id": 73 - }, - { - "name": "WorldBorderWarningTimeChangedS2CPacket", - "side": "clientbound", - "state": "play", - "id": 74 - }, - { - "name": "WorldBorderWarningBlocksChangedS2CPacket", - "side": "clientbound", - "state": "play", - "id": 75 - }, - { - "name": "SetCameraEntityS2CPacket", - "side": "clientbound", - "state": "play", - "id": 76 - }, - { - "name": "UpdateSelectedSlotS2CPacket", - "side": "clientbound", - "state": "play", - "id": 77 - }, - { - "name": "ChunkRenderDistanceCenterS2CPacket", - "side": "clientbound", - "state": "play", - "id": 78 - }, - { - "name": "ChunkLoadDistanceS2CPacket", - "side": "clientbound", - "state": "play", - "id": 79 - }, - { - "name": "PlayerSpawnPositionS2CPacket", - "side": "clientbound", - "state": "play", - "id": 80 - }, - { - "name": "ScoreboardDisplayS2CPacket", - "side": "clientbound", - "state": "play", - "id": 81 - }, - { - "name": "EntityTrackerUpdateS2CPacket", - "side": "clientbound", - "state": "play", - "id": 82 - }, - { - "name": "EntityAttachS2CPacket", - "side": "clientbound", - "state": "play", - "id": 83 - }, - { - "name": "EntityVelocityUpdateS2CPacket", - "side": "clientbound", - "state": "play", - "id": 84 - }, - { - "name": "EntityEquipmentUpdateS2CPacket", - "side": "clientbound", - "state": "play", - "id": 85 - }, - { - "name": "ExperienceBarUpdateS2CPacket", - "side": "clientbound", - "state": "play", - "id": 86 - }, - { - "name": "HealthUpdateS2CPacket", - "side": "clientbound", - "state": "play", - "id": 87 - }, - { - "name": "ScoreboardObjectiveUpdateS2CPacket", - "side": "clientbound", - "state": "play", - "id": 88 - }, - { - "name": "EntityPassengersSetS2CPacket", - "side": "clientbound", - "state": "play", - "id": 89 - }, - { - "name": "TeamS2CPacket", - "side": "clientbound", - "state": "play", - "id": 90 - }, - { - "name": "ScoreboardPlayerUpdateS2CPacket", - "side": "clientbound", - "state": "play", - "id": 91 - }, - { - "name": "SimulationDistanceS2CPacket", - "side": "clientbound", - "state": "play", - "id": 92 - }, - { - "name": "SubtitleS2CPacket", - "side": "clientbound", - "state": "play", - "id": 93 - }, - { - "name": "WorldTimeUpdateS2CPacket", - "side": "clientbound", - "state": "play", - "id": 94 - }, - { - "name": "TitleS2CPacket", - "side": "clientbound", - "state": "play", - "id": 95 - }, - { - "name": "TitleFadeS2CPacket", - "side": "clientbound", - "state": "play", - "id": 96 - }, - { - "name": "PlaySoundFromEntityS2CPacket", - "side": "clientbound", - "state": "play", - "id": 97 - }, - { - "name": "PlaySoundS2CPacket", - "side": "clientbound", - "state": "play", - "id": 98 - }, - { - "name": "StopSoundS2CPacket", - "side": "clientbound", - "state": "play", - "id": 99 - }, - { - "name": "GameMessageS2CPacket", - "side": "clientbound", - "state": "play", - "id": 100 - }, - { - "name": "PlayerListHeaderS2CPacket", - "side": "clientbound", - "state": "play", - "id": 101 - }, - { - "name": "NbtQueryResponseS2CPacket", - "side": "clientbound", - "state": "play", - "id": 102 - }, - { - "name": "ItemPickupAnimationS2CPacket", - "side": "clientbound", - "state": "play", - "id": 103 - }, - { - "name": "EntityPositionS2CPacket", - "side": "clientbound", - "state": "play", - "id": 104 - }, - { - "name": "AdvancementUpdateS2CPacket", - "side": "clientbound", - "state": "play", - "id": 105 - }, - { - "name": "EntityAttributesS2CPacket", - "side": "clientbound", - "state": "play", - "id": 106 - }, - { - "name": "FeaturesS2CPacket", - "side": "clientbound", - "state": "play", - "id": 107 - }, - { - "name": "EntityStatusEffectS2CPacket", - "side": "clientbound", - "state": "play", - "id": 108 - }, - { - "name": "SynchronizeRecipesS2CPacket", - "side": "clientbound", - "state": "play", - "id": 109 - }, - { - "name": "SynchronizeTagsS2CPacket", - "side": "clientbound", - "state": "play", - "id": 110 - }, - { - "name": "QueryResponseS2CPacket", - "side": "clientbound", - "state": "status", - "id": 0 - }, - { - "name": "QueryPongS2CPacket", - "side": "clientbound", - "state": "status", - "id": 1 - }, - { - "name": "LoginDisconnectS2CPacket", - "side": "clientbound", - "state": "login", - "id": 0 - }, - { - "name": "LoginHelloS2CPacket", - "side": "clientbound", - "state": "login", - "id": 1 - }, - { - "name": "LoginSuccessS2CPacket", - "side": "clientbound", - "state": "login", - "id": 2 - }, - { - "name": "LoginCompressionS2CPacket", - "side": "clientbound", - "state": "login", - "id": 3 - }, - { - "name": "LoginQueryRequestS2CPacket", - "side": "clientbound", - "state": "login", - "id": 4 - } -] \ No newline at end of file diff --git a/tools/packet-inspector/src/app.rs b/tools/packet-inspector/src/app.rs deleted file mode 100644 index 814c3fa1..00000000 --- a/tools/packet-inspector/src/app.rs +++ /dev/null @@ -1,197 +0,0 @@ -use std::{ - net::SocketAddr, - sync::{Arc, RwLock}, -}; - -use egui_dock::{DockArea, DockState, NodeIndex, Style}; -use packet_inspector::Proxy; -use tokio::task::JoinHandle; - -use crate::shared_state::{Event, SharedState}; - -mod connection; -mod filter; -mod hex_viewer; - -mod packet_list; - -mod text_viewer; - -pub trait View { - fn ui(&mut self, ui: &mut egui::Ui, shared_state: &mut SharedState); -} - -/// Something to view -pub trait Tab: View { - fn new() -> Self - where - Self: Sized; - - /// `&'static` so we can also use it as a key to store open/close state. - fn name(&self) -> &'static str; -} - -struct TabViewer { - shared_state: Arc>, -} - -impl egui_dock::TabViewer for TabViewer { - type Tab = Box; - - fn ui(&mut self, ui: &mut egui::Ui, tab: &mut Self::Tab) { - tab.ui(ui, &mut self.shared_state.write().unwrap()); - } - - fn title(&mut self, tab: &mut Self::Tab) -> egui::WidgetText { - tab.name().into() - } - - fn on_close(&mut self, _tab: &mut Self::Tab) -> bool { - false - } -} - -pub struct GuiApp { - tree: DockState>, - shared_state: Arc>, - tab_viewer: TabViewer, -} - -impl GuiApp { - pub(crate) fn new(cc: &eframe::CreationContext<'_>) -> Self { - let ctx = cc.egui_ctx.clone(); - - // Default Application Layout - let mut tree: DockState> = - DockState::new(vec![Box::new(connection::Connection::new())]); - - let [a, b] = tree - .main_surface_mut() - .split_right(NodeIndex::root(), 0.3, vec![Box::new( - packet_list::PacketList::new(), - )]); - - let [_, _] = tree - .main_surface_mut() - .split_below(a, 0.25, vec![Box::new(filter::Filter::new())]); - let [_, _] = tree.main_surface_mut().split_below(b, 0.5, vec![ - Box::new(text_viewer::TextView::new()), - Box::new(hex_viewer::HexView::new()), - ]); - - // Persistent Storage - let mut shared_state = SharedState::new(ctx); - - if let Some(storage) = cc.storage { - if let Some(value) = eframe::get_value::(storage, eframe::APP_KEY) { - shared_state = value.merge(shared_state); - } - } - - let autostart = shared_state.autostart; - let shared_state = Arc::new(RwLock::new(shared_state)); - - // Event Handling - handle_events(shared_state.clone()); - - if autostart { - let state = shared_state.read().unwrap(); - state.send_event(Event::StartListening); - } - - // Consumer thread - - // Tab Viewer - let tab_viewer = TabViewer { - shared_state: shared_state.clone(), - }; - - Self { - tree, - shared_state, - tab_viewer, - } - } -} - -impl eframe::App for GuiApp { - fn save(&mut self, storage: &mut dyn eframe::Storage) { - eframe::set_value( - storage, - eframe::APP_KEY, - &*self.shared_state.read().unwrap(), - ); - } - - fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { - DockArea::new(&mut self.tree) - .show_add_buttons(false) - .show_add_popup(false) - .show_close_buttons(false) - .style(Style::from_egui(ctx.style().as_ref())) - .show(ctx, &mut self.tab_viewer); - } -} - -// This function is getting waaaay too complicated and messy -fn handle_events(state: Arc>) { - tokio::spawn(async move { - let mut proxy_thread: Option> = None; - - let receiver = state.write().unwrap().receiver.take().unwrap(); - while let Ok(event) = receiver.recv_async().await { - match event { - Event::StartListening => { - let mut w_state = state.write().unwrap(); - if w_state.is_listening { - continue; - } - - let Ok(listener_addr) = w_state.listener_addr.parse::() else { - w_state.is_listening = false; - continue; - }; - let Ok(server_addr) = w_state.server_addr.parse::() else { - w_state.is_listening = false; - continue; - }; - - let state = state.clone(); - - proxy_thread = Some(tokio::spawn(async move { - let proxy = Proxy::start(listener_addr, server_addr).await?; - let receiver = proxy.subscribe().await; - - while let Ok(packet) = receiver.recv_async().await { - let state = state.read().unwrap(); - state.packets.write().unwrap().push(packet); - state.send_event(Event::PacketReceived); - } - - Ok::<(), anyhow::Error>(()) - })); - - w_state.is_listening = true; - } - Event::StopListening => { - let mut state = state.write().unwrap(); - if !state.is_listening { - continue; - } - - if let Some(proxy_thread) = proxy_thread.take() { - proxy_thread.abort(); - } - - state.is_listening = false; - } - Event::PacketReceived => { - // Refresh UI - if let Some(ctx) = &state.read().unwrap().ctx { - ctx.request_repaint(); - } - } - } - } - }); -} diff --git a/tools/packet-inspector/src/app/connection.rs b/tools/packet-inspector/src/app/connection.rs deleted file mode 100644 index 73b86f42..00000000 --- a/tools/packet-inspector/src/app/connection.rs +++ /dev/null @@ -1,44 +0,0 @@ -use super::{SharedState, Tab, View}; -use crate::shared_state::Event; - -pub struct Connection; - -impl Tab for Connection { - fn new() -> Self { - Self {} - } - - fn name(&self) -> &'static str { - "Connection" - } -} - -impl View for Connection { - fn ui(&mut self, ui: &mut egui::Ui, state: &mut SharedState) { - ui.label("Listener Address"); - - if state.is_listening { - ui.text_edit_singleline(&mut state.listener_addr.clone()); - ui.label("Server Address"); - ui.text_edit_singleline(&mut state.server_addr.clone()); - - ui.horizontal(|ui| { - if ui.button("Stop Listening").clicked() { - state.send_event(Event::StopListening); - } - ui.checkbox(&mut state.autostart, "Autostart"); - }); - } else { - ui.label("Listener Address"); - ui.text_edit_singleline(&mut state.listener_addr); - ui.label("Server Address"); - ui.text_edit_singleline(&mut state.server_addr); - ui.horizontal(|ui| { - if ui.button("Start Listening").clicked() { - state.send_event(Event::StartListening); - } - ui.checkbox(&mut state.autostart, "Autostart"); - }); - } - } -} diff --git a/tools/packet-inspector/src/app/filter.rs b/tools/packet-inspector/src/app/filter.rs deleted file mode 100644 index 1171af73..00000000 --- a/tools/packet-inspector/src/app/filter.rs +++ /dev/null @@ -1,152 +0,0 @@ -use egui::{RichText, TextEdit, Ui, Widget}; -use itertools::Itertools; -use valence_protocol::PacketState; - -use super::{SharedState, Tab, View}; -use crate::tri_checkbox::{TriCheckbox, TriCheckboxState}; - -pub struct Filter; - -impl Tab for Filter { - fn new() -> Self { - Self {} - } - - fn name(&self) -> &'static str { - "Filters" - } -} - -impl View for Filter { - fn ui(&mut self, ui: &mut egui::Ui, state: &mut SharedState) { - ui.horizontal(|ui| { - ui.label("Search:"); - if ui.button("x").clicked() { - state.packet_search.clear(); - } - TextEdit::singleline(&mut state.packet_search) - .hint_text("Filter shown packets, e.g \"0x00\" or \"S2c\"") - .ui(ui); - }); - - egui::ScrollArea::vertical() - .auto_shrink([false, false]) - .stick_to_bottom(false) - .show(ui, |ui| { - if draw_packet_list(ui, state, PacketState::Handshaking) > 0 { - ui.separator(); - } - if draw_packet_list(ui, state, PacketState::Status) > 0 { - ui.separator(); - } - if draw_packet_list(ui, state, PacketState::Login) > 0 { - ui.separator(); - } - draw_packet_list(ui, state, PacketState::Play); - }); - } -} - -fn get_checkbox_state(state: &SharedState, packet_state: PacketState) -> TriCheckboxState { - let mut p_enabled = 0; - let mut disabled = 0; - for (_, enabled) in state - .packet_filter - .iter() - .filter(|(p, _)| p.state == packet_state) - { - if *enabled { - p_enabled += 1; - } else { - disabled += 1; - } - } - if p_enabled > 0 && disabled == 0 { - TriCheckboxState::Enabled - } else if p_enabled > 0 && disabled > 0 { - TriCheckboxState::Partial - } else { - TriCheckboxState::Disabled - } -} - -fn draw_packet_list(ui: &mut Ui, state: &mut SharedState, packet_state: PacketState) -> usize { - let title = match packet_state { - PacketState::Handshaking => "Handshaking", - PacketState::Status => "Status", - PacketState::Login => "Login", - PacketState::Play => "Play", - }; - - let search = state.packet_search.to_lowercase(); - - let count = state - .packet_filter - .iter_mut() - .filter(|(p, _)| { - p.state == packet_state - && (p.name.to_lowercase().contains(&search) - || int_to_hex_lower(p.id).contains(&search)) - }) - .count(); - - let count_enabled = state - .packet_filter - .iter_mut() - .filter(|(p, enabled)| { - p.state == packet_state - && (p.name.to_lowercase().contains(&search) - || int_to_hex_lower(p.id).contains(&search)) - && **enabled - }) - .count(); - - if count == 0 { - return 0; - } - - let mut checkbox = get_checkbox_state(state, packet_state); - if TriCheckbox::new(&mut checkbox, RichText::new(title).heading().strong()) - .ui(ui) - .changed() - { - for (_, enabled) in state.packet_filter.iter_mut().filter(|(p, _)| { - p.state == packet_state - && (p.name.to_lowercase().contains(&search) - || int_to_hex_lower(p.id).contains(&search)) - }) { - if count == count_enabled || count_enabled == 0 { - *enabled = !*enabled; - continue; - } - - *enabled = (count / 2) <= count_enabled; - } - } - - for (p, enabled) in state - .packet_filter - .iter_mut() - .filter(|(p, _)| { - p.state == packet_state - && (p.name.to_lowercase().contains(&search) - || int_to_hex_lower(p.id).contains(&search)) - }) - .sorted_by(|(a, _), (b, _)| { - a.id.cmp(&b.id) - .then((a.side as usize).cmp(&(b.side as usize))) - }) - { - ui.checkbox(enabled, format!("[{}] {}", int_to_hex(p.id), p.name)); - } - - count -} - -fn int_to_hex(i: i32) -> String { - format!("0x{i:0>2X}") -} - -fn int_to_hex_lower(i: i32) -> String { - format!("0x{i:0>2x}") -} diff --git a/tools/packet-inspector/src/app/hex_viewer.rs b/tools/packet-inspector/src/app/hex_viewer.rs deleted file mode 100644 index be4dbf92..00000000 --- a/tools/packet-inspector/src/app/hex_viewer.rs +++ /dev/null @@ -1,72 +0,0 @@ -use std::io::Read; - -use super::{SharedState, Tab, View}; - -pub struct HexView; - -impl Tab for HexView { - fn new() -> Self { - Self {} - } - - fn name(&self) -> &'static str { - "Hex Viewer" - } -} - -impl View for HexView { - fn ui(&mut self, ui: &mut egui::Ui, state: &mut SharedState) { - let mut buf = [0_u8; 16]; - let mut count = 0; - - let packets = state.packets.read().unwrap(); - let Some(packet_index) = state.selected_packet else { - return; - }; - - let bytes = &packets[packet_index].data.as_ref().unwrap(); - let mut file = &(*bytes).clone()[..]; - - egui::Grid::new("hex_grid") - .spacing([4.0, 1.5]) - .striped(true) - .min_col_width(0.0) - .show(ui, |ui| { - ui.label(" "); - for i in 0..16 { - ui.label(format!("{i:02X}")); - } - ui.end_row(); - loop { - let bytes_read = file.read(&mut buf).unwrap(); - if bytes_read == 0 { - break; - } - - ui.label(format!("{count:08X}")); - let text_color = if ui.style().visuals.dark_mode { - egui::Color32::from_gray(255) - } else { - egui::Color32::from_gray(0) - }; - for b in buf.iter().take(bytes_read) { - ui.colored_label(text_color, format!("{b:02X}")); - } - for _ in 0..16 - bytes_read { - ui.label(" "); - } - ui.label(" "); - for b in buf.iter().take(bytes_read) { - if *b >= 0x20 && *b <= 0x7e { - ui.label(format!("{}", *b as char)); - } else { - ui.label("."); - } - } - - ui.end_row(); - count += bytes_read; - } - }); - } -} diff --git a/tools/packet-inspector/src/app/packet_list.rs b/tools/packet-inspector/src/app/packet_list.rs deleted file mode 100644 index 9edd5ec7..00000000 --- a/tools/packet-inspector/src/app/packet_list.rs +++ /dev/null @@ -1,279 +0,0 @@ -use eframe::epaint::PathShape; -use egui::{ - Color32, Pos2, Rect, Response, Rgba, Sense, Shape, Stroke, StrokeKind, TextStyle, TextWrapMode, - Ui, Vec2, WidgetText, -}; -use packet_inspector::Packet; -use valence_protocol::PacketSide; - -use super::{SharedState, Tab, View}; - -pub struct PacketList; - -impl Tab for PacketList { - fn new() -> Self { - Self {} - } - - fn name(&self) -> &'static str { - "Packets" - } -} - -impl View for PacketList { - fn ui(&mut self, ui: &mut egui::Ui, state: &mut SharedState) { - handle_keyboard_input(state, ui); - - ui.horizontal(|ui| { - ui.heading("Packets"); - draw_packet_counter(state, ui); - draw_clear_button(state, ui); - }); - - draw_packet_list(state, ui); - } -} - -fn handle_keyboard_input(state: &mut SharedState, ui: &Ui) { - if ui.input(|i| i.key_pressed(egui::Key::ArrowUp)) { - // select previous packet - let index = state.selected_packet.unwrap_or(1); - - let packets = state.packets.read().unwrap(); - let filtered_packets = packets - .iter() - .enumerate() - .filter(|(i, p)| *i < index && state.packet_filter.get(p).unwrap_or(true)) - .map(|(i, _)| i) - .collect::>(); - - if let Some(&prev_index) = filtered_packets.last() { - state.selected_packet = Some(prev_index); - state.update_scroll = true; - } - } - - if ui.input(|i| i.key_pressed(egui::Key::ArrowDown)) { - // select next packet - let index = state.selected_packet.unwrap_or(0); - - let packets = state.packets.read().unwrap(); - let filtered_packets = packets - .iter() - .enumerate() - .filter(|(i, p)| *i > index && state.packet_filter.get(p).unwrap_or(true)) - .map(|(i, _)| i) - .collect::>(); - - if let Some(&next_index) = filtered_packets.first() { - state.selected_packet = Some(next_index); - state.update_scroll = true; - } - } -} - -fn draw_packet_counter(state: &SharedState, ui: &mut Ui) { - let packets = state.packets.read().unwrap(); - let length = packets.len(); - - let filtered_packets = packets - .iter() - .filter(|p| state.packet_filter.get(p).unwrap_or(true)) - .count(); - - ui.label(format!("({filtered_packets}/{length})",)); -} - -fn draw_clear_button(state: &mut SharedState, ui: &mut Ui) { - if ui.button("Clear").clicked() { - state.selected_packet = None; - state.packets.write().unwrap().clear(); - } -} - -fn draw_packet_list(state: &mut SharedState, ui: &mut Ui) { - let packets = state.packets.read().unwrap(); - egui::ScrollArea::vertical() - .auto_shrink([false, false]) - .stick_to_bottom(!state.update_scroll) - .show(ui, |ui| { - for (i, packet) in packets.iter().enumerate() { - if let Some(filtered) = state.packet_filter.get(packet) { - if !filtered { - continue; - } - } - - let selected = { state.selected_packet == Some(i) }; - - let widget = draw_packet_widget(ui, packet, selected); - - if state.update_scroll && state.selected_packet == Some(i) { - state.update_scroll = false; - ui.scroll_to_rect(widget.rect, None); - } - - if widget.clicked() { - state.selected_packet = Some(i); - } - } - }); -} - -fn draw_packet_widget(ui: &mut Ui, packet: &Packet, selected: bool) -> Response { - let (mut rect, response) = ui.allocate_at_least( - Vec2 { - x: ui.available_width(), - y: 24.0, - }, - Sense::click(), - ); // this should give me a new rect inside the scroll area... no? - - let fill = if selected { - Rgba::from_rgba_premultiplied(0.1, 0.1, 0.1, 0.5) - } else { - Rgba::from_rgba_premultiplied(0.0, 0.0, 0.0, 0.0) - }; - - let text_color: Color32 = if selected { - Rgba::from_rgba_premultiplied(0.0, 0.0, 0.0, 1.0).into() - } else { - ui.visuals().strong_text_color() - }; - - if ui.is_rect_visible(rect) { - ui.painter().rect( - rect, - 0.0, - fill, - Stroke::new(1.0, Rgba::BLACK), - StrokeKind::Inside, - ); - - let shape = get_triangle(packet.side, &rect); - ui.painter().add(Shape::Path(shape)); - - let identifier: WidgetText = format!("0x{:0>2X?}", packet.id).into(); - - let identifier = identifier.into_galley( - ui, - Some(TextWrapMode::Truncate), - rect.width() - 21.0, - TextStyle::Button, - ); - - let label: WidgetText = packet.name.into(); - let label = label.into_galley( - ui, - Some(TextWrapMode::Truncate), - rect.width() - 60.0, - TextStyle::Button, - ); - - let timestamp: WidgetText = systemtime_strftime(packet.timestamp.unwrap()).into(); - let timestamp = timestamp.into_galley( - ui, - Some(TextWrapMode::Truncate), - rect.width() - 60.0, - TextStyle::Button, - ); - - let id_and_timestamp_color = if selected { - text_color - } else { - ui.visuals().weak_text_color() - }; - - ui.painter().galley( - Pos2 { - x: rect.left() + 21.0, - y: rect.top() + 6.0, - }, - identifier, - id_and_timestamp_color, - ); - - rect.set_width(rect.width() - 5.0); - - let label_width = label.size().x + 50.0; - ui.painter().galley( - Pos2 { - x: rect.left() + 55.0, - y: rect.top() + 6.0, - }, - label, - text_color, - ); - - ui.painter().galley( - Pos2 { - x: rect.left() + label_width + 8.0, - y: rect.top() + 6.0, - }, - timestamp, - id_and_timestamp_color, - ); - } - - response -} - -fn get_triangle(direction: PacketSide, outer_rect: &Rect) -> PathShape { - let rect = Rect::from_min_size( - Pos2 { - x: outer_rect.left() + 6.0, - y: outer_rect.top() + 8.0, - }, - Vec2 { x: 8.0, y: 8.0 }, - ); - - let color = match direction { - PacketSide::Clientbound => Rgba::from_rgb(255.0, 0.0, 0.0), - PacketSide::Serverbound => Rgba::from_rgb(0.0, 255.0, 0.0), - }; - - let points = match direction { - PacketSide::Clientbound => vec![ - Pos2 { - x: rect.left() + (rect.width() / 2.0), - y: rect.top() + rect.height(), - }, - Pos2 { - x: rect.left() + 0.0, - y: rect.top(), - }, - Pos2 { - x: rect.left() + rect.width(), - y: rect.top(), - }, - ], - PacketSide::Serverbound => vec![ - Pos2 { - x: rect.left() + (rect.width() / 2.0), - y: rect.top() + 0.0, - }, - Pos2 { - x: rect.left() + 0.0, - y: rect.top() + rect.height(), - }, - Pos2 { - x: rect.left() + rect.width(), - y: rect.top() + rect.height(), - }, - ], - }; - - let mut shape = PathShape::closed_line(points, Stroke::new(2.0, color)); - shape.fill = color.into(); - - shape -} - -pub fn systemtime_strftime(odt: time::OffsetDateTime) -> String { - let hour = odt.hour(); - let minute = odt.minute(); - let second = odt.second(); - let millis = odt.millisecond(); - - format!("{hour:0>2}:{minute:0>2}:{second:0>2}.{millis:0>4}") -} diff --git a/tools/packet-inspector/src/app/text_viewer.rs b/tools/packet-inspector/src/app/text_viewer.rs deleted file mode 100644 index 33e6e5d3..00000000 --- a/tools/packet-inspector/src/app/text_viewer.rs +++ /dev/null @@ -1,378 +0,0 @@ -use super::{SharedState, Tab, View}; - -#[allow(clippy::unnecessary_wraps, clippy::redundant_pub_crate)] -mod utils { - use packet_inspector::Packet as ProxyPacket; - use valence_protocol::{ - Decode, Packet, - packets::{ - handshaking::HandshakeC2s, - login::{ - LoginCompressionS2c, LoginDisconnectS2c, LoginHelloC2s, LoginHelloS2c, LoginKeyC2s, - LoginQueryRequestS2c, LoginQueryResponseC2s, LoginSuccessS2c, - }, - play::{ - AdvancementTabC2s, AdvancementUpdateS2c, BlockBreakingProgressS2c, - BlockEntityUpdateS2c, BlockEventS2c, BlockUpdateS2c, BoatPaddleStateC2s, - BookUpdateC2s, BossBarS2c, BundleSplitterS2c, ButtonClickC2s, ChatMessageC2s, - ChatMessageS2c, ChatSuggestionsS2c, ChunkBiomeDataS2c, ChunkDataS2c, - ChunkDeltaUpdateS2c, ChunkLoadDistanceS2c, ChunkRenderDistanceCenterS2c, - ClearTitleS2c, ClickSlotC2s, ClientCommandC2s, ClientSettingsC2s, ClientStatusC2s, - CloseHandledScreenC2s, CloseScreenS2c, CommandExecutionC2s, CommandSuggestionsS2c, - CommandTreeS2c, CooldownUpdateS2c, CraftFailedResponseS2c, CraftRequestC2s, - CreativeInventoryActionC2s, CustomPayloadC2s, CustomPayloadS2c, DamageTiltS2c, - DeathMessageS2c, DifficultyS2c, DisconnectS2c, EndCombatS2c, EnterCombatS2c, - EntitiesDestroyS2c, EntityAnimationS2c, EntityAttachS2c, EntityAttributesS2c, - EntityDamageS2c, EntityEquipmentUpdateS2c, EntityPassengersSetS2c, - EntityPositionS2c, EntitySetHeadYawS2c, EntitySpawnS2c, EntityStatusEffectS2c, - EntityStatusS2c, EntityTrackerUpdateS2c, EntityVelocityUpdateS2c, - ExperienceBarUpdateS2c, ExperienceOrbSpawnS2c, ExplosionS2c, FeaturesS2c, FullC2s, - GameJoinS2c, GameMessageS2c, GameStateChangeS2c, HandSwingC2s, HealthUpdateS2c, - InventoryS2c, ItemPickupAnimationS2c, JigsawGeneratingC2s, KeepAliveC2s, - KeepAliveS2c, LightUpdateS2c, LookAndOnGroundC2s, LookAtS2c, MapUpdateS2c, - MessageAcknowledgmentC2s, MoveRelativeS2c, NbtQueryResponseS2c, OnGroundOnlyC2s, - OpenHorseScreenS2c, OpenScreenS2c, OpenWrittenBookS2c, OverlayMessageS2c, - ParticleS2c, PickFromInventoryC2s, PlayPingS2c, PlayPongC2s, - PlaySoundFromEntityS2c, PlaySoundS2c, PlayerAbilitiesS2c, PlayerActionC2s, - PlayerActionResponseS2c, PlayerInputC2s, PlayerInteractBlockC2s, - PlayerInteractEntityC2s, PlayerInteractItemC2s, PlayerListHeaderS2c, PlayerListS2c, - PlayerPositionLookS2c, PlayerRemoveS2c, PlayerRespawnS2c, PlayerSessionC2s, - PlayerSpawnPositionS2c, PlayerSpawnS2c, PositionAndOnGroundC2s, - ProfilelessChatMessageS2c, QueryBlockNbtC2s, QueryEntityNbtC2s, RecipeBookDataC2s, - RecipeCategoryOptionsC2s, RemoveEntityStatusEffectS2c, RemoveMessageS2c, - RenameItemC2s, RequestCommandCompletionsC2s, ResourcePackSendS2c, - ResourcePackStatusC2s, RotateAndMoveRelativeS2c, RotateS2c, ScoreboardDisplayS2c, - ScoreboardObjectiveUpdateS2c, ScoreboardPlayerUpdateS2c, - ScreenHandlerPropertyUpdateS2c, ScreenHandlerSlotUpdateS2c, - SelectAdvancementTabS2c, SelectMerchantTradeC2s, ServerMetadataS2c, - SetCameraEntityS2c, SetTradeOffersS2c, SignEditorOpenS2c, SimulationDistanceS2c, - SpectatorTeleportC2s, StatisticsS2c, StopSoundS2c, SubtitleS2c, - SynchronizeRecipesS2c, SynchronizeTagsS2c, TeamS2c, TeleportConfirmC2s, - TitleFadeS2c, TitleS2c, UnloadChunkS2c, UnlockRecipesS2c, UpdateBeaconC2s, - UpdateCommandBlockC2s, UpdateCommandBlockMinecartC2s, UpdateDifficultyC2s, - UpdateDifficultyLockC2s, UpdateJigsawC2s, UpdatePlayerAbilitiesC2s, - UpdateSelectedSlotC2s, UpdateSelectedSlotS2c, UpdateSignC2s, - UpdateStructureBlockC2s, VehicleMoveC2s, VehicleMoveS2c, - WorldBorderCenterChangedS2c, WorldBorderInitializeS2c, - WorldBorderInterpolateSizeS2c, WorldBorderSizeChangedS2c, - WorldBorderWarningBlocksChangedS2c, WorldBorderWarningTimeChangedS2c, - WorldEventS2c, WorldTimeUpdateS2c, - }, - status::{QueryPingC2s, QueryPongS2c, QueryRequestC2s, QueryResponseS2c}, - }, - }; - - include!(concat!(env!("OUT_DIR"), "/packet_to_string.rs")); -} - -pub struct TextView { - last_packet_id: Option, - packet_str: String, -} - -impl Tab for TextView { - fn new() -> Self { - Self { - last_packet_id: None, - packet_str: String::new(), - } - } - - fn name(&self) -> &'static str { - "Text Viewer" - } -} - -impl View for TextView { - #[allow(clippy::significant_drop_tightening)] - fn ui(&mut self, ui: &mut egui::Ui, state: &mut SharedState) { - let packets = state.packets.read().unwrap(); - let Some(packet_index) = state.selected_packet else { - self.last_packet_id = None; - self.packet_str = String::new(); - return; - }; - - if self.last_packet_id != Some(packet_index) { - self.last_packet_id = Some(packet_index); - - self.packet_str = utils::packet_to_string(&packets[packet_index]) - .unwrap_or_else(|err| format!("Error: {err}")); - } - - code_view_ui(ui, &self.packet_str); - } -} - -// From: https://github.com/emilk/egui/blob/master/crates/egui_demo_lib/src/syntax_highlighting.rs - -use egui::text::LayoutJob; - -/// View some code with syntax highlighting and selection. -pub fn code_view_ui(ui: &mut egui::Ui, mut code: &str) { - let language = "rs"; - let theme = CodeTheme::from_memory(ui.ctx()); - - let mut layouter = |ui: &egui::Ui, string: &str, wrap_width: f32| { - let mut layout_job = highlight(ui.ctx(), &theme, string, language); - layout_job.wrap.max_width = wrap_width; // no wrapping - ui.fonts(|f| f.layout_job(layout_job)) - }; - - ui.add( - egui::TextEdit::multiline(&mut code) - .font(egui::TextStyle::Monospace) // for cursor height - .code_editor() - .desired_width(ui.available_width()) - .desired_rows(24) - .lock_focus(true) - .layouter(&mut layouter), - ); -} - -/// Memoized Code highlighting -pub fn highlight(ctx: &egui::Context, theme: &CodeTheme, code: &str, language: &str) -> LayoutJob { - type HighlightCache = egui::util::cache::FrameCache; - - ctx.memory_mut(|mem| { - mem.caches - .cache::() - .get((theme, code, language)) - }) -} - -// ---------------------------------------------------------------------------- - -#[derive(Clone, Copy, Hash, PartialEq, serde::Deserialize, serde::Serialize)] -#[allow(unused)] -enum SyntectTheme { - Base16EightiesDark, - Base16MochaDark, - Base16OceanDark, - Base16OceanLight, - InspiredGitHub, - SolarizedDark, - SolarizedLight, -} - -#[allow(unused)] -impl SyntectTheme { - fn all() -> impl ExactSizeIterator { - [ - Self::Base16EightiesDark, - Self::Base16MochaDark, - Self::Base16OceanDark, - Self::Base16OceanLight, - Self::InspiredGitHub, - Self::SolarizedDark, - Self::SolarizedLight, - ] - .iter() - .copied() - } - - const fn name(self) -> &'static str { - match self { - Self::Base16EightiesDark => "Base16 Eighties (dark)", - Self::Base16MochaDark => "Base16 Mocha (dark)", - Self::Base16OceanDark => "Base16 Ocean (dark)", - Self::Base16OceanLight => "Base16 Ocean (light)", - Self::InspiredGitHub => "InspiredGitHub (light)", - Self::SolarizedDark => "Solarized (dark)", - Self::SolarizedLight => "Solarized (light)", - } - } - - const fn syntect_key_name(self) -> &'static str { - match self { - Self::Base16EightiesDark => "base16-eighties.dark", - Self::Base16MochaDark => "base16-mocha.dark", - Self::Base16OceanDark => "base16-ocean.dark", - Self::Base16OceanLight => "base16-ocean.light", - Self::InspiredGitHub => "InspiredGitHub", - Self::SolarizedDark => "Solarized (dark)", - Self::SolarizedLight => "Solarized (light)", - } - } - - pub(crate) const fn is_dark(self) -> bool { - match self { - Self::Base16EightiesDark - | Self::Base16MochaDark - | Self::Base16OceanDark - | Self::SolarizedDark => true, - - Self::Base16OceanLight | Self::InspiredGitHub | Self::SolarizedLight => false, - } - } -} - -#[derive(Clone, Hash, PartialEq, serde::Deserialize, serde::Serialize)] -#[serde(default)] -pub struct CodeTheme { - dark_mode: bool, - - syntect_theme: SyntectTheme, -} - -impl Default for CodeTheme { - fn default() -> Self { - Self::dark() - } -} - -#[allow(unused)] -impl CodeTheme { - pub(crate) const fn from_style(style: &egui::Style) -> Self { - if style.visuals.dark_mode { - Self::dark() - } else { - Self::light() - } - } - - pub(crate) fn from_memory(ctx: &egui::Context) -> Self { - if ctx.style().visuals.dark_mode { - ctx.data_mut(|d| { - d.get_persisted(egui::Id::new("dark")) - .unwrap_or_else(Self::dark) - }) - } else { - ctx.data_mut(|d| { - d.get_persisted(egui::Id::new("light")) - .unwrap_or_else(Self::light) - }) - } - } - - pub(crate) fn store_in_memory(self, ctx: &egui::Context) { - if self.dark_mode { - ctx.data_mut(|d| d.insert_persisted(egui::Id::new("dark"), self)); - } else { - ctx.data_mut(|d| d.insert_persisted(egui::Id::new("light"), self)); - } - } -} - -#[allow(unused)] -impl CodeTheme { - pub(crate) const fn dark() -> Self { - Self { - dark_mode: true, - syntect_theme: SyntectTheme::SolarizedDark, - } - } - - pub(crate) const fn light() -> Self { - Self { - dark_mode: false, - syntect_theme: SyntectTheme::SolarizedLight, - } - } - - pub(crate) fn ui(&mut self, ui: &mut egui::Ui) { - #[allow(deprecated)] - egui::widgets::global_dark_light_mode_buttons(ui); - - for theme in SyntectTheme::all() { - if theme.is_dark() == self.dark_mode { - ui.radio_value(&mut self.syntect_theme, theme, theme.name()); - } - } - } -} - -// ---------------------------------------------------------------------------- - -struct Highlighter { - ps: syntect::parsing::SyntaxSet, - ts: syntect::highlighting::ThemeSet, -} - -impl Default for Highlighter { - fn default() -> Self { - Self { - ps: syntect::parsing::SyntaxSet::load_defaults_newlines(), - ts: syntect::highlighting::ThemeSet::load_defaults(), - } - } -} - -impl egui::util::cache::ComputerMut<(&CodeTheme, &str, &str), LayoutJob> for Highlighter { - fn compute(&mut self, (theme, code, lang): (&CodeTheme, &str, &str)) -> LayoutJob { - self.highlight(theme, code, lang) - } -} - -impl Highlighter { - #[allow(clippy::unused_self, clippy::unnecessary_wraps)] - fn highlight(&self, theme: &CodeTheme, code: &str, lang: &str) -> LayoutJob { - self.highlight_impl(theme, code, lang).unwrap_or_else(|| { - // Fallback: - LayoutJob::simple( - code.into(), - egui::FontId::monospace(12.0), - if theme.dark_mode { - egui::Color32::LIGHT_GRAY - } else { - egui::Color32::DARK_GRAY - }, - f32::INFINITY, - ) - }) - } - - fn highlight_impl(&self, theme: &CodeTheme, text: &str, language: &str) -> Option { - use egui::text::{LayoutSection, TextFormat}; - use syntect::{easy::HighlightLines, highlighting::FontStyle, util::LinesWithEndings}; - - let syntax = self - .ps - .find_syntax_by_name(language) - .or_else(|| self.ps.find_syntax_by_extension(language))?; - - let theme = theme.syntect_theme.syntect_key_name(); - let mut h = HighlightLines::new(syntax, &self.ts.themes[theme]); - - let mut job = LayoutJob { - text: text.into(), - ..Default::default() - }; - - for line in LinesWithEndings::from(text) { - for (style, range) in h.highlight_line(line, &self.ps).ok()? { - let fg = style.foreground; - let text_color = egui::Color32::from_rgb(fg.r, fg.g, fg.b); - let italics = style.font_style.contains(FontStyle::ITALIC); - let underline = style.font_style.contains(FontStyle::ITALIC); - let underline = if underline { - egui::Stroke::new(1.0, text_color) - } else { - egui::Stroke::NONE - }; - job.sections.push(LayoutSection { - leading_space: 0.0, - byte_range: as_byte_range(text, range), - format: TextFormat { - font_id: egui::FontId::monospace(12.0), - color: text_color, - italics, - underline, - ..Default::default() - }, - }); - } - } - - Some(job) - } -} - -fn as_byte_range(whole: &str, range: &str) -> std::ops::Range { - let whole_start = whole.as_ptr() as usize; - let range_start = range.as_ptr() as usize; - assert!(whole_start <= range_start); - assert!(range_start + range.len() <= whole_start + whole.len()); - let offset = range_start - whole_start; - offset..(offset + range.len()) -} diff --git a/tools/packet-inspector/src/lib.rs b/tools/packet-inspector/src/lib.rs deleted file mode 100644 index daa3915e..00000000 --- a/tools/packet-inspector/src/lib.rs +++ /dev/null @@ -1,325 +0,0 @@ -#![expect( - clippy::cast_possible_truncation, - reason = "todo: we should double check no truncation" -)] -#![expect( - clippy::cast_possible_wrap, - reason = "todo: we should double check no wrapping" -)] -#![expect( - clippy::cast_sign_loss, - reason = "todo: we should double check no sign loss" -)] - -mod packet_io; -mod packet_registry; - -use std::{net::SocketAddr, sync::Arc, time::Duration}; - -use anyhow::bail; -use bytes::{BufMut, BytesMut}; -use tokio::{ - net::{TcpListener, TcpStream}, - sync::RwLock, - task::JoinHandle, -}; -use valence_protocol::{ - CompressionThreshold, Decode, Encode, Packet as ValencePacket, PacketSide, PacketState, - decode::PacketFrame, - packets::{ - handshaking::{HandshakeC2s, handshake_c2s::HandshakeNextState}, - login::{LoginCompressionS2c, LoginDisconnectS2c, LoginHelloS2c, LoginSuccessS2c}, - }, - text::{Color, IntoText, color::NamedColor}, -}; - -pub use crate::packet_registry::Packet; -use crate::{packet_io::PacketIo, packet_registry::PacketRegistry}; - -include!(concat!(env!("OUT_DIR"), "/packets.rs")); - -/// Messages for talking to the running proxy task -#[derive(Debug, Clone)] -pub enum ProxyMessage { - Stop, - // In the future there could be a message like - // InjectPacket(SocketAddr, PacketFrame) -} - -#[derive(Debug)] -pub enum DisconnectionReason { - OnlineModeRequired, - Error(anyhow::Error), -} - -/// Messages sent by the proxy for the controlling GUI/CLI. -#[derive(Debug)] -pub enum ProxyLog { - /// A new client has connected to the listener. - ClientConnected(SocketAddr), - /// A client has disconnected from the listener. - ClientDisconnected(SocketAddr, DisconnectionReason), -} - -pub struct Proxy { - pub main_task: JoinHandle>, - pub message_tx: flume::Sender, - pub logs_rx: flume::Receiver, - pub packet_registry: Arc>, -} - -impl Proxy { - /// Creates a new proxy, and starts its listener task. - pub async fn start(listener_addr: SocketAddr, server_addr: SocketAddr) -> anyhow::Result { - let (message_tx, message_rx) = flume::unbounded(); - let (logs_tx, logs_rx) = flume::unbounded(); - - let packet_registry = Arc::new(RwLock::new({ - let registry = PacketRegistry::new(); - registry.register_all(&STD_PACKETS); - registry - })); - - let main_task = tokio::spawn(Self::run_main_task( - packet_registry.clone(), - TcpListener::bind(listener_addr).await?, - server_addr, - message_rx, - logs_tx, - )); - - Ok(Self { - main_task, - message_tx, - logs_rx, - packet_registry, - }) - } - - /// Subscribes to the proxy's packet registry. - pub async fn subscribe(&self) -> flume::Receiver { - self.packet_registry.read().await.subscribe() - } - - /// Sends a request to stop the proxy and awaits its task's termination. - /// There's a hardcoded 5 second long timeout after which the task is - /// considered unresponsive and automatically aborted. - pub async fn stop(self) { - // The task may have already stopped, so we can ignore a Disconnected error - let _ = self.message_tx.send_async(ProxyMessage::Stop).await; - - let abort_handle = self.main_task.abort_handle(); - tokio::select! { - _ = self.main_task => {}, - - // If the main task doesn't stop after 5 seconds, we force terminate it - () = tokio::time::sleep(Duration::from_secs(5)) => { - abort_handle.abort(); - }, - } - } - - /// The main listener task is responsible for handling the TCP listener and - /// managing child tasks for each client connected to the inspector. - async fn run_main_task( - packet_registry: Arc>, - listener: TcpListener, - server_addr: SocketAddr, - message_rx: flume::Receiver, - logs_tx: flume::Sender, - ) -> anyhow::Result<()> { - let mut individual_tasks = vec![]; - loop { - tokio::select! { - r = listener.accept() => { - let (stream, addr) = r?; - - logs_tx.send_async(ProxyLog::ClientConnected(addr)).await?; - individual_tasks.push(tokio::spawn(Self::run_individual_proxy( - stream, - TcpStream::connect(server_addr).await?, - logs_tx.clone(), - packet_registry.clone(), - ))); - } - m = message_rx.recv_async() => match m { - Ok(ProxyMessage::Stop) | Err(_) => { - tracing::trace!("Stopping the proxy task..."); - - // TODO: stop these tasks properly instead of just leaving the TCP connections for timeout - for task in individual_tasks { - task.abort(); - } - - return Ok(()); - } - } - } - } - } - - /// Each client connected to the inspector is handled in its own individual - /// task, defined here. - async fn run_individual_proxy( - client: TcpStream, - server: TcpStream, - a_logs_tx: flume::Sender, - packet_registry: Arc>, - ) -> anyhow::Result<()> { - let client_addr = client.peer_addr()?; - - let client = PacketIo::new(client); - let server = PacketIo::new(server); - - let (mut client_reader, mut client_writer) = client.split(); - let (mut server_reader, mut server_writer) = server.split(); - - let a_state = Arc::new(RwLock::new(PacketState::Handshaking)); - let a_threshold = Arc::new(RwLock::new(CompressionThreshold::DEFAULT)); - - let registry = packet_registry.clone(); - let state_lock = a_state.clone(); - let threshold_lock = a_threshold.clone(); - let logs_tx = a_logs_tx.clone(); - let c2s = tokio::spawn(async move { - loop { - let threshold = *threshold_lock.read().await; - client_reader.set_compression(threshold); - server_writer.set_compression(threshold); - - // client to server handling - let packet = match client_reader.recv_packet_raw().await { - Ok(packet) => packet, - Err(e) => { - server_writer.shutdown().await?; - logs_tx - .send_async(ProxyLog::ClientDisconnected( - client_addr, - DisconnectionReason::Error(e), - )) - .await?; - - bail!("connection error"); - } - }; - - let state = *state_lock.read().await; - - registry - .write() - .await - .process(PacketSide::Serverbound, state, threshold, &packet) - .await?; - - if state == PacketState::Handshaking { - if let Some(handshake) = extrapolate_packet::>(&packet) { - *state_lock.write().await = match handshake.next_state { - HandshakeNextState::Status => PacketState::Status, - HandshakeNextState::Login => PacketState::Login, - }; - } - } - - server_writer.send_packet_raw(&packet).await?; - } - }); - - let registry = packet_registry.clone(); - let state_lock = a_state.clone(); - let threshold_lock = a_threshold.clone(); - let logs_tx = a_logs_tx.clone(); - let s2c = tokio::spawn(async move { - loop { - let threshold = *threshold_lock.read().await; - server_reader.set_compression(threshold); - client_writer.set_compression(threshold); - - // server to client handling - let packet = match server_reader.recv_packet_raw().await { - Ok(packet) => packet, - Err(e) => { - client_writer.shutdown().await?; - return Err(e); - } - }; - - let state = *state_lock.read().await; - - if state == PacketState::Login { - if let Some(LoginCompressionS2c { threshold }) = extrapolate_packet(&packet) { - *threshold_lock.write().await = CompressionThreshold(threshold.0); - } - - if extrapolate_packet::>(&packet).is_some() { - *state_lock.write().await = PacketState::Play; - } - } - - registry - .write() - .await - .process(PacketSide::Clientbound, state, threshold, &packet) - .await?; - - // (The check is done in this if rather than the one above, to still send the - // encryption request packet to the inspector) - if state == PacketState::Login - && extrapolate_packet::>(&packet).is_some() - { - // The server is requesting encryption, we can't support that - - let disconnect_packet = LoginDisconnectS2c { - reason: "This server is running in online mode, which is unsupported by \ - the Packet Inspector." - .into_text() - .color(Color::Named(NamedColor::Red)) - .into_cow_text(), - }; - - client_writer - .send_packet_raw(&PacketFrame { - id: LoginDisconnectS2c::ID, - body: { - let mut writer = BytesMut::new().writer(); - disconnect_packet.encode(&mut writer)?; - writer.into_inner() - }, - }) - .await?; - - client_writer.shutdown().await?; - - logs_tx - .send_async(ProxyLog::ClientDisconnected( - client_addr, - DisconnectionReason::OnlineModeRequired, - )) - .await?; - - bail!("server is running in online mode"); - } - - client_writer.send_packet_raw(&packet).await?; - } - }); - - // wait for either to finish - tokio::select! { - res = c2s => res?, - res = s2c => res?, - } - } -} - -fn extrapolate_packet<'a, P>(packet: &'a PacketFrame) -> Option

-where - P: ValencePacket + Decode<'a> + Clone, -{ - if packet.id != P::ID { - return None; - } - - let mut r = &packet.body[..]; - let packet = P::decode(&mut r).ok()?; - Some(packet) -} diff --git a/tools/packet-inspector/src/main.rs b/tools/packet-inspector/src/main.rs deleted file mode 100644 index 51b75f9c..00000000 --- a/tools/packet-inspector/src/main.rs +++ /dev/null @@ -1,32 +0,0 @@ -#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] -#![expect( - clippy::significant_drop_tightening, - reason = "todo: we should double check no significant drop tightening" -)] - -use egui::ViewportBuilder; - -mod tri_checkbox; - -mod app; -mod shared_state; - -#[tokio::main] -async fn main() -> Result<(), Box> { - let native_options = eframe::NativeOptions { - viewport: ViewportBuilder::default().with_inner_size(egui::Vec2::new(1024.0, 768.0)), - ..Default::default() - }; - - eframe::run_native( - "Hyperion Packet Inspector", - native_options, - Box::new(move |cc| { - let gui_app = app::GuiApp::new(cc); - - Ok(Box::new(gui_app)) - }), - )?; - - Ok(()) -} diff --git a/tools/packet-inspector/src/main_cli.rs b/tools/packet-inspector/src/main_cli.rs deleted file mode 100644 index f1bbc3a4..00000000 --- a/tools/packet-inspector/src/main_cli.rs +++ /dev/null @@ -1,86 +0,0 @@ -use clap::Parser; -use packet_inspector::Packet; -use packet_inspector::Proxy; -use packet_inspector::ProxyLog; -use packet_inspector::DisconnectionReason; -use std::net::SocketAddr; -use tracing::Level; - -#[derive(Parser, Clone, Debug)] -#[clap(author, version, about)] -struct CliArgs { - /// The socket address to listen for connections on. This is the address clients should connect to - listener_addr: SocketAddr, - /// The socket address the proxy will connect to. This is the address of the server - server_addr: SocketAddr, -} - -#[tokio::main] -async fn main() -> anyhow::Result<()> { - tracing_subscriber::fmt() - .with_max_level(Level::TRACE) - .init(); - - let args = CliArgs::parse(); - - let proxy = Proxy::start(args.listener_addr, args.server_addr).await?; - let receiver = proxy.subscribe().await; - - tokio::spawn(async move { - proxy.main_task.await??; - Ok::<(), anyhow::Error>(()) - }); - - // consumer - tokio::spawn(async move { - while let Ok(packet) = receiver.recv_async().await { - log(&packet); - } - }); - - tokio::spawn(async move { - loop { - let next = proxy.logs_rx.recv_async().await?; - match next { - ProxyLog::ClientConnected(addr) => { - tracing::trace!("Accepted a new client {addr}."); - } - ProxyLog::ClientDisconnected(addr, DisconnectionReason::Error(_)) => { - tracing::trace!("Client {addr} disconnected."); - } - ProxyLog::ClientDisconnected(addr, DisconnectionReason::OnlineModeRequired) => { - tracing::error!( - "Client {addr} was disconnected due to a server encryption request. \ - The packet inspector does not support online mode." - ); - } - } - } - - #[allow(unreachable_code)] - Ok::<(), anyhow::Error>(()) - }); - - tokio::signal::ctrl_c().await.unwrap(); - - Ok(()) -} - -fn log(packet: &Packet) { - tracing::debug!( - "{:?} -> [{:?}] 0x{:0>2X} \"{}\" {:?}", - packet.side, - packet.state, - packet.id, - packet.name, - truncated(format!("{:?}", packet.data), 512) - ); -} - -fn truncated(string: String, max_len: usize) -> String { - if string.len() > max_len { - format!("{}...", &string[..max_len]) - } else { - string - } -} diff --git a/tools/packet-inspector/src/packet_io.rs b/tools/packet-inspector/src/packet_io.rs deleted file mode 100644 index 0e94c2f5..00000000 --- a/tools/packet-inspector/src/packet_io.rs +++ /dev/null @@ -1,200 +0,0 @@ -use std::{io, io::ErrorKind}; - -use anyhow::ensure; -use bytes::{BufMut, BytesMut}; -use tokio::{ - io::{AsyncReadExt, AsyncWriteExt}, - net::TcpStream, -}; -use valence_protocol::{ - CompressionThreshold, Encode, MAX_PACKET_SIZE, VarInt, - decode::{PacketDecoder, PacketFrame}, - encode::PacketEncoder, -}; - -pub struct PacketIoReader { - reader: tokio::io::ReadHalf, - dec: PacketDecoder, - threshold: CompressionThreshold, -} - -impl PacketIoReader { - pub(crate) async fn recv_packet_raw(&mut self) -> anyhow::Result { - loop { - if let Some(frame) = self.dec.try_next_packet()? { - // self.logger - // .log("Unknown".to_string(), self.direction.clone(), frame.clone()); - - return Ok(frame); - } - - self.dec.reserve(READ_BUF_SIZE); - let mut buf = self.dec.take_capacity(); - - if self.reader.read_buf(&mut buf).await? == 0 { - return Err(io::Error::from(ErrorKind::UnexpectedEof).into()); - } - - // This should always be an O(1) unsplit because we reserved space earlier and - // the call to `read_buf` shouldn't have grown the allocation. - self.dec.queue_bytes(buf); - } - } - - #[allow(dead_code)] - pub(crate) fn set_compression(&mut self, threshold: CompressionThreshold) { - self.threshold = threshold; - self.dec.set_compression(threshold); - } -} - -pub struct PacketIoWriter { - writer: tokio::io::WriteHalf, - enc: PacketEncoder, - threshold: CompressionThreshold, -} - -impl PacketIoWriter { - // No | Packet Length | VarInt | Length of (Data Length) + Compressed length of (Packet ID + Data) - // No | Data Length | VarInt | Length of uncompressed (Packet ID + Data) or 0 - // Yes | Packet ID | VarInt | zlib compressed packet ID (see the sections below) - // Yes | Data | Byte Array | zlib compressed packet data (see the sections below) - pub(crate) async fn send_packet_raw(&mut self, frame: &PacketFrame) -> anyhow::Result<()> { - let id_varint = VarInt(frame.id); - let id_buf = varint_to_bytes(id_varint); - - let mut uncompressed_packet = BytesMut::new(); - uncompressed_packet.extend_from_slice(&id_buf); - uncompressed_packet.extend_from_slice(&frame.body); - let uncompressed_packet_length = uncompressed_packet.len(); - let uncompressed_packet_length_varint = VarInt(uncompressed_packet_length as i32); - - if self.threshold.0 >= 0 { - if uncompressed_packet_length > self.threshold.0 as usize { - use std::io::Read; - - use flate2::{Compression, bufread::ZlibEncoder}; - - let mut z = ZlibEncoder::new(&uncompressed_packet[..], Compression::new(4)); - let mut compressed = Vec::new(); - - let data_len_size = uncompressed_packet_length_varint.written_size(); - - let packet_len = data_len_size + z.read_to_end(&mut compressed)?; - - ensure!( - packet_len <= MAX_PACKET_SIZE as usize, - "packet exceeds maximum length" - ); - - drop(z); - - self.enc - .append_bytes(&varint_to_bytes(VarInt(packet_len as i32))); - - self.enc - .append_bytes(&varint_to_bytes(uncompressed_packet_length_varint)); - - self.enc.append_bytes(&compressed); - - let bytes = self.enc.take(); - - self.writer.write_all(&bytes).await?; - self.writer.flush().await?; - - // now we need to compress the packet. - } else { - // no need to compress, but we do need to inject a zero - let empty = VarInt(0); - - let data_len_size = empty.written_size(); - let packet_len = data_len_size + uncompressed_packet_length; - - self.enc - .append_bytes(&varint_to_bytes(VarInt(packet_len as i32))); - self.enc.append_bytes(&varint_to_bytes(empty)); - self.enc.append_bytes(&uncompressed_packet); - let bytes = self.enc.take(); - self.writer.write_all(&bytes).await?; - self.writer.flush().await?; - } - - return Ok(()); - } - - let length = varint_to_bytes(VarInt(uncompressed_packet_length as i32)); - - // the frame should be uncompressed at this point. - self.enc.append_bytes(&length); - self.enc.append_bytes(&uncompressed_packet); - - let bytes = self.enc.take(); - - self.writer.write_all(&bytes).await?; - - Ok(()) - } - - #[allow(dead_code)] - pub(crate) fn set_compression(&mut self, threshold: CompressionThreshold) { - self.threshold = threshold; - self.enc.set_compression(threshold); - } - - pub(crate) async fn shutdown(&mut self) -> std::io::Result<()> { - self.writer.shutdown().await?; - Ok(()) - } -} - -pub struct PacketIo { - stream: TcpStream, - enc: PacketEncoder, - dec: PacketDecoder, - threshold: CompressionThreshold, -} - -const READ_BUF_SIZE: usize = 1024; - -impl PacketIo { - pub(crate) fn new(stream: TcpStream) -> Self { - Self { - stream, - enc: PacketEncoder::new(), - dec: PacketDecoder::new(), - threshold: CompressionThreshold::DEFAULT, - } - } - - pub(crate) fn split(self) -> (PacketIoReader, PacketIoWriter) { - let (reader, writer) = tokio::io::split(self.stream); - - ( - PacketIoReader { - reader, - dec: self.dec, - threshold: self.threshold, - }, - PacketIoWriter { - writer, - enc: self.enc, - threshold: self.threshold, - }, - ) - } - - #[allow(dead_code)] - pub(crate) fn set_compression(&mut self, threshold: CompressionThreshold) { - self.threshold = threshold; - self.enc.set_compression(threshold); - self.dec.set_compression(threshold); - } -} - -pub fn varint_to_bytes(i: VarInt) -> BytesMut { - let mut buf = BytesMut::new(); - let mut writer = (&mut buf).writer(); - i.encode(&mut writer).unwrap(); - - buf -} diff --git a/tools/packet-inspector/src/packet_registry.rs b/tools/packet-inspector/src/packet_registry.rs deleted file mode 100644 index c8803c5c..00000000 --- a/tools/packet-inspector/src/packet_registry.rs +++ /dev/null @@ -1,116 +0,0 @@ -use std::{ - hash::{Hash, Hasher}, - sync::RwLock, -}; - -use bytes::Bytes; -use time::OffsetDateTime; -use valence_protocol::{CompressionThreshold, PacketSide, PacketState, decode::PacketFrame}; - -pub struct PacketRegistry { - packets: RwLock>, - receiver: flume::Receiver, - sender: flume::Sender, -} - -#[allow(unused)] -impl PacketRegistry { - pub fn new() -> Self { - let (sender, receiver) = flume::unbounded::(); - - Self { - packets: RwLock::new(Vec::new()), - receiver, - sender, - } - } - - pub fn subscribe(&self) -> flume::Receiver { - self.receiver.clone() - } - - pub fn register(&self, packet: Packet) { - self.packets.write().unwrap().push(packet); - } - - // register_all(takes an array of packets) - pub fn register_all(&self, packets: &[Packet]) { - self.packets.write().unwrap().extend_from_slice(packets); - } - - fn get_specific_packet(&self, side: PacketSide, state: PacketState, packet_id: i32) -> Packet { - let time = OffsetDateTime::now_local().unwrap_or_else(|_| OffsetDateTime::now_utc()); - - self.packets - .read() - .unwrap() - .iter() - .find(|packet| packet.id == packet_id && packet.side == side && packet.state == state) - .unwrap_or(&Packet { - side, - state, - id: packet_id, - timestamp: Some(time), - name: "Unknown Packet", - data: None, - }) - .clone() - } - - pub async fn process( - &self, - side: PacketSide, - state: PacketState, - threshold: CompressionThreshold, - packet: &PacketFrame, - ) -> anyhow::Result<()> { - let mut p = self.get_specific_packet(side, state, packet.id); - - let time = OffsetDateTime::now_local().unwrap_or_else(|_| OffsetDateTime::now_utc()); - - p.data = Some(packet.body.clone().freeze()); - p.timestamp = Some(time); - - // store in received_packets - self.sender.send_async(p).await?; - - Ok(()) - } -} - -impl Default for PacketRegistry { - fn default() -> Self { - Self::new() - } -} - -#[derive(Clone, Debug, Eq, serde::Serialize, serde::Deserialize)] -pub struct Packet { - pub side: PacketSide, - pub state: PacketState, - pub id: i32, - #[serde(skip)] - pub timestamp: Option, - #[serde(skip)] - pub name: &'static str, - /// Uncompressed packet data - #[serde(skip)] - pub data: Option, -} - -impl PartialEq for Packet { - fn eq(&self, other: &Self) -> bool { - self.side == other.side - && self.state == other.state - && self.id == other.id - && self.data == other.data - } -} - -impl Hash for Packet { - fn hash(&self, state: &mut H) { - self.id.hash(state); - self.side.hash(state); - self.state.hash(state); - } -} diff --git a/tools/packet-inspector/src/shared_state.rs b/tools/packet-inspector/src/shared_state.rs deleted file mode 100644 index 9babb202..00000000 --- a/tools/packet-inspector/src/shared_state.rs +++ /dev/null @@ -1,134 +0,0 @@ -#![allow(clippy::mutable_key_type)] - -use std::{collections::HashMap, sync::RwLock}; - -use egui::Context; -use packet_inspector::Packet; - -#[derive(serde::Deserialize, serde::Serialize)] -pub struct PacketFilter { - inner: HashMap, -} - -impl PacketFilter { - pub(crate) fn new() -> Self { - let mut inner = HashMap::new(); - - for p in &packet_inspector::STD_PACKETS { - inner.insert(p.clone(), true); - } - - Self { inner } - } - - pub(crate) fn get(&self, packet: &Packet) -> Option { - self.inner - .iter() - .find(|(k, _)| k.id == packet.id && k.side == packet.side && k.state == packet.state) - .map(|(_, v)| v) - .copied() - } - - pub(crate) fn insert(&mut self, packet: Packet, value: bool) { - self.inner.insert(packet, value); - } - - pub(crate) fn iter(&self) -> impl Iterator { - self.inner.iter() - } - - pub(crate) fn iter_mut(&mut self) -> impl Iterator { - self.inner.iter_mut() - } -} - -pub enum Event { - StartListening, - StopListening, - PacketReceived, -} - -#[derive(serde::Deserialize, serde::Serialize)] -pub struct SharedState { - pub(crate) listener_addr: String, - pub(crate) server_addr: String, - pub(crate) autostart: bool, - pub(crate) packet_filter: PacketFilter, - pub(crate) packet_search: String, - #[serde(skip)] - pub(crate) is_listening: bool, - #[serde(skip)] - pub(crate) selected_packet: Option, - #[serde(skip)] - pub(crate) update_scroll: bool, - #[serde(skip)] - pub(crate) packets: RwLock>, - #[serde(skip)] - pub(super) receiver: Option>, - #[serde(skip)] - sender: Option>, - #[serde(skip)] - pub(crate) ctx: Option, -} - -impl Default for SharedState { - fn default() -> Self { - let (sender, receiver) = flume::unbounded(); - - Self { - listener_addr: "127.0.0.1:25566".to_owned(), - server_addr: "127.0.0.1:25565".to_owned(), - autostart: false, - is_listening: false, - packet_search: String::new(), - packet_filter: PacketFilter::new(), - selected_packet: None, - update_scroll: false, - packets: RwLock::new(Vec::new()), - receiver: Some(receiver), - sender: Some(sender), - ctx: None, - } - } -} - -#[allow(unused)] -impl SharedState { - pub(crate) fn new(ctx: Context) -> Self { - Self { - ctx: Some(ctx), - ..Self::default() - } - } - - pub(super) fn merge(mut self, other: Self) -> Self { - self.ctx = other.ctx; - self.sender = other.sender; - self.receiver = other.receiver; - - // make a backup of self.packet_filter - - let mut packet_filter = PacketFilter::new(); - // iterate over packet_inspector::STD_PACKETS - for p in &packet_inspector::STD_PACKETS { - // if the packet is in the current packet_filter - if let Some(v) = self.packet_filter.get(p) { - // insert it into packet_filter - packet_filter.insert(p.clone(), v); - } else { - // otherwise insert it into packet_filter with a default value of true - packet_filter.insert(p.clone(), true); - } - } - - self.packet_filter = packet_filter; - - self - } - - pub(crate) fn send_event(&self, event: Event) { - if let Some(sender) = &self.sender { - sender.send(event); - } - } -} diff --git a/tools/packet-inspector/src/tri_checkbox.rs b/tools/packet-inspector/src/tri_checkbox.rs deleted file mode 100644 index 593e789e..00000000 --- a/tools/packet-inspector/src/tri_checkbox.rs +++ /dev/null @@ -1,137 +0,0 @@ -use egui::{ - NumExt, Response, Sense, Shape, StrokeKind, TextStyle, Ui, Vec2, Widget, WidgetInfo, - WidgetText, WidgetType, epaint, pos2, vec2, -}; - -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub enum TriCheckboxState { - Enabled, - Partial, - Disabled, -} - -// TODO(emilk): allow checkbox without a text label -/// Boolean on/off control with text label. -/// -/// Usually you'd use [`Ui::checkbox`] instead. -/// -/// ``` -/// # egui::__run_test_ui(|ui| { -/// # let mut my_bool = true; -/// // These are equivalent: -/// ui.checkbox(&mut my_bool, "Checked"); -/// ui.add(egui::Checkbox::new(&mut my_bool, "Checked")); -/// # }); -/// ``` -#[must_use = "You should put this widget in an ui with `ui.add(widget);`"] -pub struct TriCheckbox<'a> { - checked: &'a mut TriCheckboxState, - text: WidgetText, -} - -#[allow(unused)] -impl<'a> TriCheckbox<'a> { - pub(crate) fn new(checked: &'a mut TriCheckboxState, text: impl Into) -> Self { - TriCheckbox { - checked, - text: text.into(), - } - } - - pub(crate) fn without_text(checked: &'a mut TriCheckboxState) -> Self { - Self::new(checked, WidgetText::default()) - } -} - -impl Widget for TriCheckbox<'_> { - fn ui(self, ui: &mut Ui) -> Response { - let TriCheckbox { checked, text } = self; - - let spacing = &ui.spacing(); - let icon_width = spacing.icon_width; - let icon_spacing = spacing.icon_spacing; - - let (text, mut desired_size) = if text.is_empty() { - (None, vec2(icon_width, 0.0)) - } else { - let total_extra = vec2(icon_width + icon_spacing, 0.0); - - let wrap_width = ui.available_width() - total_extra.x; - let text = text.into_galley(ui, None, wrap_width, TextStyle::Button); - - let mut desired_size = total_extra + text.size(); - desired_size = desired_size.at_least(spacing.interact_size); - - (Some(text), desired_size) - }; - - desired_size = desired_size.at_least(Vec2::splat(spacing.interact_size.y)); - desired_size.y = desired_size.y.max(icon_width); - let (rect, mut response) = ui.allocate_exact_size(desired_size, Sense::click()); - - if response.clicked() { - *checked = match *checked { - TriCheckboxState::Partial | TriCheckboxState::Disabled => TriCheckboxState::Enabled, - TriCheckboxState::Enabled => TriCheckboxState::Disabled, - }; - response.mark_changed(); - } - response.widget_info(|| { - WidgetInfo::selected( - WidgetType::Checkbox, - *checked == TriCheckboxState::Enabled, - false, - text.as_ref().map_or("", |x| x.text()), - ) - }); - - if ui.is_rect_visible(rect) { - // Too colorful - // let visuals = ui.style().interact_selectable(&response, *checked); - let visuals = ui.style().interact(&response); - let (small_icon_rect, big_icon_rect) = ui.spacing().icon_rectangles(rect); - ui.painter().add(epaint::RectShape::new( - big_icon_rect.expand(visuals.expansion), - visuals.corner_radius, - visuals.bg_fill, - visuals.bg_stroke, - StrokeKind::Inside, - )); - - match *checked { - TriCheckboxState::Enabled => { - // Check mark: - ui.painter().add(Shape::line( - vec![ - pos2(small_icon_rect.left(), small_icon_rect.center().y), - pos2(small_icon_rect.center().x, small_icon_rect.bottom()), - pos2(small_icon_rect.right(), small_icon_rect.top()), - ], - visuals.fg_stroke, - )); - } - TriCheckboxState::Partial => { - // Minus sign: - ui.painter().add(Shape::line( - vec![ - pos2(small_icon_rect.left(), small_icon_rect.center().y), - pos2(small_icon_rect.right(), small_icon_rect.center().y), - ], - visuals.fg_stroke, - )); - } - TriCheckboxState::Disabled => {} - } - if let Some(text) = text { - let text_pos = pos2( - rect.min.x + icon_width + icon_spacing, - 0.5f32.mul_add(-text.size().y, rect.center().y), - ); - - ui.painter().galley(text_pos, text, visuals.text_color()); - } - } - - response - } -} diff --git a/tools/rust-mc-bot/src/packet_utils.rs b/tools/rust-mc-bot/src/packet_utils.rs index 9dc7a710..fe9a7e86 100644 --- a/tools/rust-mc-bot/src/packet_utils.rs +++ b/tools/rust-mc-bot/src/packet_utils.rs @@ -59,11 +59,7 @@ impl Buf { let src_usize = src as usize; let dst_usize = dst as usize; let size = size_of::().checked_mul(count).unwrap(); - let diff = if src_usize > dst_usize { - src_usize - dst_usize - } else { - dst_usize - src_usize - }; + let diff = src_usize.abs_diff(dst_usize); // If the absolute distance between the ptrs is at least as big as the size of the buffer, // they do not overlap. diff >= size From 986f186114b089e4ad10b6d7b09e36397e984fe0 Mon Sep 17 00:00:00 2001 From: Andrew Gazelka Date: Tue, 2 Sep 2025 18:05:32 -0700 Subject: [PATCH 3/9] add cursor rules --- .cursor/rules/general.mdc | 4 +++- ci.sh | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100755 ci.sh diff --git a/.cursor/rules/general.mdc b/.cursor/rules/general.mdc index ae0d2f4a..3805373f 100644 --- a/.cursor/rules/general.mdc +++ b/.cursor/rules/general.mdc @@ -4,4 +4,6 @@ globs: alwaysApply: true --- -latest msrv is 1.89.0 \ No newline at end of file +latest msrv is 1.89.0 + +After doing any task run ./ci.sh \ No newline at end of file diff --git a/ci.sh b/ci.sh new file mode 100755 index 00000000..495a6a16 --- /dev/null +++ b/ci.sh @@ -0,0 +1,9 @@ +#!/bin/bash +set -e + +cargo clippy -q --all-targets --tests --benches -- -D warnings +cargo +nightly fmt + +# Run tests but exclude benchmarks due to tango-bench framework bug (conflicting -g flags) +cargo nextest run --lib --tests + From d23b3b838912d8d96503a60e1c9b16dfef9bfc30 Mon Sep 17 00:00:00 2001 From: Andrew Gazelka Date: Tue, 2 Sep 2025 18:32:57 -0700 Subject: [PATCH 4/9] update --- .gitignore | 2 +- Cargo.lock | 207 +++++++--- Cargo.toml | 81 +++- ci.sh | 5 +- crates/hyperion-palette/Cargo.toml | 1 - crates/hyperion-palette/src/indirect.rs | 24 +- crates/hyperion-palette/src/lib.rs | 2 - crates/hyperion-stats/Cargo.toml | 2 +- crates/hyperion-stats/src/lib.rs | 103 +++-- crates/hyperion/Cargo.toml | 1 - crates/hyperion/src/lib.rs | 53 --- crates/hyperion/src/net/encoder/util.rs | 46 --- crates/packet-channel/Cargo.toml | 1 - crates/packet-channel/src/lib.rs | 39 +- crates/simd-utils/Cargo.toml | 1 - crates/simd-utils/src/lib.rs | 453 +++++---------------- crates/simd-utils/src/one_bit_positions.rs | 53 --- 17 files changed, 402 insertions(+), 672 deletions(-) delete mode 100644 crates/simd-utils/src/one_bit_positions.rs diff --git a/.gitignore b/.gitignore index 6e3b899a..04ded9f8 100644 --- a/.gitignore +++ b/.gitignore @@ -33,4 +33,4 @@ vendor/ .trigger-release .trigger-debug .trigger -valence/ +# valence/ diff --git a/Cargo.lock b/Cargo.lock index 2de560ac..a56f5d40 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -33,6 +33,17 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + [[package]] name = "ahash" version = "0.8.12" @@ -182,9 +193,6 @@ name = "anyhow" version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" -dependencies = [ - "backtrace", -] [[package]] name = "approx" @@ -1185,17 +1193,6 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" -[[package]] -name = "bitfield-struct" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2869c63ccf4f8bf0d485070b880e60e097fb7aeea80ee82a0a94a957e372a0b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "bitfield-struct" version = "0.10.1" @@ -1420,6 +1417,15 @@ dependencies = [ "nom", ] +[[package]] +name = "cfb8" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "014c0a0e1ad0dae6a86c082db2f9bd7fe8c2c734227047d0d8b4d4a3a094a1e1" +dependencies = [ + "cipher", +] + [[package]] name = "cfg-if" version = "1.0.3" @@ -1459,6 +1465,16 @@ dependencies = [ "half", ] +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + [[package]] name = "clang-sys" version = "1.8.1" @@ -1905,6 +1921,12 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + [[package]] name = "digest" version = "0.10.7" @@ -2236,6 +2258,18 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "nanorand", + "spin", +] + [[package]] name = "fnv" version = "1.0.7" @@ -2911,7 +2945,7 @@ dependencies = [ "arc-swap", "base64 0.22.1", "bevy", - "bitfield-struct 0.10.1", + "bitfield-struct", "bitvec", "boxcar", "bumpalo", @@ -3187,6 +3221,7 @@ dependencies = [ "approx", "divan", "rand 0.9.2", + "wide", ] [[package]] @@ -3371,6 +3406,15 @@ dependencies = [ "serde", ] +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + [[package]] name = "instant" version = "0.1.13" @@ -3466,6 +3510,13 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +[[package]] +name = "java_string" +version = "0.1.2" +dependencies = [ + "serde", +] + [[package]] name = "jni" version = "0.21.1" @@ -3842,6 +3893,15 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" +dependencies = [ + "getrandom 0.2.16", +] + [[package]] name = "native-tls" version = "0.2.14" @@ -4430,6 +4490,16 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" +[[package]] +name = "pretty_assertions" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" +dependencies = [ + "diff", + "yansi", +] + [[package]] name = "prettyplease" version = "0.2.37" @@ -5007,6 +5077,15 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +[[package]] +name = "safe_arch" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323" +dependencies = [ + "bytemuck", +] + [[package]] name = "same-file" version = "1.0.6" @@ -5317,6 +5396,7 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" dependencies = [ + "lock_api", "portable-atomic", ] @@ -6052,14 +6132,16 @@ dependencies = [ [[package]] name = "valence_anvil" version = "0.1.0" -source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" dependencies = [ - "bitfield-struct 0.9.5", + "bevy_app 0.12.1", + "bevy_ecs 0.12.1", + "bitfield-struct", "bitvec", "byteorder", "flate2", + "flume", "lru", - "thiserror 1.0.69", + "thiserror 2.0.16", "valence_bytes", "valence_nbt", "valence_server", @@ -6067,8 +6149,7 @@ dependencies = [ [[package]] name = "valence_build_utils" -version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" +version = "0.1.0" dependencies = [ "anyhow", "proc-macro2", @@ -6077,22 +6158,20 @@ dependencies = [ [[package]] name = "valence_bytes" -version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" +version = "0.1.0" dependencies = [ "bytes", ] [[package]] name = "valence_entity" -version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" +version = "0.1.0" dependencies = [ "anyhow", "bevy_app 0.12.1", "bevy_ecs 0.12.1", - "bitfield-struct 0.9.5", - "derive_more 1.0.0", + "bitfield-struct", + "derive_more 2.0.1", "heck", "indexmap", "paste", @@ -6114,8 +6193,7 @@ dependencies = [ [[package]] name = "valence_generated" -version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" +version = "0.1.0" dependencies = [ "anyhow", "heck", @@ -6131,20 +6209,18 @@ dependencies = [ [[package]] name = "valence_ident" -version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" +version = "0.1.0" dependencies = [ "bytes", "serde", - "thiserror 1.0.69", + "thiserror 2.0.16", "valence_bytes", "valence_ident_macros", ] [[package]] name = "valence_ident_macros" -version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" +version = "0.1.0" dependencies = [ "proc-macro2", "quote", @@ -6153,8 +6229,7 @@ dependencies = [ [[package]] name = "valence_math" -version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" +version = "0.1.0" dependencies = [ "glam", ] @@ -6162,32 +6237,37 @@ dependencies = [ [[package]] name = "valence_nbt" version = "0.8.0" -source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" dependencies = [ "byteorder", "cesu8", "indexmap", + "java_string", + "pretty_assertions", "serde", - "thiserror 1.0.69", + "serde_json", + "thiserror 2.0.16", "uuid", + "valence_ident", ] [[package]] name = "valence_protocol" -version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" +version = "0.1.0" dependencies = [ + "aes", "anyhow", "base64 0.22.1", "bevy_ecs 0.12.1", - "bitfield-struct 0.9.5", + "bitfield-struct", "byteorder", "bytes", - "derive_more 1.0.0", + "cfb8", + "derive_more 2.0.1", "flate2", + "rand 0.9.2", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 2.0.16", "tracing", "url", "uuid", @@ -6202,8 +6282,7 @@ dependencies = [ [[package]] name = "valence_protocol_macros" -version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" +version = "0.1.0" dependencies = [ "heck", "proc-macro2", @@ -6213,8 +6292,7 @@ dependencies = [ [[package]] name = "valence_registry" -version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" +version = "0.1.0" dependencies = [ "anyhow", "bevy_app 0.12.1", @@ -6231,20 +6309,19 @@ dependencies = [ [[package]] name = "valence_server" -version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" +version = "0.1.0" dependencies = [ "anyhow", "arrayvec", "bevy_app 0.12.1", "bevy_ecs 0.12.1", "bevy_utils 0.12.1", - "bitfield-struct 0.9.5", + "bitfield-struct", "byteorder", "bytes", - "derive_more 1.0.0", + "derive_more 2.0.1", "parking_lot", - "rand 0.8.5", + "rand 0.9.2", "rustc-hash 2.1.1", "tracing", "uuid", @@ -6260,25 +6337,23 @@ dependencies = [ [[package]] name = "valence_server_common" -version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" +version = "0.1.0" dependencies = [ "bevy_app 0.12.1", "bevy_ecs 0.12.1", - "derive_more 1.0.0", - "rand 0.8.5", + "derive_more 2.0.1", + "rand 0.9.2", "uuid", "valence_protocol", ] [[package]] name = "valence_text" -version = "0.2.0-alpha.1+mc.1.20.1" -source = "git+file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence?rev=a1252ee#a1252eec3356bb914101227aeab8f78965491e98" +version = "0.1.0" dependencies = [ "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 2.0.16", "uuid", "valence_ident", "valence_nbt", @@ -6591,6 +6666,16 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wide" +version = "0.7.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce5da8ecb62bcd8ec8b7ea19f69a51275e91299be594ea5cc6ef7819e16cd03" +dependencies = [ + "bytemuck", + "safe_arch", +] + [[package]] name = "winapi" version = "0.3.9" @@ -7085,6 +7170,12 @@ version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7" +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + [[package]] name = "yoke" version = "0.8.0" diff --git a/Cargo.toml b/Cargo.toml index d98749e1..58247a19 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,6 +46,7 @@ members = [ resolver = '2' [workspace.dependencies] +aes = "0.8.2" anyhow = '1.0.98' approx = '0.5.1' arc-swap = '1.7.1' @@ -57,6 +58,8 @@ boxcar = '0.2.13' bumpalo = '3.16' byteorder = '1.5.0' bytes = '1.8.0' +cesu8 = "1.1.0" +cfb8 = "0.8.1" colored = "3.0.0" compact_str = '0.9.0' convert_case = "0.7.1" @@ -73,6 +76,8 @@ flume = '0.11.1' futures-util = '0.3.31' glam = "0.29.3" heapless = '0.8.0' +heck = "0.5.0" +hmac = "0.12.1" heed = "0.21.0" hex = '0.4.3' humantime = '2.1.0' @@ -92,6 +97,7 @@ ordered-float = "5.0.0" papaya = "0.2.1" parking_lot = '0.12.3' paste = "1.0.15" +pretty_assertions = "1.3.0" plotters-bitmap = '0.3.6' proc-macro2 = '1.0.95' proptest = '1.5.0' @@ -106,14 +112,18 @@ rustls = { version = '0.23.31', default-features = false, features = [ ] } rustls-pki-types = '1.12.0' rustls-webpki = '0.103.4' +rsa = "0.9.2" +rsa-der = "0.3.0" serde = '1.0.217' serde_json = '1.0.140' serial_test = '3.2.0' +sha1 = "0.10.5" slotmap = '1.0.7' snafu = '0.8.5' syn = '2.0.101' tango-bench = "0.6.0" tar = '0.4.41' +tempfile = "3.3.0" thiserror = '2.0.12' thread_local = '1.1.8' tikv-jemallocator = '0.6.0' @@ -125,7 +135,32 @@ tokio-rustls = { version = '0.26.2', default-features = false, features = [ ] } toml = '0.8.14' tracing-appender = '0.2.3' +url = { version = "2.2.2", features = ["serde"] } uuid = '1.16.0' +valence_math = { path = 'vendor/valence/crates/valence_math' } +valence_protocol_macros = { path = 'vendor/valence/crates/valence_protocol_macros' } +valence_ident_macros = { path = 'vendor/valence/crates/valence_ident_macros' } +valence_lang = { path = 'vendor/valence/crates/valence_lang' } +valence_server_common = { path = 'vendor/valence/crates/valence_server_common' } +java_string = { path = 'vendor/valence/crates/java_string' } +lru = "0.12.0" +num = "0.4.0" +num-bigint = "0.4.3" +owo-colors = "4.1.0" +petgraph = "0.6.3" +regex = "1.6.0" +zip = "2.2.0" +valence_entity = { path = 'vendor/valence/crates/valence_entity' } +valence_advancement = { path = 'vendor/valence/crates/valence_advancement' } +valence_boss_bar = { path = 'vendor/valence/crates/valence_boss_bar' } +valence_command = { path = 'vendor/valence/crates/valence_command' } +valence_command_macros = { path = 'vendor/valence/crates/valence_command_macros' } +valence_inventory = { path = 'vendor/valence/crates/valence_inventory' } +valence_network = { path = 'vendor/valence/crates/valence_network' } +valence_player_list = { path = 'vendor/valence/crates/valence_player_list' } +valence_scoreboard = { path = 'vendor/valence/crates/valence_scoreboard' } +valence_weather = { path = 'vendor/valence/crates/valence_weather' } +valence_world_border = { path = 'vendor/valence/crates/valence_world_border' } [workspace.dependencies.hyperion-proxy-module] path = "crates/hyperion-proxy-module" @@ -139,6 +174,22 @@ default-features = false features = ['multi_threaded'] version = "0.16.1" +[workspace.dependencies.bevy_app] +version = "0.12" +default-features = false + +[workspace.dependencies.bevy_ecs] +version = "0.12" +default-features = false +features = ["multi-threaded"] + +[workspace.dependencies.bevy_hierarchy] +version = "0.12" +default-features = false + +[workspace.dependencies.bevy_utils] +version = "0.12" + [workspace.dependencies.bytemuck] features = ['derive'] version = '1.23.0' @@ -276,47 +327,37 @@ features = ['timer-fallback'] version = '0.11.4' [workspace.dependencies.valence_anvil] -git = 'file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence' -rev = 'a1252ee' +path = 'vendor/valence/crates/valence_anvil' features = ['parsing'] [workspace.dependencies.valence_build_utils] -git = 'file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence' -rev = 'a1252ee' +path = 'vendor/valence/crates/valence_build_utils' [workspace.dependencies.valence_bytes] -git = 'file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence' -rev = 'a1252ee' +path = 'vendor/valence/crates/valence_bytes' [workspace.dependencies.valence_generated] -git = 'file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence' -rev = 'a1252ee' +path = 'vendor/valence/crates/valence_generated' [workspace.dependencies.valence_ident] -git = 'file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence' -rev = 'a1252ee' +path = 'vendor/valence/crates/valence_ident' [workspace.dependencies.valence_nbt] -git = 'file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence' -rev = 'a1252ee' +path = 'vendor/valence/crates/valence_nbt' features = ['serde'] [workspace.dependencies.valence_protocol] -git = 'file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence' -rev = 'a1252ee' +path = 'vendor/valence/crates/valence_protocol' features = ['compression'] [workspace.dependencies.valence_registry] -git = 'file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence' -rev = 'a1252ee' +path = 'vendor/valence/crates/valence_registry' [workspace.dependencies.valence_server] -git = 'file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence' -rev = 'a1252ee' +path = 'vendor/valence/crates/valence_server' [workspace.dependencies.valence_text] -git = 'file:///Users/andrewgazelka/Projects/personal/hyperion/vendor/valence' -rev = 'a1252ee' +path = 'vendor/valence/crates/valence_text' [workspace.dependencies.bedwars] path = "events/bedwars" diff --git a/ci.sh b/ci.sh index 495a6a16..4ece1d53 100755 --- a/ci.sh +++ b/ci.sh @@ -1,9 +1,8 @@ #!/bin/bash set -e -cargo clippy -q --all-targets --tests --benches -- -D warnings +cargo clippy -q --all-targets --tests --benches --all-features -- -D warnings cargo +nightly fmt # Run tests but exclude benchmarks due to tango-bench framework bug (conflicting -g flags) -cargo nextest run --lib --tests - +cargo nextest run --lib --tests --all-features diff --git a/crates/hyperion-palette/Cargo.toml b/crates/hyperion-palette/Cargo.toml index 1d04440f..1da68a19 100644 --- a/crates/hyperion-palette/Cargo.toml +++ b/crates/hyperion-palette/Cargo.toml @@ -1,6 +1,5 @@ [features] default = [] -nightly = [] [dependencies] anyhow.workspace = true diff --git a/crates/hyperion-palette/src/indirect.rs b/crates/hyperion-palette/src/indirect.rs index ee320ad2..a9f54294 100644 --- a/crates/hyperion-palette/src/indirect.rs +++ b/crates/hyperion-palette/src/indirect.rs @@ -1,6 +1,3 @@ -#[cfg(feature = "nightly")] -use std::simd::{Simd, cmp::SimdPartialEq}; - use crate::{Data, HALF_LEN, LEN}; #[derive(Clone, Debug)] @@ -25,27 +22,8 @@ impl Indirect { } } - #[cfg(feature = "nightly")] - pub fn index_of(&self, data: Data) -> Option { - // Create a SIMD vector filled with the search element - let search_simd: Simd = Simd::splat(data); - - // todo: is this zero cost? - let chunk_simd: Simd = Simd::from_array(self.palette); - - // Compare the chunk with the search element - let mask = chunk_simd.simd_eq(search_simd); - - #[expect( - clippy::cast_possible_truncation, - reason = "idx is [0, 16) which is a valid u8" - )] - mask.first_set().map(|idx| idx as u8) - } - - #[cfg(not(feature = "nightly"))] pub fn index_of(&self, data: Data) -> Option { - // Fallback: linear search + // Linear search - stable and efficient for small arrays like this (16 elements) for (idx, &palette_data) in self.palette.iter().enumerate() { if palette_data == data { return u8::try_from(idx).ok(); diff --git a/crates/hyperion-palette/src/lib.rs b/crates/hyperion-palette/src/lib.rs index 95c8d394..36d4c591 100644 --- a/crates/hyperion-palette/src/lib.rs +++ b/crates/hyperion-palette/src/lib.rs @@ -1,5 +1,3 @@ -#![cfg_attr(feature = "nightly", feature(portable_simd))] - use std::{clone::Clone, iter::FusedIterator}; use roaring::RoaringBitmap; diff --git a/crates/hyperion-stats/Cargo.toml b/crates/hyperion-stats/Cargo.toml index 3d3ce1b4..7347aa3c 100644 --- a/crates/hyperion-stats/Cargo.toml +++ b/crates/hyperion-stats/Cargo.toml @@ -4,9 +4,9 @@ name = "parallel_stats" [features] default = [] -nightly = [] [dependencies] +wide = "0.7.28" [dev-dependencies] rand.workspace = true diff --git a/crates/hyperion-stats/src/lib.rs b/crates/hyperion-stats/src/lib.rs index c1d62c73..bae5ea56 100644 --- a/crates/hyperion-stats/src/lib.rs +++ b/crates/hyperion-stats/src/lib.rs @@ -1,9 +1,4 @@ -#![cfg_attr(feature = "nightly", feature(portable_simd))] -#![cfg_attr(feature = "nightly", feature(array_chunks))] -#![cfg_attr(feature = "nightly", feature(iter_array_chunks))] - -#[cfg(feature = "nightly")] -use std::simd::{f64x4, num::SimdFloat}; +use wide::{CmpGt, CmpLt, f64x4}; #[derive(Debug, Clone)] pub struct ParallelStats { @@ -28,46 +23,61 @@ impl ParallelStats { } } - /// Update multiple parallel running statistics with SIMD + /// Update multiple parallel running statistics with SIMD when possible /// Each slice must be the same length as width - #[cfg(feature = "nightly")] pub fn update(&mut self, values: &[f64]) { assert_eq!(values.len(), self.width, "Input length must match width"); - let mut chunks = (0..self.width).array_chunks::<4>(); + let mut idx = 0; - // Process in SIMD chunks of 4 parallel stats - for indices in chunks.by_ref() { - let chunk_start = indices[0]; - let chunk_end = indices.last().unwrap() + 1; - self.simd_update(chunk_start, chunk_end, &values[chunk_start..chunk_end]); + // Process in SIMD chunks of 4 parallel stats where possible + while idx + 4 <= self.width { + self.simd_update(idx, &values[idx..idx + 4]); + idx += 4; } - if let Some(remainder) = chunks.into_remainder() { - for i in remainder { - self.update_single(i, values[i]); - } + // Handle remaining elements with scalar operations + while idx < self.width { + self.update_single(idx, values[idx]); + idx += 1; } } - /// Update multiple parallel running statistics (stable fallback) - #[cfg(not(feature = "nightly"))] - pub fn update(&mut self, values: &[f64]) { - assert_eq!(values.len(), self.width, "Input length must match width"); - - // Fallback: process all elements with scalar operations - for (i, &value) in values.iter().enumerate() { - self.update_single(i, value); + fn simd_update(&mut self, chunk_start: usize, values: &[f64]) { + if values.len() != 4 { + // Fallback to scalar for incomplete chunks + for (i, &value) in values.iter().enumerate() { + self.update_single(chunk_start + i, value); + } + return; } - } - #[cfg(feature = "nightly")] - fn simd_update(&mut self, chunk_start: usize, chunk_end: usize, values: &[f64]) { - let values_simd = f64x4::from_slice(values); - let means_simd = f64x4::from_slice(&self.means[chunk_start..chunk_end]); - let m2s_simd = f64x4::from_slice(&self.m2s[chunk_start..chunk_end]); - let mins_simd = f64x4::from_slice(&self.mins[chunk_start..chunk_end]); - let maxs_simd = f64x4::from_slice(&self.maxs[chunk_start..chunk_end]); + let chunk_end = chunk_start + 4; + let values_simd = f64x4::new([values[0], values[1], values[2], values[3]]); + let means_simd = f64x4::new([ + self.means[chunk_start], + self.means[chunk_start + 1], + self.means[chunk_start + 2], + self.means[chunk_start + 3], + ]); + let m2s_simd = f64x4::new([ + self.m2s[chunk_start], + self.m2s[chunk_start + 1], + self.m2s[chunk_start + 2], + self.m2s[chunk_start + 3], + ]); + let mins_simd = f64x4::new([ + self.mins[chunk_start], + self.mins[chunk_start + 1], + self.mins[chunk_start + 2], + self.mins[chunk_start + 3], + ]); + let maxs_simd = f64x4::new([ + self.maxs[chunk_start], + self.maxs[chunk_start + 1], + self.maxs[chunk_start + 2], + self.maxs[chunk_start + 3], + ]); let counts_chunk = &mut self.counts[chunk_start..chunk_end]; // Update counts @@ -76,7 +86,7 @@ impl ParallelStats { } // Convert counts to f64x4 for SIMD division - let counts_f64 = f64x4::from_array([ + let counts_f64 = f64x4::new([ counts_chunk[0] as f64, counts_chunk[1] as f64, counts_chunk[2] as f64, @@ -91,15 +101,24 @@ impl ParallelStats { let delta2 = values_simd - new_means; let new_m2s = m2s_simd + delta * delta2; - // Update mins and maxs - let new_mins = mins_simd.simd_min(values_simd); - let new_maxs = maxs_simd.simd_max(values_simd); + // Update mins and maxs using SIMD comparisons + let values_lt_mins = values_simd.cmp_lt(mins_simd); + let values_gt_maxs = values_simd.cmp_gt(maxs_simd); + + // Blend the values based on comparisons + let new_mins = values_lt_mins.blend(values_simd, mins_simd); + let new_maxs = values_gt_maxs.blend(values_simd, maxs_simd); // Store results back - new_means.copy_to_slice(&mut self.means[chunk_start..chunk_end]); - new_m2s.copy_to_slice(&mut self.m2s[chunk_start..chunk_end]); - new_mins.copy_to_slice(&mut self.mins[chunk_start..chunk_end]); - new_maxs.copy_to_slice(&mut self.maxs[chunk_start..chunk_end]); + let new_means_array = new_means.to_array(); + let new_m2s_array = new_m2s.to_array(); + let new_mins_array = new_mins.to_array(); + let new_maxs_array = new_maxs.to_array(); + + self.means[chunk_start..chunk_start + 4].copy_from_slice(&new_means_array); + self.m2s[chunk_start..chunk_start + 4].copy_from_slice(&new_m2s_array); + self.mins[chunk_start..chunk_start + 4].copy_from_slice(&new_mins_array); + self.maxs[chunk_start..chunk_start + 4].copy_from_slice(&new_maxs_array); } fn update_single(&mut self, idx: usize, value: f64) { diff --git a/crates/hyperion/Cargo.toml b/crates/hyperion/Cargo.toml index a1595822..216524f2 100644 --- a/crates/hyperion/Cargo.toml +++ b/crates/hyperion/Cargo.toml @@ -87,7 +87,6 @@ tracing-subscriber = { workspace = true } [features] default = [] -nightly = [] [lints] workspace = true diff --git a/crates/hyperion/src/lib.rs b/crates/hyperion/src/lib.rs index 24be1cc7..386e84d6 100644 --- a/crates/hyperion/src/lib.rs +++ b/crates/hyperion/src/lib.rs @@ -1,19 +1,7 @@ //! Hyperion -#![cfg_attr(feature = "nightly", feature(allocator_api))] -#![cfg_attr(feature = "nightly", feature(read_buf))] -#![cfg_attr(feature = "nightly", feature(core_io_borrowed_buf))] -#![cfg_attr(feature = "nightly", feature(maybe_uninit_slice))] -#![cfg_attr(feature = "nightly", feature(iter_array_chunks))] -#![cfg_attr(feature = "nightly", feature(let_chains))] -#![cfg_attr(feature = "nightly", feature(never_type))] -#![cfg_attr(feature = "nightly", feature(array_chunks))] -#![cfg_attr(feature = "nightly", feature(portable_simd))] - pub const CHUNK_HEIGHT_SPAN: u32 = 384; // 512; // usually 384 -#[cfg(feature = "nightly")] -use std::alloc::Allocator; use std::{fmt::Debug, io::Write, net::SocketAddr, path::Path, sync::Arc, time::Duration}; use bevy::prelude::*; @@ -268,28 +256,12 @@ impl Plugin for HyperionCore { } } -#[cfg(feature = "nightly")] -/// A scratch buffer for intermediate operations. This will return an empty [`Vec`] when calling [`Scratch::obtain`]. -#[derive(Debug)] -pub struct Scratch { - inner: Box<[u8], A>, -} - -#[cfg(not(feature = "nightly"))] /// A scratch buffer for intermediate operations. This will return an empty [`Vec`] when calling [`Scratch::obtain`]. #[derive(Debug)] pub struct Scratch { inner: Box<[u8]>, } -#[cfg(feature = "nightly")] -impl Default for Scratch { - fn default() -> Self { - std::alloc::Global.into() - } -} - -#[cfg(not(feature = "nightly"))] impl Default for Scratch { fn default() -> Self { Self { @@ -308,35 +280,10 @@ mod sealed { pub trait Sealed {} } -#[cfg(feature = "nightly")] -impl sealed::Sealed for Scratch {} - -#[cfg(not(feature = "nightly"))] impl sealed::Sealed for Scratch {} -#[cfg(feature = "nightly")] -impl ScratchBuffer for Scratch { - fn obtain(&mut self) -> &mut [u8] { - &mut self.inner - } -} - -#[cfg(not(feature = "nightly"))] impl ScratchBuffer for Scratch { fn obtain(&mut self) -> &mut [u8] { &mut self.inner } } - -#[cfg(feature = "nightly")] -impl From for Scratch { - fn from(allocator: A) -> Self { - // A zeroed slice is allocated to avoid reading from uninitialized memory, which is UB. - // Allocating zeroed memory is usually very cheap, so there are minimal performance - // penalties from this. - let inner = Box::new_zeroed_slice_in(MAX_PACKET_SIZE, allocator); - // SAFETY: The box was initialized to zero, and u8 can be represented by zero - let inner = unsafe { inner.assume_init() }; - Self { inner } - } -} diff --git a/crates/hyperion/src/net/encoder/util.rs b/crates/hyperion/src/net/encoder/util.rs index 0c72f56d..a6d39d59 100644 --- a/crates/hyperion/src/net/encoder/util.rs +++ b/crates/hyperion/src/net/encoder/util.rs @@ -1,51 +1,5 @@ -#[cfg(not(feature = "nightly"))] use std::io::Read; -#[cfg(feature = "nightly")] -use std::{ - alloc::Allocator, - io::{BorrowedBuf, Read}, -}; -#[cfg(feature = "nightly")] -#[allow(dead_code, reason = "this might be used in the future")] -pub fn read_to_end( - r: &mut R, - buf: &mut Vec, -) -> std::io::Result<()> { - const MIN_CAPACITY: usize = 64; - - loop { - if buf.capacity() == buf.len() { - let to_reserve = buf.len().max(MIN_CAPACITY); - - buf.reserve(to_reserve); - } - - let spare = buf.spare_capacity_mut(); - let mut read_buf: BorrowedBuf<'_> = spare.into(); - let mut cursor = read_buf.unfilled(); - - r.read_buf(cursor.reborrow())?; - - // let unfilled_but_initialized = cursor.init_ref().len(); - let bytes_read = cursor.written(); - - if bytes_read == 0 { - return Ok(()); - } - - // store how much was initialized but not filled - // initialized = unfilled_but_initialized; - - // SAFETY: BorrowedBuf's invariants mean this much memory is initialized. - unsafe { - let new_len = bytes_read + buf.len(); - buf.set_len(new_len); - } - } -} - -#[cfg(not(feature = "nightly"))] #[allow(dead_code, reason = "this might be used in the future")] pub fn read_to_end(r: &mut R, buf: &mut Vec) -> std::io::Result<()> { r.read_to_end(buf)?; diff --git a/crates/packet-channel/Cargo.toml b/crates/packet-channel/Cargo.toml index 7082f3f4..2829a41a 100644 --- a/crates/packet-channel/Cargo.toml +++ b/crates/packet-channel/Cargo.toml @@ -4,7 +4,6 @@ name = "packet_channel" [features] default = [] -nightly = [] [dependencies] arc-swap = { workspace = true } diff --git a/crates/packet-channel/src/lib.rs b/crates/packet-channel/src/lib.rs index a83d146b..f319f1b2 100644 --- a/crates/packet-channel/src/lib.rs +++ b/crates/packet-channel/src/lib.rs @@ -1,32 +1,23 @@ -#![cfg_attr(feature = "nightly", feature(let_chains))] -#![cfg_attr(feature = "nightly", feature(sync_unsafe_cell))] +use std::cell::UnsafeCell; -#[cfg(feature = "nightly")] -use std::cell::SyncUnsafeCell; +/// A stable-compatible wrapper for `SyncUnsafeCell` +#[repr(transparent)] +pub struct SyncUnsafeCell(UnsafeCell); -#[cfg(not(feature = "nightly"))] -mod sync_unsafe_cell { - use std::cell::UnsafeCell; - - /// A stable-compatible wrapper for `SyncUnsafeCell` - #[repr(transparent)] - pub struct SyncUnsafeCell(UnsafeCell); - - impl SyncUnsafeCell { - #[allow(dead_code)] - pub const fn new(value: T) -> Self { - Self(UnsafeCell::new(value)) - } - - pub const fn get(&self) -> *mut T { - self.0.get() - } +impl SyncUnsafeCell { + #[allow(dead_code)] + pub const fn new(value: T) -> Self { + Self(UnsafeCell::new(value)) } - // SAFETY: This is safe because we're only using this in the same way as SyncUnsafeCell - unsafe impl Sync for SyncUnsafeCell {} + pub const fn get(&self) -> *mut T { + self.0.get() + } } +// SAFETY: This is safe because we're only using this in the same way as SyncUnsafeCell +unsafe impl Sync for SyncUnsafeCell {} + use std::{ mem::{MaybeUninit, size_of}, num::NonZeroU32, @@ -40,8 +31,6 @@ use std::{ use arc_swap::ArcSwapOption; use bevy::prelude::*; use more_asserts::debug_assert_le; -#[cfg(not(feature = "nightly"))] -use sync_unsafe_cell::SyncUnsafeCell; use valence_protocol::MAX_PACKET_SIZE; /// Reference counted fragment. Fragments are a fixed-size block of data which may contain one or diff --git a/crates/simd-utils/Cargo.toml b/crates/simd-utils/Cargo.toml index 03c944b7..f70dc3fd 100644 --- a/crates/simd-utils/Cargo.toml +++ b/crates/simd-utils/Cargo.toml @@ -8,7 +8,6 @@ publish = false [features] default = [] -nightly = [] [dependencies] diff --git a/crates/simd-utils/src/lib.rs b/crates/simd-utils/src/lib.rs index a3d65284..803fa5b2 100644 --- a/crates/simd-utils/src/lib.rs +++ b/crates/simd-utils/src/lib.rs @@ -1,40 +1,10 @@ -#![cfg_attr(feature = "nightly", feature(portable_simd))] -#![cfg_attr(feature = "nightly", feature(trusted_len))] -#![cfg_attr(feature = "nightly", feature(pointer_is_aligned_to))] - -#[cfg(feature = "nightly")] -use core::simd; -#[cfg(not(feature = "nightly"))] use std::iter::zip; -#[cfg(feature = "nightly")] -use std::{ - iter::zip, - simd::{LaneCount, Mask, MaskElement, Simd, SupportedLaneCount, cmp::SimdPartialEq}, -}; - -#[cfg(feature = "nightly")] -use crate::one_bit_positions::OneBitPositionsExt; - -#[cfg(feature = "nightly")] -mod one_bit_positions; /// Efficiently compares two slices and copies `current` into `prev`, calling `on_diff` for each difference found. /// -/// This function uses SIMD instructions when possible to accelerate the comparison and copy operations. -/// It handles two main cases: -/// -/// 1. When `prev` and `current` have the same alignment offset: -/// - Uses aligned SIMD loads/stores for better performance -/// - Processes data in three parts: -/// a. Scalar comparison of unaligned prefix -/// b. SIMD comparison of aligned middle section -/// c. Scalar comparison of unaligned suffix -/// -/// 2. When `prev` and `current` have different alignment offsets: -/// - Uses unaligned SIMD loads/stores -/// - Processes data in chunks: -/// a. SIMD comparison of main chunks with unaligned access -/// b. Scalar comparison of remaining elements +/// This function processes data in chunks for better performance, with fallback to scalar operations. +/// While SIMD optimizations have been removed for stable Rust compatibility, chunked processing +/// still provides performance benefits through better cache locality and reduced function call overhead. /// /// # Arguments /// * `prev` - Mutable slice that will be updated with values from `current` @@ -46,131 +16,27 @@ mod one_bit_positions; /// /// # Requirements /// - `prev` and `current` must have the same length -/// - Type `T` must support SIMD operations and comparisons -/// - SIMD alignment must not exceed 64 bytes -#[cfg(feature = "nightly")] pub fn copy_and_get_diff( prev: &mut [T], current: &[T], - mut on_diff: impl FnMut(usize, &T, &T), + on_diff: impl FnMut(usize, &T, &T), ) where - Simd: AsMut<[T; LANES]> + SimdPartialEq, - T: simd::SimdElement + PartialEq + std::fmt::Debug, - ::Mask: MaskElement, - LaneCount: SupportedLaneCount, - as SimdPartialEq>::Mask: Into::Mask, LANES>>, + T: Copy + PartialEq + std::fmt::Debug, { - // Verify SIMD alignment requirement at compile time - const { - assert!( - align_of::>() <= 64, - "alignment of Simd must be <= 64 bytes" - ); - } - assert_eq!( prev.len(), current.len(), "prev and current must have the same length" ); - // Split slices into SIMD-aligned sections - let (before_prev, prev_simd, after_prev) = prev.as_simd_mut::(); - let (before_current, current_simd, after_current) = current.as_simd::(); - - if before_prev.len() == before_current.len() { - // CASE 1: Same alignment offset - can use aligned SIMD operations - debug_assert_eq!( - prev_simd.len(), - current_simd.len(), - "prev_simd and current_simd must have the same length" - ); - debug_assert_eq!( - after_prev.len(), - after_current.len(), - "after_prev and after_current must have the same length" - ); - - // Handle unaligned prefix - copy_and_get_diff_scalar(0, before_prev, before_current, &mut on_diff); - - // Process aligned middle section using SIMD - let mut idx = before_prev.len(); - for (prev, current) in zip(prev_simd, current_simd) { - let not_equal = prev.simd_ne(*current); - let not_equal = not_equal.into(); - let bitmask = Mask::to_bitmask(not_equal); - - // Process each difference found in the SIMD lane - for local_idx in bitmask.one_positions() { - let prev = prev[local_idx]; - let current = current[local_idx]; - debug_assert_ne!(prev, current); - on_diff(idx + local_idx, &prev, ¤t); - } - - idx += LANES; - current.copy_to_slice(prev.as_mut()); - } - - // Handle unaligned suffix - copy_and_get_diff_scalar(idx, after_prev, after_current, &mut on_diff); - } else { - // CASE 2: Different alignment offsets - use unaligned SIMD operations - let (prev_chunks, prev_remaining) = prev.as_chunks_mut::(); - let (current_chunks, current_remaining) = current.as_chunks::(); - - debug_assert_eq!( - prev_chunks.len(), - current_chunks.len(), - "prev_chunks and current_chunks must have the same length" - ); - debug_assert_eq!( - prev_remaining.len(), - current_remaining.len(), - "prev_remaining and current_remaining must have the same length" - ); - - let mut idx = 0; - // Process main chunks with unaligned SIMD operations - for (prev, current) in zip(prev_chunks, current_chunks) { - let prev_simd = Simd::from_array(*prev); - let current_simd = Simd::from_array(*current); - - let not_equal = prev_simd.simd_ne(current_simd); - let not_equal = not_equal.into(); - let bitmask = Mask::to_bitmask(not_equal); - - for local_idx in bitmask.one_positions() { - let prev = prev[local_idx]; - let current = current[local_idx]; - debug_assert_ne!(prev, current); - on_diff(idx + local_idx, &prev, ¤t); - } - - idx += LANES; - current_simd.copy_to_slice(prev); - } - - // Handle remaining elements - copy_and_get_diff_scalar(idx, prev_remaining, current_remaining, &mut on_diff); - } -} - -/// Fallback implementation for stable Rust (non-SIMD) -#[cfg(not(feature = "nightly"))] -pub fn copy_and_get_diff( - prev: &mut [T], - current: &[T], - on_diff: impl FnMut(usize, &T, &T), -) where - T: Copy + PartialEq + std::fmt::Debug, -{ + // Process all elements with optimized scalar operations copy_and_get_diff_scalar(0, prev, current, on_diff); } -/// Scalar (non-SIMD) implementation of [`copy_and_get_diff`] for handling small sections -/// or remainders that can't be processed with SIMD. +/// Optimized scalar implementation of [`copy_and_get_diff`]. +/// +/// While not using SIMD, this implementation uses chunked processing for better +/// performance through improved cache locality and reduced overhead. fn copy_and_get_diff_scalar( start_idx: usize, prev: &mut [T], @@ -179,16 +45,42 @@ fn copy_and_get_diff_scalar( ) where T: Copy + PartialEq + std::fmt::Debug, { - let mut idx = start_idx; + const CHUNK_SIZE: usize = 64; + debug_assert_eq!(prev.len(), current.len()); - for (prev, current) in zip(prev, current) { - if prev != current { - debug_assert_ne!(prev, current); - on_diff(idx, prev, current); + let mut idx = start_idx; + let mut remaining_prev = prev; + let mut remaining_current = current; + + // Process large chunks + while remaining_prev.len() >= CHUNK_SIZE { + let (chunk_prev, rest_prev) = remaining_prev.split_at_mut(CHUNK_SIZE); + let (chunk_current, rest_current) = remaining_current.split_at(CHUNK_SIZE); + + // Process chunk with unrolled comparisons for better performance + for i in (0..CHUNK_SIZE).step_by(4) { + // Unroll 4 iterations to reduce loop overhead + let end = (i + 4).min(CHUNK_SIZE); + for j in i..end { + if chunk_prev[j] != chunk_current[j] { + on_diff(idx + j, &chunk_prev[j], &chunk_current[j]); + } + chunk_prev[j] = chunk_current[j]; + } } - *prev = *current; - idx += 1; + + idx += CHUNK_SIZE; + remaining_prev = rest_prev; + remaining_current = rest_current; + } + + // Process remaining elements + for (i, (prev_val, current_val)) in zip(remaining_prev, remaining_current).enumerate() { + if prev_val != current_val { + on_diff(idx + i, prev_val, current_val); + } + *prev_val = *current_val; } } @@ -200,37 +92,7 @@ mod tests { const LANES: usize = 8; - #[cfg(feature = "nightly")] - const SIMD_U32_ALIGN: usize = std::mem::align_of::>(); - - #[cfg(feature = "nightly")] - use aligned_vec::{AVec, RuntimeAlign}; - #[cfg(feature = "nightly")] - use proptest::prelude::*; - - // Helper function to collect differences (SIMD version) - #[cfg(feature = "nightly")] - fn collect_diffs(prev_raw: &[T], current_raw: &[T]) -> Vec<(usize, T, T)> - where - Simd: AsMut<[T; LANES]> + SimdPartialEq, - T: simd::SimdElement + PartialEq + Debug, - ::Mask: MaskElement, - LaneCount: SupportedLaneCount, - as SimdPartialEq>::Mask: Into::Mask, LANES>>, - { - // convert prev and current to simd-aligned arrays - let mut prev: AVec = AVec::from_iter(64, prev_raw.iter().copied()); - let current: AVec = AVec::from_iter(64, current_raw.iter().copied()); - - let mut diffs = Vec::new(); - copy_and_get_diff::<_, LANES>(&mut prev, ¤t, |idx, prev, curr| { - diffs.push((idx, *prev, *curr)); - }); - diffs - } - - // Helper function to collect differences (non-SIMD version) - #[cfg(not(feature = "nightly"))] + // Helper function to collect differences fn collect_diffs(prev_raw: &[T], current_raw: &[T]) -> Vec<(usize, T, T)> where T: Copy + PartialEq + Debug, @@ -245,24 +107,6 @@ mod tests { diffs } - // Generate arrays of various sizes to test SIMD boundary conditions - #[cfg(feature = "nightly")] - fn generate_array_strategy(min_size: usize) -> impl Strategy> - where - T: simd::SimdElement + Arbitrary + 'static, - { - prop::collection::vec(any::(), min_size..=min_size + LANES * 2) - } - - // Generate arrays of an exact size - #[cfg(feature = "nightly")] - fn generate_exact_array_strategy(size: usize) -> impl Strategy> - where - T: simd::SimdElement + Arbitrary + 'static, - { - prop::collection::vec(any::(), size) - } - // Helper to verify that all differences are captured correctly fn verify_differences(prev: &[T], current: &[T], diffs: &[(usize, T, T)]) where @@ -281,8 +125,6 @@ mod tests { ); } - // Simple non-SIMD test for stable Rust - #[cfg(not(feature = "nightly"))] #[test] fn test_basic_functionality() { let prev = vec![1u32, 2, 3, 4, 5]; @@ -296,157 +138,86 @@ mod tests { assert_eq!(diffs, expected_diffs); } - #[cfg(feature = "nightly")] - proptest! { - // Test with u32 arrays of various sizes - #[test] - fn test_u32_arrays( - current in generate_array_strategy::(LANES * 2) - ) { - let mut prev = current.clone(); - // Modify some elements to create differences - if !prev.is_empty() { - let prev_len = prev.len(); - prev[prev_len / 2] = prev[prev_len / 2].wrapping_add(1); - if prev_len > 1 { - prev[0] = prev[0].wrapping_add(1); - } - } - - let diffs = collect_diffs(&prev, ¤t); - verify_differences(&prev, ¤t, &diffs); - } - - // Test with i32 arrays including negative numbers - #[test] - fn test_i32_arrays( - current in generate_array_strategy::(LANES * 2) - ) { - let mut prev = current.clone(); - if !prev.is_empty() { - let prev_len = prev.len(); - prev[prev_len / 2] = prev[prev_len / 2].wrapping_add(1); - if prev_len > 1 { - prev[0] = prev[0].wrapping_sub(1); - } - } - - let diffs = collect_diffs(&prev, ¤t); - verify_differences(&prev, ¤t, &diffs); - } - - // Test with varying align offset - #[test] - fn test_varying_align_offset( - current in generate_exact_array_strategy::(LANES * 4), - mut prev in generate_exact_array_strategy::(LANES * 4) - ) { - // Ensure that [`current`] and [`prev`] have a different align offset - let current = ¤t[..(current.len() - 1)]; - let mut prev = prev.as_mut_slice(); - - if prev.as_ptr().align_offset(SIMD_U32_ALIGN) == current.as_ptr().align_offset(SIMD_U32_ALIGN) { - // Offset [`prev`] by 1 element to get a different align offset - prev = &mut prev[1..]; - } else { - // Keep the align offset of [`prev`] the same but truncate it to the same size as - // [`current`] - let len = prev.len() - 1; - prev = &mut prev[..len]; - } - - assert_eq!(prev.len(), current.len()); - assert_ne!(prev.as_ptr().align_offset(SIMD_U32_ALIGN), current.as_ptr().align_offset(SIMD_U32_ALIGN)); - - let diffs = collect_diffs(prev, current); - verify_differences(prev, current, &diffs); - } + #[test] + fn test_large_array() { + // Test with a larger array that will use chunked processing + let mut prev = vec![0u32; 200]; + let mut current = vec![0u32; 200]; + + // Set some differences at various positions + prev[1] = 10; + current[1] = 20; + prev[65] = 30; // In second chunk + current[65] = 40; + prev[130] = 50; // In third chunk + current[130] = 60; + prev[199] = 70; // Last element + current[199] = 80; - // Test with same align offset but not aligned with a simd vector - #[test] - fn test_same_align_offset( - mut data in generate_exact_array_strategy::(LANES * 4 + 1), - ) { - let mut data = data.as_mut_slice(); - if data.as_ptr().is_aligned_to(SIMD_U32_ALIGN) { - data = &mut data[1..]; - } + let diffs = collect_diffs(&prev, ¤t); + verify_differences(&prev, ¤t, &diffs); - let len = LANES * 2; - let (prev, current) = data.split_at_mut(len); - let current = ¤t[..len]; + let expected_diffs = vec![ + (1, 10u32, 20u32), + (65, 30u32, 40u32), + (130, 50u32, 60u32), + (199, 70u32, 80u32), + ]; + assert_eq!(diffs, expected_diffs); + } - assert_eq!(prev.len(), current.len()); - assert!(!prev.as_ptr().is_aligned_to(SIMD_U32_ALIGN)); - assert!(!current.as_ptr().is_aligned_to(SIMD_U32_ALIGN)); - assert_eq!(prev.as_ptr().align_offset(SIMD_U32_ALIGN), current.as_ptr().align_offset(SIMD_U32_ALIGN)); + #[test] + fn test_no_differences() { + let current = vec![1u32, 2, 3, 4, 5, 6, 7, 8]; + let diffs = collect_diffs(¤t, ¤t); + assert!(diffs.is_empty(), "Expected no differences"); + } - let diffs = collect_diffs(prev, current); - verify_differences(prev, current, &diffs); - } + #[test] + fn test_all_different() { + let prev = vec![1u32, 2, 3, 4]; + let current = vec![5u32, 6, 7, 8]; - // Test with exact SIMD lane size - #[test] - fn test_exact_lane_size( - current in generate_array_strategy::(LANES) - ) { - let mut prev = current.clone(); - if !prev.is_empty() { - prev[0] = prev[0].wrapping_add(1); - } + let diffs = collect_diffs(&prev, ¤t); + verify_differences(&prev, ¤t, &diffs); - let diffs = collect_diffs(&prev, ¤t); - verify_differences(&prev, ¤t, &diffs); - } + let expected_diffs = vec![ + (0, 1u32, 5u32), + (1, 2u32, 6u32), + (2, 3u32, 7u32), + (3, 4u32, 8u32), + ]; + assert_eq!(diffs, expected_diffs); + } - // Test with arrays smaller than SIMD lane size - #[test] - fn test_small_arrays( - current in generate_array_strategy::(LANES / 2) - ) { - let mut prev = current.clone(); - if !prev.is_empty() { - prev[0] = prev[0].wrapping_add(1); - } + #[test] + fn test_i32_arrays() { + let prev = vec![-1i32, 2, -3, 4, 5]; + let current = vec![-1i32, 3, -3, 5, 5]; - let diffs = collect_diffs(&prev, ¤t); - verify_differences(&prev, ¤t, &diffs); - } + let diffs = collect_diffs(&prev, ¤t); + verify_differences(&prev, ¤t, &diffs); - // Test with no differences - #[test] - fn test_no_differences( - current in generate_array_strategy::(LANES * 2) - ) { - let diffs = collect_diffs(¤t, ¤t); - assert!(diffs.is_empty(), "Expected no differences"); - } + let expected_diffs = vec![(1, 2i32, 3i32), (3, 4i32, 5i32)]; + assert_eq!(diffs, expected_diffs); + } - // Test with all elements different - #[test] - fn test_all_different( - current in generate_array_strategy::(LANES * 2) - ) { - let prev = current.iter() - .map(|x| x.wrapping_add(1)) - .collect::>(); - - let diffs = collect_diffs(&prev, ¤t); - verify_differences(&prev, ¤t, &diffs); - } + #[test] + fn test_chunk_boundaries() { + // Test with array size that crosses chunk boundaries + let size = 130; // Crosses the 64-element chunk boundary + let prev = vec![0u32; size]; + let current = vec![1u32; size]; // All different - // Test edge case with alternating differences - #[test] - fn test_alternating_differences( - current in generate_array_strategy::(LANES * 2) - ) { - let mut prev = current.clone(); - for i in (0..prev.len()).step_by(2) { - prev[i] = prev[i].wrapping_add(1); - } + let diffs = collect_diffs(&prev, ¤t); + verify_differences(&prev, ¤t, &diffs); - let diffs = collect_diffs(&prev, ¤t); - verify_differences(&prev, ¤t, &diffs); + // Should find differences at every position + assert_eq!(diffs.len(), size); + for (i, (idx, prev_val, curr_val)) in diffs.iter().enumerate() { + assert_eq!(*idx, i); + assert_eq!(*prev_val, 0u32); + assert_eq!(*curr_val, 1u32); } } } diff --git a/crates/simd-utils/src/one_bit_positions.rs b/crates/simd-utils/src/one_bit_positions.rs deleted file mode 100644 index 71870496..00000000 --- a/crates/simd-utils/src/one_bit_positions.rs +++ /dev/null @@ -1,53 +0,0 @@ -use std::iter::{FusedIterator, TrustedLen}; - -pub struct OneBitPositions { - pub remaining: u64, -} - -impl OneBitPositions { - const fn new(number: u64) -> Self { - Self { remaining: number } - } -} - -impl Iterator for OneBitPositions { - type Item = usize; - - fn next(&mut self) -> Option { - if self.remaining == 0 { - None - } else { - // Get position of lowest set bit - let pos = self.remaining.trailing_zeros(); - // Clear the lowest set bit - self.remaining &= self.remaining - 1; - Some(pos as usize) - } - } - - fn size_hint(&self) -> (usize, Option) { - let len = self.len(); - (len, Some(len)) - } -} - -impl ExactSizeIterator for OneBitPositions { - fn len(&self) -> usize { - self.remaining.count_ones() as usize - } -} - -impl FusedIterator for OneBitPositions {} - -unsafe impl TrustedLen for OneBitPositions {} - -// Extension trait for more ergonomic usage -pub trait OneBitPositionsExt { - fn one_positions(self) -> OneBitPositions; -} - -impl OneBitPositionsExt for u64 { - fn one_positions(self) -> OneBitPositions { - OneBitPositions::new(self) - } -} From c323be327c40dbfd4af6f600088cb3dbc926a331 Mon Sep 17 00:00:00 2001 From: Andrew Gazelka Date: Tue, 2 Sep 2025 18:39:28 -0700 Subject: [PATCH 5/9] add valence, bvh --- .gitignore | 2 +- vendor/bvh-data | 1 + .../valence/.devcontainer/devcontainer.json | 10 + vendor/valence/.github/FUNDING.yml | 2 + .../.github/ISSUE_TEMPLATE/bug_report.md | 40 + .../valence/.github/ISSUE_TEMPLATE/config.yml | 4 + .../.github/ISSUE_TEMPLATE/feature_request.md | 23 + vendor/valence/.github/dependabot.yml | 15 + .../valence/.github/pull_request_template.md | 8 + .../.github/workflows/ci-pr-comments.yml | 66 + vendor/valence/.github/workflows/ci.yml | 228 + vendor/valence/.github/workflows/website.yml | 71 + vendor/valence/.gitignore | 18 + vendor/valence/CODE_OF_CONDUCT.md | 133 + vendor/valence/CONTRIBUTING.md | 255 + vendor/valence/Cargo.toml | 211 + vendor/valence/Cargo.toml.backup | 1 + vendor/valence/LICENSE.txt | 21 + vendor/valence/README.md | 124 + vendor/valence/assets/logo-256x256.png | Bin 0 -> 15166 bytes vendor/valence/assets/logo-64x64.png | Bin 0 -> 3575 bytes vendor/valence/assets/many-players.png | Bin 0 -> 1058485 bytes vendor/valence/assets/packet-inspector.png | Bin 0 -> 128290 bytes vendor/valence/benches/anvil.rs | 137 + vendor/valence/benches/block.rs | 91 + vendor/valence/benches/decode_array.rs | 29 + vendor/valence/benches/idle.rs | 43 + vendor/valence/benches/main.rs | 23 + vendor/valence/benches/many_players.rs | 124 + vendor/valence/benches/packet.rs | 246 + vendor/valence/benches/var_int.rs | 37 + vendor/valence/benches/var_long.rs | 37 + vendor/valence/crates/README.md | 11 + vendor/valence/crates/java_string/Cargo.toml | 16 + vendor/valence/crates/java_string/README.md | 17 + .../valence/crates/java_string/src/cesu8.rs | 279 + vendor/valence/crates/java_string/src/char.rs | 1012 + .../valence/crates/java_string/src/error.rs | 126 + vendor/valence/crates/java_string/src/iter.rs | 977 + vendor/valence/crates/java_string/src/lib.rs | 26 + .../valence/crates/java_string/src/owned.rs | 1401 + .../valence/crates/java_string/src/pattern.rs | 402 + .../valence/crates/java_string/src/serde.rs | 263 + .../valence/crates/java_string/src/slice.rs | 2267 + .../crates/java_string/src/validations.rs | 369 + .../crates/valence_advancement/Cargo.toml | 17 + .../crates/valence_advancement/README.md | 7 + .../crates/valence_advancement/src/event.rs | 29 + .../crates/valence_advancement/src/lib.rs | 489 + .../valence/crates/valence_anvil/Cargo.toml | 28 + vendor/valence/crates/valence_anvil/README.md | 3 + .../valence/crates/valence_anvil/src/bevy.rs | 270 + .../valence/crates/valence_anvil/src/lib.rs | 760 + .../crates/valence_anvil/src/parsing.rs | 380 + .../crates/valence_boss_bar/Cargo.toml | 18 + .../valence/crates/valence_boss_bar/README.md | 3 + .../crates/valence_boss_bar/src/components.rs | 65 + .../crates/valence_boss_bar/src/lib.rs | 257 + .../crates/valence_build_utils/Cargo.toml | 14 + .../crates/valence_build_utils/README.md | 3 + .../crates/valence_build_utils/src/lib.rs | 62 + .../valence/crates/valence_bytes/Cargo.toml | 12 + vendor/valence/crates/valence_bytes/README.md | 3 + .../crates/valence_bytes/src/cow_bytes.rs | 91 + .../valence_bytes/src/cow_fixed_bytes.rs | 41 + .../valence_bytes/src/cow_utf8_bytes.rs | 58 + .../crates/valence_bytes/src/fixed_bytes.rs | 102 + .../valence/crates/valence_bytes/src/lib.rs | 12 + .../valence/crates/valence_bytes/src/utf8.rs | 101 + .../valence/crates/valence_command/Cargo.toml | 23 + .../valence/crates/valence_command/README.md | 13 + .../crates/valence_command/src/graph.rs | 533 + .../crates/valence_command/src/handler.rs | 126 + .../valence/crates/valence_command/src/lib.rs | 48 + .../crates/valence_command/src/manager.rs | 418 + .../valence_command/src/modifier_value.rs | 219 + .../crates/valence_command/src/parsers.rs | 309 + .../valence_command/src/parsers/angle.rs | 20 + .../valence_command/src/parsers/block_pos.rs | 62 + .../valence_command/src/parsers/bool.rs | 42 + .../valence_command/src/parsers/color.rs | 54 + .../valence_command/src/parsers/column_pos.rs | 64 + .../src/parsers/entity_anchor.rs | 29 + .../src/parsers/entity_selector.rs | 136 + .../valence_command/src/parsers/gamemode.rs | 28 + .../src/parsers/inventory_slot.rs | 20 + .../valence_command/src/parsers/numbers.rs | 55 + .../valence_command/src/parsers/rotation.rs | 21 + .../src/parsers/score_holder.rs | 27 + .../valence_command/src/parsers/strings.rs | 107 + .../valence_command/src/parsers/swizzle.rs | 117 + .../valence_command/src/parsers/time.rs | 83 + .../valence_command/src/parsers/vec2.rs | 56 + .../valence_command/src/parsers/vec3.rs | 59 + .../crates/valence_command/src/scopes.rs | 298 + .../crates/valence_command_macros/Cargo.toml | 18 + .../crates/valence_command_macros/README.md | 143 + .../crates/valence_command_macros/src/lib.rs | 706 + .../valence/crates/valence_entity/Cargo.toml | 36 + .../valence/crates/valence_entity/README.md | 5 + vendor/valence/crates/valence_entity/build.rs | 783 + .../valence_entity/extracted/entities.json | 6224 + .../crates/valence_entity/extracted/misc.json | 551 + .../src/active_status_effects.rs | 525 + .../crates/valence_entity/src/attributes.rs | 475 + .../crates/valence_entity/src/flags.rs | 144 + .../crates/valence_entity/src/hitbox.rs | 549 + .../valence/crates/valence_entity/src/lib.rs | 712 + .../crates/valence_entity/src/manager.rs | 45 + .../crates/valence_entity/src/query.rs | 209 + .../crates/valence_entity/src/tracked_data.rs | 136 + .../crates/valence_generated/Cargo.toml | 24 + .../crates/valence_generated/README.md | 4 + .../valence_generated/build/attributes.rs | 170 + .../crates/valence_generated/build/block.rs | 1064 + .../valence_generated/build/chunk_view.rs | 40 + .../crates/valence_generated/build/item.rs | 338 + .../crates/valence_generated/build/main.rs | 21 + .../valence_generated/build/packet_id.rs | 37 + .../crates/valence_generated/build/sound.rs | 122 + .../valence_generated/build/status_effects.rs | 286 + .../extracted/attributes.json | 119 + .../valence_generated/extracted/blocks.json | 289553 +++++++++++++++ .../valence_generated/extracted/effects.json | 338 + .../valence_generated/extracted/items.json | 11701 + .../valence_generated/extracted/packets.json | 1052 + .../valence_generated/extracted/sounds.json | 5898 + .../crates/valence_generated/src/block.rs | 83 + .../crates/valence_generated/src/lib.rs | 26 + .../valence/crates/valence_ident/Cargo.toml | 16 + vendor/valence/crates/valence_ident/README.md | 3 + .../valence/crates/valence_ident/src/lib.rs | 268 + .../crates/valence_ident_macros/Cargo.toml | 17 + .../crates/valence_ident_macros/README.md | 3 + .../crates/valence_ident_macros/src/lib.rs | 45 + .../crates/valence_inventory/Cargo.toml | 16 + .../crates/valence_inventory/README.md | 31 + .../crates/valence_inventory/src/lib.rs | 1449 + .../valence_inventory/src/player_inventory.rs | 24 + .../crates/valence_inventory/src/validate.rs | 826 + vendor/valence/crates/valence_lang/Cargo.toml | 18 + vendor/valence/crates/valence_lang/README.md | 5 + vendor/valence/crates/valence_lang/build.rs | 46 + .../extracted/translation_keys.json | 24914 ++ vendor/valence/crates/valence_lang/src/lib.rs | 8 + vendor/valence/crates/valence_math/Cargo.toml | 12 + vendor/valence/crates/valence_math/README.md | 6 + .../valence/crates/valence_math/src/aabb.rs | 214 + vendor/valence/crates/valence_math/src/lib.rs | 6 + vendor/valence/crates/valence_nbt/Cargo.toml | 32 + vendor/valence/crates/valence_nbt/README.md | 14 + .../valence/crates/valence_nbt/src/binary.rs | 73 + .../crates/valence_nbt/src/binary/decode.rs | 373 + .../crates/valence_nbt/src/binary/encode.rs | 391 + .../crates/valence_nbt/src/binary/error.rs | 61 + .../valence_nbt/src/binary/modified_utf8.rs | 127 + .../crates/valence_nbt/src/binary/tests.rs | 131 + .../crates/valence_nbt/src/compound.rs | 688 + vendor/valence/crates/valence_nbt/src/conv.rs | 52 + vendor/valence/crates/valence_nbt/src/lib.rs | 110 + vendor/valence/crates/valence_nbt/src/list.rs | 975 + .../valence/crates/valence_nbt/src/serde.rs | 39 + .../crates/valence_nbt/src/serde/de.rs | 393 + .../crates/valence_nbt/src/serde/ser.rs | 627 + .../crates/valence_nbt/src/serde/tests.rs | 109 + vendor/valence/crates/valence_nbt/src/snbt.rs | 726 + vendor/valence/crates/valence_nbt/src/tag.rs | 18 + .../valence/crates/valence_nbt/src/value.rs | 634 + .../valence/crates/valence_network/Cargo.toml | 45 + .../valence/crates/valence_network/README.md | 10 + .../valence_network/src/byte_channel.rs | 254 + .../crates/valence_network/src/connect.rs | 568 + .../crates/valence_network/src/legacy_ping.rs | 334 + .../valence/crates/valence_network/src/lib.rs | 693 + .../crates/valence_network/src/packet_io.rs | 255 + .../crates/valence_player_list/Cargo.toml | 16 + .../crates/valence_player_list/README.md | 6 + .../crates/valence_player_list/src/lib.rs | 387 + .../crates/valence_protocol/Cargo.toml | 41 + .../valence/crates/valence_protocol/README.md | 47 + .../crates/valence_protocol/src/array.rs | 58 + .../crates/valence_protocol/src/biome_pos.rs | 36 + .../crates/valence_protocol/src/bit_set.rs | 126 + .../crates/valence_protocol/src/block_pos.rs | 226 + .../crates/valence_protocol/src/bounded.rs | 42 + .../crates/valence_protocol/src/byte_angle.rs | 51 + .../crates/valence_protocol/src/chunk_pos.rs | 111 + .../valence_protocol/src/chunk_section_pos.rs | 104 + .../crates/valence_protocol/src/decode.rs | 242 + .../crates/valence_protocol/src/difficulty.rs | 9 + .../crates/valence_protocol/src/direction.rs | 19 + .../crates/valence_protocol/src/encode.rs | 390 + .../crates/valence_protocol/src/game_mode.rs | 45 + .../crates/valence_protocol/src/global_pos.rs | 10 + .../crates/valence_protocol/src/hand.rs | 8 + .../crates/valence_protocol/src/impls.rs | 25 + .../crates/valence_protocol/src/impls/map.rs | 299 + .../crates/valence_protocol/src/impls/math.rs | 183 + .../valence_protocol/src/impls/other.rs | 156 + .../valence_protocol/src/impls/pointer.rs | 115 + .../valence_protocol/src/impls/primitive.rs | 222 + .../valence_protocol/src/impls/sequence.rs | 307 + .../valence_protocol/src/impls/string.rs | 175 + .../valence_protocol/src/impls/tuple.rs | 46 + .../crates/valence_protocol/src/item.rs | 119 + .../crates/valence_protocol/src/lib.rs | 549 + .../crates/valence_protocol/src/packets.rs | 366 + .../src/packets/handshaking/handshake_c2s.rs | 20 + .../packets/login/login_compression_s2c.rs | 7 + .../src/packets/login/login_disconnect_s2c.rs | 9 + .../src/packets/login/login_hello_c2s.rs | 11 + .../src/packets/login/login_hello_s2c.rs | 11 + .../src/packets/login/login_key_c2s.rs | 10 + .../packets/login/login_query_request_s2c.rs | 11 + .../packets/login/login_query_response_c2s.rs | 8 + .../src/packets/login/login_success_s2c.rs | 15 + .../src/packets/play/advancement_tab_c2s.rs | 9 + .../packets/play/advancement_update_s2c.rs | 106 + .../play/block_breaking_progress_s2c.rs | 8 + .../packets/play/block_entity_update_s2c.rs | 13 + .../src/packets/play/block_event_s2c.rs | 10 + .../src/packets/play/block_update_s2c.rs | 7 + .../src/packets/play/boat_paddle_state_c2s.rs | 7 + .../src/packets/play/book_update_c2s.rs | 14 + .../src/packets/play/boss_bar_s2c.rs | 65 + .../src/packets/play/bundle_splitter_s2c.rs | 5 + .../src/packets/play/button_click_c2s.rs | 7 + .../src/packets/play/chat_message_c2s.rs | 16 + .../src/packets/play/chat_message_s2c.rs | 135 + .../src/packets/play/chat_suggestions_s2c.rs | 18 + .../src/packets/play/chunk_biome_data_s2c.rs | 17 + .../src/packets/play/chunk_data_s2c.rs | 30 + .../packets/play/chunk_delta_update_s2c.rs | 39 + .../packets/play/chunk_load_distance_s2c.rs | 6 + .../play/chunk_render_distance_center_s2c.rs | 7 + .../src/packets/play/clear_title_s2c.rs | 6 + .../src/packets/play/click_slot_c2s.rs | 33 + .../src/packets/play/client_command_c2s.rs | 21 + .../src/packets/play/client_settings_c2s.rs | 44 + .../src/packets/play/client_status_c2s.rs | 7 + .../packets/play/close_handled_screen_c2s.rs | 6 + .../src/packets/play/close_screen_s2c.rs | 7 + .../src/packets/play/command_execution_c2s.rs | 22 + .../packets/play/command_suggestions_s2c.rs | 20 + .../src/packets/play/command_tree_s2c.rs | 438 + .../src/packets/play/cooldown_update_s2c.rs | 7 + .../packets/play/craft_failed_response_s2c.rs | 9 + .../src/packets/play/craft_request_c2s.rs | 10 + .../play/creative_inventory_action_c2s.rs | 7 + .../src/packets/play/custom_payload_c2s.rs | 11 + .../src/packets/play/custom_payload_s2c.rs | 11 + .../src/packets/play/damage_tilt_s2c.rs | 9 + .../src/packets/play/death_message_s2c.rs | 11 + .../src/packets/play/difficulty_s2c.rs | 7 + .../src/packets/play/disconnect_s2c.rs | 11 + .../src/packets/play/end_combat_s2c.rs | 7 + .../src/packets/play/enter_combat_s2c.rs | 5 + .../src/packets/play/entities_destroy_s2c.rs | 8 + .../src/packets/play/entity_animation_s2c.rs | 7 + .../src/packets/play/entity_attach_s2c.rs | 7 + .../src/packets/play/entity_attributes_s2c.rs | 24 + .../src/packets/play/entity_damage_s2c.rs | 24 + .../play/entity_equipment_update_s2c.rs | 58 + .../packets/play/entity_passengers_set_s2c.rs | 10 + .../src/packets/play/entity_position_s2c.rs | 12 + .../packets/play/entity_set_head_yaw_s2c.rs | 7 + .../src/packets/play/entity_spawn_s2c.rs | 20 + .../packets/play/entity_status_effect_s2c.rs | 24 + .../src/packets/play/entity_status_s2c.rs | 7 + .../packets/play/entity_tracker_update_s2c.rs | 7 + .../play/entity_velocity_update_s2c.rs | 7 + .../packets/play/experience_bar_update_s2c.rs | 8 + .../packets/play/experience_orb_spawn_s2c.rs | 14 + .../src/packets/play/explosion_s2c.rs | 13 + .../src/packets/play/features_s2c.rs | 11 + .../src/packets/play/full_c2s.rs | 12 + .../src/packets/play/game_join_s2c.rs | 30 + .../src/packets/play/game_message_s2c.rs | 12 + .../src/packets/play/game_state_change_s2c.rs | 23 + .../src/packets/play/hand_swing_c2s.rs | 6 + .../src/packets/play/health_update_s2c.rs | 8 + .../src/packets/play/inventory_s2c.rs | 11 + .../packets/play/item_pickup_animation_s2c.rs | 8 + .../src/packets/play/jigsaw_generating_c2s.rs | 8 + .../src/packets/play/keep_alive_c2s.rs | 6 + .../src/packets/play/keep_alive_s2c.rs | 6 + .../src/packets/play/light_update_s2c.rs | 16 + .../packets/play/look_and_on_ground_c2s.rs | 9 + .../src/packets/play/look_at_s2c.rs | 23 + .../src/packets/play/map_update_s2c.rs | 114 + .../play/message_acknowledgment_c2s.rs | 6 + .../src/packets/play/move_relative_s2c.rs | 9 + .../packets/play/nbt_query_response_s2c.rs | 9 + .../src/packets/play/on_ground_only_c2s.rs | 7 + .../src/packets/play/open_horse_screen_s2c.rs | 8 + .../src/packets/play/open_screen_s2c.rs | 40 + .../src/packets/play/open_written_book_s2c.rs | 6 + .../src/packets/play/overlay_message_s2c.rs | 10 + .../src/packets/play/particle_s2c.rs | 441 + .../packets/play/pick_from_inventory_c2s.rs | 6 + .../src/packets/play/play_ping_s2c.rs | 6 + .../src/packets/play/play_pong_c2s.rs | 6 + .../play/play_sound_from_entity_s2c.rs | 12 + .../src/packets/play/play_sound_s2c.rs | 14 + .../src/packets/play/player_abilities_s2c.rs | 22 + .../src/packets/play/player_action_c2s.rs | 20 + .../play/player_action_response_s2c.rs | 6 + .../src/packets/play/player_input_c2s.rs | 19 + .../packets/play/player_interact_block_c2s.rs | 13 + .../play/player_interact_entity_c2s.rs | 17 + .../packets/play/player_interact_item_c2s.rs | 7 + .../packets/play/player_list_header_s2c.rs | 11 + .../src/packets/play/player_list_s2c.rs | 136 + .../packets/play/player_position_look_s2c.rs | 25 + .../src/packets/play/player_remove_s2c.rs | 10 + .../src/packets/play/player_respawn_s2c.rs | 18 + .../src/packets/play/player_session_c2s.rs | 13 + .../packets/play/player_spawn_position_s2c.rs | 7 + .../src/packets/play/player_spawn_s2c.rs | 27 + .../play/position_and_on_ground_c2s.rs | 10 + .../play/profileless_chat_message_s2c.rs | 13 + .../src/packets/play/query_block_nbt_c2s.rs | 7 + .../src/packets/play/query_entity_nbt_c2s.rs | 7 + .../src/packets/play/recipe_book_data_c2s.rs | 8 + .../play/recipe_category_options_c2s.rs | 16 + .../play/remove_entity_status_effect_s2c.rs | 7 + .../src/packets/play/remove_message_s2c.rs | 7 + .../src/packets/play/rename_item_c2s.rs | 9 + .../play/request_command_completions_c2s.rs | 9 + .../packets/play/resource_pack_send_s2c.rs | 14 + .../packets/play/resource_pack_status_c2s.rs | 13 + .../play/rotate_and_move_relative_s2c.rs | 11 + .../src/packets/play/rotate_s2c.rs | 10 + .../packets/play/scoreboard_display_s2c.rs | 83 + .../play/scoreboard_objective_update_s2c.rs | 37 + .../play/scoreboard_player_update_s2c.rs | 20 + .../screen_handler_property_update_s2c.rs | 8 + .../play/screen_handler_slot_update_s2c.rs | 11 + .../play/select_advancement_tab_s2c.rs | 8 + .../packets/play/select_merchant_trade_c2s.rs | 6 + .../src/packets/play/server_metadata_s2c.rs | 13 + .../src/packets/play/set_camera_entity_s2c.rs | 6 + .../src/packets/play/set_trade_offers_s2c.rs | 25 + .../src/packets/play/sign_editor_open_s2c.rs | 6 + .../packets/play/simulation_distance_s2c.rs | 6 + .../packets/play/spectator_teleport_c2s.rs | 8 + .../src/packets/play/statistics_s2c.rs | 13 + .../src/packets/play/stop_sound_s2c.rs | 52 + .../src/packets/play/subtitle_s2c.rs | 10 + .../packets/play/synchronize_recipes_s2c.rs | 107 + .../src/packets/play/synchronize_tags_s2c.rs | 13 + .../src/packets/play/team_s2c.rs | 233 + .../src/packets/play/teleport_confirm_c2s.rs | 6 + .../src/packets/play/title_fade_s2c.rs | 8 + .../src/packets/play/title_s2c.rs | 10 + .../src/packets/play/unload_chunk_s2c.rs | 6 + .../src/packets/play/unlock_recipes_s2c.rs | 70 + .../src/packets/play/update_beacon_c2s.rs | 7 + .../packets/play/update_command_block_c2s.rs | 29 + .../play/update_command_block_minecart_c2s.rs | 10 + .../src/packets/play/update_difficulty_c2s.rs | 6 + .../play/update_difficulty_lock_c2s.rs | 6 + .../src/packets/play/update_jigsaw_c2s.rs | 14 + .../play/update_player_abilities_c2s.rs | 9 + .../packets/play/update_selected_slot_c2s.rs | 6 + .../packets/play/update_selected_slot_s2c.rs | 6 + .../src/packets/play/update_sign_c2s.rs | 10 + .../play/update_structure_block_c2s.rs | 61 + .../src/packets/play/vehicle_move_c2s.rs | 10 + .../src/packets/play/vehicle_move_s2c.rs | 10 + .../play/world_border_center_changed_s2c.rs | 7 + .../play/world_border_initialize_s2c.rs | 13 + .../play/world_border_interpolate_size_s2c.rs | 8 + .../play/world_border_size_changed_s2c.rs | 6 + ...world_border_warning_blocks_changed_s2c.rs | 6 + .../world_border_warning_time_changed_s2c.rs | 6 + .../src/packets/play/world_event_s2c.rs | 9 + .../src/packets/play/world_time_update_s2c.rs | 11 + .../valence_protocol/src/packets/status.rs | 2 + .../src/packets/status/query_ping_c2s.rs | 7 + .../src/packets/status/query_pong_s2c.rs | 7 + .../src/packets/status/query_request_c2s.rs | 5 + .../src/packets/status/query_response_s2c.rs | 9 + .../crates/valence_protocol/src/profile.rs | 59 + .../crates/valence_protocol/src/raw.rs | 60 + .../crates/valence_protocol/src/sound.rs | 58 + .../crates/valence_protocol/src/var_int.rs | 155 + .../crates/valence_protocol/src/var_long.rs | 156 + .../crates/valence_protocol/src/velocity.rs | 54 + .../crates/valence_protocol_macros/Cargo.toml | 18 + .../crates/valence_protocol_macros/README.md | 3 + .../valence_protocol_macros/src/decode.rs | 337 + .../valence_protocol_macros/src/encode.rs | 165 + .../crates/valence_protocol_macros/src/lib.rs | 113 + .../valence_protocol_macros/src/packet.rs | 128 + .../crates/valence_registry/Cargo.toml | 22 + .../valence/crates/valence_registry/README.md | 3 + .../extracted/registry_codec.dat | Bin 0 -> 39164 bytes .../valence_registry/extracted/tags.json | 6684 + .../crates/valence_registry/src/biome.rs | 154 + .../crates/valence_registry/src/codec.rs | 137 + .../valence_registry/src/dimension_type.rs | 196 + .../crates/valence_registry/src/lib.rs | 189 + .../crates/valence_registry/src/tags.rs | 72 + .../crates/valence_scoreboard/Cargo.toml | 16 + .../crates/valence_scoreboard/README.md | 23 + .../valence_scoreboard/src/components.rs | 121 + .../crates/valence_scoreboard/src/lib.rs | 292 + .../valence/crates/valence_server/Cargo.toml | 33 + .../valence/crates/valence_server/README.md | 5 + .../crates/valence_server/src/abilities.rs | 175 + .../crates/valence_server/src/action.rs | 106 + .../crates/valence_server/src/brand.rs | 29 + .../crates/valence_server/src/chunk_view.rs | 102 + .../crates/valence_server/src/client.rs | 1208 + .../valence_server/src/client_command.rs | 147 + .../valence_server/src/client_settings.rs | 55 + .../valence_server/src/custom_payload.rs | 47 + .../crates/valence_server/src/event_loop.rs | 181 + .../crates/valence_server/src/hand_swing.rs | 44 + .../valence_server/src/interact_block.rs | 60 + .../valence_server/src/interact_entity.rs | 50 + .../valence_server/src/interact_item.rs | 43 + .../crates/valence_server/src/keepalive.rs | 118 + .../crates/valence_server/src/layer.rs | 138 + .../crates/valence_server/src/layer/bvh.rs | 339 + .../crates/valence_server/src/layer/chunk.rs | 793 + .../valence_server/src/layer/chunk/chunk.rs | 423 + .../valence_server/src/layer/chunk/loaded.rs | 776 + .../src/layer/chunk/paletted_container.rs | 339 + .../src/layer/chunk/unloaded.rs | 184 + .../crates/valence_server/src/layer/entity.rs | 524 + .../valence_server/src/layer/message.rs | 309 + .../valence/crates/valence_server/src/lib.rs | 58 + .../crates/valence_server/src/message.rs | 63 + .../crates/valence_server/src/movement.rs | 209 + .../crates/valence_server/src/op_level.rs | 38 + .../valence_server/src/resource_pack.rs | 64 + .../crates/valence_server/src/spawn.rs | 207 + .../crates/valence_server/src/status.rs | 44 + .../valence_server/src/status_effect.rs | 194 + .../crates/valence_server/src/teleport.rs | 139 + .../crates/valence_server/src/title.rs | 64 + .../crates/valence_server_common/Cargo.toml | 17 + .../crates/valence_server_common/README.md | 3 + .../valence_server_common/src/despawn.rs | 26 + .../crates/valence_server_common/src/lib.rs | 134 + .../crates/valence_server_common/src/uuid.rs | 18 + .../valence/crates/valence_spatial/Cargo.toml | 13 + .../valence/crates/valence_spatial/README.md | 3 + .../valence/crates/valence_spatial/src/bvh.rs | 429 + .../valence/crates/valence_spatial/src/lib.rs | 193 + vendor/valence/crates/valence_text/Cargo.toml | 17 + vendor/valence/crates/valence_text/README.md | 3 + .../valence/crates/valence_text/src/color.rs | 368 + .../crates/valence_text/src/into_text.rs | 377 + vendor/valence/crates/valence_text/src/lib.rs | 649 + .../valence/crates/valence_text/src/tests.rs | 136 + .../valence/crates/valence_weather/Cargo.toml | 15 + .../valence/crates/valence_weather/README.md | 3 + .../valence/crates/valence_weather/src/lib.rs | 133 + .../crates/valence_weather/src/packet.rs | 0 .../crates/valence_world_border/Cargo.toml | 15 + .../crates/valence_world_border/README.md | 29 + .../crates/valence_world_border/src/lib.rs | 257 + vendor/valence/examples/advancement.rs | 314 + vendor/valence/examples/anvil_loading.rs | 158 + vendor/valence/examples/bench_players.rs | 102 + vendor/valence/examples/biomes.rs | 119 + vendor/valence/examples/block_entities.rs | 164 + vendor/valence/examples/boss_bar.rs | 223 + vendor/valence/examples/building.rs | 173 + vendor/valence/examples/chest.rs | 121 + vendor/valence/examples/combat.rs | 181 + vendor/valence/examples/command.rs | 676 + vendor/valence/examples/cow_sphere.rs | 170 + vendor/valence/examples/ctf.rs | 1050 + vendor/valence/examples/custom_npc.rs | 109 + vendor/valence/examples/death.rs | 132 + vendor/valence/examples/entity_hitbox.rs | 171 + vendor/valence/examples/game_of_life.rs | 240 + vendor/valence/examples/parkour.rs | 255 + vendor/valence/examples/particles.rs | 223 + vendor/valence/examples/player_list.rs | 140 + vendor/valence/examples/potions.rs | 334 + vendor/valence/examples/resource_pack.rs | 132 + vendor/valence/examples/server_list_ping.rs | 63 + vendor/valence/examples/terrain.rs | 366 + vendor/valence/examples/text.rs | 150 + vendor/valence/examples/weather.rs | 126 + vendor/valence/examples/world_border.rs | 145 + vendor/valence/extractor/README.md | 47 + vendor/valence/extractor/build.gradle | 42 + .../extractor/copy_extractor_output.sh | 14 + vendor/valence/extractor/gradle.properties | 13 + .../gradle/wrapper/gradle-wrapper.properties | 5 + vendor/valence/extractor/gradlew | 240 + vendor/valence/extractor/gradlew.bat | 91 + vendor/valence/extractor/settings.gradle | 10 + .../rs/valence/extractor/ClassComparator.java | 21 + .../valence/extractor/DummyPlayerEntity.java | 42 + .../java/rs/valence/extractor/DummyWorld.java | 266 + .../main/java/rs/valence/extractor/Main.java | 126 + .../extractor/RegistryKeyComparator.java | 21 + .../rs/valence/extractor/ValenceUtils.java | 34 + .../extractor/extractors/Attributes.java | 45 + .../valence/extractor/extractors/Biomes.java | 129 + .../valence/extractor/extractors/Blocks.java | 140 + .../valence/extractor/extractors/Codec.java | 34 + .../valence/extractor/extractors/Effects.java | 55 + .../extractor/extractors/Enchants.java | 47 + .../extractor/extractors/Entities.java | 309 + .../valence/extractor/extractors/Items.java | 73 + .../rs/valence/extractor/extractors/Misc.java | 135 + .../valence/extractor/extractors/Packets.java | 42 + .../valence/extractor/extractors/Sounds.java | 31 + .../rs/valence/extractor/extractors/Tags.java | 76 + .../extractor/extractors/TranslationKeys.java | 56 + .../extractor/mixin/ExposeWallBlock.java | 12 + .../src/main/resources/extractor.mixins.json | 9 + .../src/main/resources/fabric.mod.json | 31 + vendor/valence/rustfmt.toml | 11 + vendor/valence/src/lib.rs | 258 + vendor/valence/src/testing.rs | 335 + vendor/valence/src/tests.rs | 11 + vendor/valence/src/tests/boss_bar.rs | 196 + vendor/valence/src/tests/client.rs | 103 + vendor/valence/src/tests/example.rs | 95 + vendor/valence/src/tests/hunger.rs | 38 + vendor/valence/src/tests/inventory.rs | 1155 + vendor/valence/src/tests/layer.rs | 467 + vendor/valence/src/tests/player_list.rs | 66 + vendor/valence/src/tests/potions.rs | 71 + vendor/valence/src/tests/scoreboard.rs | 192 + vendor/valence/src/tests/weather.rs | 164 + vendor/valence/src/tests/world_border.rs | 200 + vendor/valence/tools/dump_schedule/Cargo.toml | 13 + vendor/valence/tools/dump_schedule/README.md | 7 + .../valence/tools/dump_schedule/src/main.rs | 110 + .../valence/tools/packet_inspector/Cargo.toml | 41 + .../valence/tools/packet_inspector/README.md | 66 + .../valence/tools/packet_inspector/build.rs | 213 + .../packet_inspector/extracted/packets.json | 1052 + .../valence/tools/packet_inspector/src/app.rs | 194 + .../packet_inspector/src/app/connection.rs | 43 + .../tools/packet_inspector/src/app/filter.rs | 152 + .../packet_inspector/src/app/hex_viewer.rs | 72 + .../packet_inspector/src/app/packet_list.rs | 270 + .../packet_inspector/src/app/text_viewer.rs | 327 + .../valence/tools/packet_inspector/src/lib.rs | 315 + .../tools/packet_inspector/src/main.rs | 46 + .../tools/packet_inspector/src/main_cli.rs | 86 + .../tools/packet_inspector/src/packet_io.rs | 200 + .../packet_inspector/src/packet_registry.rs | 120 + .../packet_inspector/src/shared_state.rs | 134 + .../packet_inspector/src/tri_checkbox.rs | 134 + vendor/valence/tools/playground/Cargo.toml | 17 + vendor/valence/tools/playground/README.md | 3 + vendor/valence/tools/playground/build.rs | 21 + .../valence/tools/playground/src/.gitignore | 1 + vendor/valence/tools/playground/src/extras.rs | 23 + vendor/valence/tools/playground/src/main.rs | 47 + .../playground/src/playground.template.rs | 77 + vendor/valence/tools/stresser/Cargo.toml | 17 + vendor/valence/tools/stresser/README.md | 13 + vendor/valence/tools/stresser/src/args.rs | 29 + vendor/valence/tools/stresser/src/main.rs | 62 + vendor/valence/tools/stresser/src/stresser.rs | 153 + vendor/valence/typos.toml | 5 + vendor/valence/website/.gitignore | 1 + vendor/valence/website/README.md | 44 + vendor/valence/website/book.toml | 8 + .../website/book/1-getting-started/setup.md | 118 + vendor/valence/website/book/SUMMARY.md | 7 + vendor/valence/website/book/introduction.md | 1 + vendor/valence/website/build.sh | 30 + vendor/valence/website/config.toml | 29 + vendor/valence/website/content/_index.md | 5 + vendor/valence/website/content/faq.md | 13 + vendor/valence/website/content/news.md | 6 + vendor/valence/website/sass/_markdown.scss | 45 + vendor/valence/website/sass/_text.scss | 40 + vendor/valence/website/sass/_ultility.scss | 13 + vendor/valence/website/sass/juice.scss | 217 + vendor/valence/website/static/favicon.ico | Bin 0 -> 176974 bytes vendor/valence/website/static/normalize.css | 349 + vendor/valence/website/static/prism.css | 187 + vendor/valence/website/static/prism.js | 256 + .../valence/website/static/syntax-theme.css | 232 + vendor/valence/website/templates/_macros.html | 25 + .../valence/website/templates/_variables.html | 19 + vendor/valence/website/templates/index.html | 176 + vendor/valence/website/templates/page.html | 15 + .../website/templates/shortcodes/issue.html | 1 + 594 files changed, 418152 insertions(+), 1 deletion(-) create mode 160000 vendor/bvh-data create mode 100644 vendor/valence/.devcontainer/devcontainer.json create mode 100644 vendor/valence/.github/FUNDING.yml create mode 100644 vendor/valence/.github/ISSUE_TEMPLATE/bug_report.md create mode 100644 vendor/valence/.github/ISSUE_TEMPLATE/config.yml create mode 100644 vendor/valence/.github/ISSUE_TEMPLATE/feature_request.md create mode 100644 vendor/valence/.github/dependabot.yml create mode 100644 vendor/valence/.github/pull_request_template.md create mode 100644 vendor/valence/.github/workflows/ci-pr-comments.yml create mode 100644 vendor/valence/.github/workflows/ci.yml create mode 100644 vendor/valence/.github/workflows/website.yml create mode 100644 vendor/valence/.gitignore create mode 100644 vendor/valence/CODE_OF_CONDUCT.md create mode 100644 vendor/valence/CONTRIBUTING.md create mode 100644 vendor/valence/Cargo.toml create mode 100644 vendor/valence/Cargo.toml.backup create mode 100644 vendor/valence/LICENSE.txt create mode 100644 vendor/valence/README.md create mode 100644 vendor/valence/assets/logo-256x256.png create mode 100644 vendor/valence/assets/logo-64x64.png create mode 100644 vendor/valence/assets/many-players.png create mode 100644 vendor/valence/assets/packet-inspector.png create mode 100644 vendor/valence/benches/anvil.rs create mode 100644 vendor/valence/benches/block.rs create mode 100644 vendor/valence/benches/decode_array.rs create mode 100644 vendor/valence/benches/idle.rs create mode 100644 vendor/valence/benches/main.rs create mode 100644 vendor/valence/benches/many_players.rs create mode 100644 vendor/valence/benches/packet.rs create mode 100644 vendor/valence/benches/var_int.rs create mode 100644 vendor/valence/benches/var_long.rs create mode 100644 vendor/valence/crates/README.md create mode 100644 vendor/valence/crates/java_string/Cargo.toml create mode 100644 vendor/valence/crates/java_string/README.md create mode 100644 vendor/valence/crates/java_string/src/cesu8.rs create mode 100644 vendor/valence/crates/java_string/src/char.rs create mode 100644 vendor/valence/crates/java_string/src/error.rs create mode 100644 vendor/valence/crates/java_string/src/iter.rs create mode 100644 vendor/valence/crates/java_string/src/lib.rs create mode 100644 vendor/valence/crates/java_string/src/owned.rs create mode 100644 vendor/valence/crates/java_string/src/pattern.rs create mode 100644 vendor/valence/crates/java_string/src/serde.rs create mode 100644 vendor/valence/crates/java_string/src/slice.rs create mode 100644 vendor/valence/crates/java_string/src/validations.rs create mode 100644 vendor/valence/crates/valence_advancement/Cargo.toml create mode 100644 vendor/valence/crates/valence_advancement/README.md create mode 100644 vendor/valence/crates/valence_advancement/src/event.rs create mode 100644 vendor/valence/crates/valence_advancement/src/lib.rs create mode 100644 vendor/valence/crates/valence_anvil/Cargo.toml create mode 100644 vendor/valence/crates/valence_anvil/README.md create mode 100644 vendor/valence/crates/valence_anvil/src/bevy.rs create mode 100644 vendor/valence/crates/valence_anvil/src/lib.rs create mode 100644 vendor/valence/crates/valence_anvil/src/parsing.rs create mode 100644 vendor/valence/crates/valence_boss_bar/Cargo.toml create mode 100644 vendor/valence/crates/valence_boss_bar/README.md create mode 100644 vendor/valence/crates/valence_boss_bar/src/components.rs create mode 100644 vendor/valence/crates/valence_boss_bar/src/lib.rs create mode 100644 vendor/valence/crates/valence_build_utils/Cargo.toml create mode 100644 vendor/valence/crates/valence_build_utils/README.md create mode 100644 vendor/valence/crates/valence_build_utils/src/lib.rs create mode 100644 vendor/valence/crates/valence_bytes/Cargo.toml create mode 100644 vendor/valence/crates/valence_bytes/README.md create mode 100644 vendor/valence/crates/valence_bytes/src/cow_bytes.rs create mode 100644 vendor/valence/crates/valence_bytes/src/cow_fixed_bytes.rs create mode 100644 vendor/valence/crates/valence_bytes/src/cow_utf8_bytes.rs create mode 100644 vendor/valence/crates/valence_bytes/src/fixed_bytes.rs create mode 100644 vendor/valence/crates/valence_bytes/src/lib.rs create mode 100644 vendor/valence/crates/valence_bytes/src/utf8.rs create mode 100644 vendor/valence/crates/valence_command/Cargo.toml create mode 100644 vendor/valence/crates/valence_command/README.md create mode 100644 vendor/valence/crates/valence_command/src/graph.rs create mode 100644 vendor/valence/crates/valence_command/src/handler.rs create mode 100644 vendor/valence/crates/valence_command/src/lib.rs create mode 100644 vendor/valence/crates/valence_command/src/manager.rs create mode 100644 vendor/valence/crates/valence_command/src/modifier_value.rs create mode 100644 vendor/valence/crates/valence_command/src/parsers.rs create mode 100644 vendor/valence/crates/valence_command/src/parsers/angle.rs create mode 100644 vendor/valence/crates/valence_command/src/parsers/block_pos.rs create mode 100644 vendor/valence/crates/valence_command/src/parsers/bool.rs create mode 100644 vendor/valence/crates/valence_command/src/parsers/color.rs create mode 100644 vendor/valence/crates/valence_command/src/parsers/column_pos.rs create mode 100644 vendor/valence/crates/valence_command/src/parsers/entity_anchor.rs create mode 100644 vendor/valence/crates/valence_command/src/parsers/entity_selector.rs create mode 100644 vendor/valence/crates/valence_command/src/parsers/gamemode.rs create mode 100644 vendor/valence/crates/valence_command/src/parsers/inventory_slot.rs create mode 100644 vendor/valence/crates/valence_command/src/parsers/numbers.rs create mode 100644 vendor/valence/crates/valence_command/src/parsers/rotation.rs create mode 100644 vendor/valence/crates/valence_command/src/parsers/score_holder.rs create mode 100644 vendor/valence/crates/valence_command/src/parsers/strings.rs create mode 100644 vendor/valence/crates/valence_command/src/parsers/swizzle.rs create mode 100644 vendor/valence/crates/valence_command/src/parsers/time.rs create mode 100644 vendor/valence/crates/valence_command/src/parsers/vec2.rs create mode 100644 vendor/valence/crates/valence_command/src/parsers/vec3.rs create mode 100644 vendor/valence/crates/valence_command/src/scopes.rs create mode 100644 vendor/valence/crates/valence_command_macros/Cargo.toml create mode 100644 vendor/valence/crates/valence_command_macros/README.md create mode 100644 vendor/valence/crates/valence_command_macros/src/lib.rs create mode 100644 vendor/valence/crates/valence_entity/Cargo.toml create mode 100644 vendor/valence/crates/valence_entity/README.md create mode 100644 vendor/valence/crates/valence_entity/build.rs create mode 100644 vendor/valence/crates/valence_entity/extracted/entities.json create mode 100644 vendor/valence/crates/valence_entity/extracted/misc.json create mode 100644 vendor/valence/crates/valence_entity/src/active_status_effects.rs create mode 100644 vendor/valence/crates/valence_entity/src/attributes.rs create mode 100644 vendor/valence/crates/valence_entity/src/flags.rs create mode 100644 vendor/valence/crates/valence_entity/src/hitbox.rs create mode 100644 vendor/valence/crates/valence_entity/src/lib.rs create mode 100644 vendor/valence/crates/valence_entity/src/manager.rs create mode 100644 vendor/valence/crates/valence_entity/src/query.rs create mode 100644 vendor/valence/crates/valence_entity/src/tracked_data.rs create mode 100644 vendor/valence/crates/valence_generated/Cargo.toml create mode 100644 vendor/valence/crates/valence_generated/README.md create mode 100644 vendor/valence/crates/valence_generated/build/attributes.rs create mode 100644 vendor/valence/crates/valence_generated/build/block.rs create mode 100644 vendor/valence/crates/valence_generated/build/chunk_view.rs create mode 100644 vendor/valence/crates/valence_generated/build/item.rs create mode 100644 vendor/valence/crates/valence_generated/build/main.rs create mode 100644 vendor/valence/crates/valence_generated/build/packet_id.rs create mode 100644 vendor/valence/crates/valence_generated/build/sound.rs create mode 100644 vendor/valence/crates/valence_generated/build/status_effects.rs create mode 100644 vendor/valence/crates/valence_generated/extracted/attributes.json create mode 100644 vendor/valence/crates/valence_generated/extracted/blocks.json create mode 100644 vendor/valence/crates/valence_generated/extracted/effects.json create mode 100644 vendor/valence/crates/valence_generated/extracted/items.json create mode 100644 vendor/valence/crates/valence_generated/extracted/packets.json create mode 100644 vendor/valence/crates/valence_generated/extracted/sounds.json create mode 100644 vendor/valence/crates/valence_generated/src/block.rs create mode 100644 vendor/valence/crates/valence_generated/src/lib.rs create mode 100644 vendor/valence/crates/valence_ident/Cargo.toml create mode 100644 vendor/valence/crates/valence_ident/README.md create mode 100644 vendor/valence/crates/valence_ident/src/lib.rs create mode 100644 vendor/valence/crates/valence_ident_macros/Cargo.toml create mode 100644 vendor/valence/crates/valence_ident_macros/README.md create mode 100644 vendor/valence/crates/valence_ident_macros/src/lib.rs create mode 100644 vendor/valence/crates/valence_inventory/Cargo.toml create mode 100644 vendor/valence/crates/valence_inventory/README.md create mode 100644 vendor/valence/crates/valence_inventory/src/lib.rs create mode 100644 vendor/valence/crates/valence_inventory/src/player_inventory.rs create mode 100644 vendor/valence/crates/valence_inventory/src/validate.rs create mode 100644 vendor/valence/crates/valence_lang/Cargo.toml create mode 100644 vendor/valence/crates/valence_lang/README.md create mode 100644 vendor/valence/crates/valence_lang/build.rs create mode 100644 vendor/valence/crates/valence_lang/extracted/translation_keys.json create mode 100644 vendor/valence/crates/valence_lang/src/lib.rs create mode 100644 vendor/valence/crates/valence_math/Cargo.toml create mode 100644 vendor/valence/crates/valence_math/README.md create mode 100644 vendor/valence/crates/valence_math/src/aabb.rs create mode 100644 vendor/valence/crates/valence_math/src/lib.rs create mode 100644 vendor/valence/crates/valence_nbt/Cargo.toml create mode 100644 vendor/valence/crates/valence_nbt/README.md create mode 100644 vendor/valence/crates/valence_nbt/src/binary.rs create mode 100644 vendor/valence/crates/valence_nbt/src/binary/decode.rs create mode 100644 vendor/valence/crates/valence_nbt/src/binary/encode.rs create mode 100644 vendor/valence/crates/valence_nbt/src/binary/error.rs create mode 100644 vendor/valence/crates/valence_nbt/src/binary/modified_utf8.rs create mode 100644 vendor/valence/crates/valence_nbt/src/binary/tests.rs create mode 100644 vendor/valence/crates/valence_nbt/src/compound.rs create mode 100644 vendor/valence/crates/valence_nbt/src/conv.rs create mode 100644 vendor/valence/crates/valence_nbt/src/lib.rs create mode 100644 vendor/valence/crates/valence_nbt/src/list.rs create mode 100644 vendor/valence/crates/valence_nbt/src/serde.rs create mode 100644 vendor/valence/crates/valence_nbt/src/serde/de.rs create mode 100644 vendor/valence/crates/valence_nbt/src/serde/ser.rs create mode 100644 vendor/valence/crates/valence_nbt/src/serde/tests.rs create mode 100644 vendor/valence/crates/valence_nbt/src/snbt.rs create mode 100644 vendor/valence/crates/valence_nbt/src/tag.rs create mode 100644 vendor/valence/crates/valence_nbt/src/value.rs create mode 100644 vendor/valence/crates/valence_network/Cargo.toml create mode 100644 vendor/valence/crates/valence_network/README.md create mode 100644 vendor/valence/crates/valence_network/src/byte_channel.rs create mode 100644 vendor/valence/crates/valence_network/src/connect.rs create mode 100644 vendor/valence/crates/valence_network/src/legacy_ping.rs create mode 100644 vendor/valence/crates/valence_network/src/lib.rs create mode 100644 vendor/valence/crates/valence_network/src/packet_io.rs create mode 100644 vendor/valence/crates/valence_player_list/Cargo.toml create mode 100644 vendor/valence/crates/valence_player_list/README.md create mode 100644 vendor/valence/crates/valence_player_list/src/lib.rs create mode 100644 vendor/valence/crates/valence_protocol/Cargo.toml create mode 100644 vendor/valence/crates/valence_protocol/README.md create mode 100644 vendor/valence/crates/valence_protocol/src/array.rs create mode 100644 vendor/valence/crates/valence_protocol/src/biome_pos.rs create mode 100644 vendor/valence/crates/valence_protocol/src/bit_set.rs create mode 100644 vendor/valence/crates/valence_protocol/src/block_pos.rs create mode 100644 vendor/valence/crates/valence_protocol/src/bounded.rs create mode 100644 vendor/valence/crates/valence_protocol/src/byte_angle.rs create mode 100644 vendor/valence/crates/valence_protocol/src/chunk_pos.rs create mode 100644 vendor/valence/crates/valence_protocol/src/chunk_section_pos.rs create mode 100644 vendor/valence/crates/valence_protocol/src/decode.rs create mode 100644 vendor/valence/crates/valence_protocol/src/difficulty.rs create mode 100644 vendor/valence/crates/valence_protocol/src/direction.rs create mode 100644 vendor/valence/crates/valence_protocol/src/encode.rs create mode 100644 vendor/valence/crates/valence_protocol/src/game_mode.rs create mode 100644 vendor/valence/crates/valence_protocol/src/global_pos.rs create mode 100644 vendor/valence/crates/valence_protocol/src/hand.rs create mode 100644 vendor/valence/crates/valence_protocol/src/impls.rs create mode 100644 vendor/valence/crates/valence_protocol/src/impls/map.rs create mode 100644 vendor/valence/crates/valence_protocol/src/impls/math.rs create mode 100644 vendor/valence/crates/valence_protocol/src/impls/other.rs create mode 100644 vendor/valence/crates/valence_protocol/src/impls/pointer.rs create mode 100644 vendor/valence/crates/valence_protocol/src/impls/primitive.rs create mode 100644 vendor/valence/crates/valence_protocol/src/impls/sequence.rs create mode 100644 vendor/valence/crates/valence_protocol/src/impls/string.rs create mode 100644 vendor/valence/crates/valence_protocol/src/impls/tuple.rs create mode 100644 vendor/valence/crates/valence_protocol/src/item.rs create mode 100644 vendor/valence/crates/valence_protocol/src/lib.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/handshaking/handshake_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/login/login_compression_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/login/login_disconnect_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/login/login_hello_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/login/login_hello_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/login/login_key_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/login/login_query_request_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/login/login_query_response_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/login/login_success_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/advancement_tab_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/advancement_update_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/block_breaking_progress_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/block_entity_update_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/block_event_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/block_update_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/boat_paddle_state_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/book_update_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/boss_bar_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/bundle_splitter_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/button_click_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/chat_message_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/chat_message_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/chat_suggestions_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/chunk_biome_data_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/chunk_data_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/chunk_delta_update_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/chunk_load_distance_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/chunk_render_distance_center_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/clear_title_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/click_slot_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/client_command_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/client_settings_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/client_status_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/close_handled_screen_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/close_screen_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/command_execution_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/command_suggestions_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/command_tree_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/cooldown_update_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/craft_failed_response_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/craft_request_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/creative_inventory_action_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/custom_payload_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/custom_payload_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/damage_tilt_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/death_message_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/difficulty_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/disconnect_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/end_combat_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/enter_combat_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/entities_destroy_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/entity_animation_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/entity_attach_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/entity_attributes_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/entity_damage_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/entity_equipment_update_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/entity_passengers_set_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/entity_position_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/entity_set_head_yaw_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/entity_spawn_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/entity_status_effect_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/entity_status_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/entity_tracker_update_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/entity_velocity_update_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/experience_bar_update_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/experience_orb_spawn_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/explosion_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/features_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/full_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/game_join_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/game_message_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/game_state_change_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/hand_swing_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/health_update_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/inventory_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/item_pickup_animation_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/jigsaw_generating_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/keep_alive_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/keep_alive_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/light_update_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/look_and_on_ground_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/look_at_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/map_update_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/message_acknowledgment_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/move_relative_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/nbt_query_response_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/on_ground_only_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/open_horse_screen_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/open_screen_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/open_written_book_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/overlay_message_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/particle_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/pick_from_inventory_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/play_ping_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/play_pong_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/play_sound_from_entity_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/play_sound_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/player_abilities_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/player_action_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/player_action_response_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/player_input_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/player_interact_block_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/player_interact_entity_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/player_interact_item_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/player_list_header_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/player_list_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/player_position_look_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/player_remove_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/player_respawn_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/player_session_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/player_spawn_position_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/player_spawn_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/position_and_on_ground_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/profileless_chat_message_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/query_block_nbt_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/query_entity_nbt_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/recipe_book_data_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/recipe_category_options_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/remove_entity_status_effect_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/remove_message_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/rename_item_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/request_command_completions_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/resource_pack_send_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/resource_pack_status_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/rotate_and_move_relative_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/rotate_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/scoreboard_display_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/scoreboard_objective_update_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/scoreboard_player_update_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/screen_handler_property_update_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/screen_handler_slot_update_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/select_advancement_tab_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/select_merchant_trade_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/server_metadata_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/set_camera_entity_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/set_trade_offers_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/sign_editor_open_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/simulation_distance_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/spectator_teleport_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/statistics_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/stop_sound_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/subtitle_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/synchronize_recipes_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/synchronize_tags_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/team_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/teleport_confirm_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/title_fade_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/title_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/unload_chunk_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/unlock_recipes_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/update_beacon_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/update_command_block_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/update_command_block_minecart_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/update_difficulty_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/update_difficulty_lock_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/update_jigsaw_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/update_player_abilities_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/update_selected_slot_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/update_selected_slot_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/update_sign_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/update_structure_block_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/vehicle_move_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/vehicle_move_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/world_border_center_changed_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/world_border_initialize_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/world_border_interpolate_size_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/world_border_size_changed_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/world_border_warning_blocks_changed_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/world_border_warning_time_changed_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/world_event_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/play/world_time_update_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/status.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/status/query_ping_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/status/query_pong_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/status/query_request_c2s.rs create mode 100644 vendor/valence/crates/valence_protocol/src/packets/status/query_response_s2c.rs create mode 100644 vendor/valence/crates/valence_protocol/src/profile.rs create mode 100644 vendor/valence/crates/valence_protocol/src/raw.rs create mode 100644 vendor/valence/crates/valence_protocol/src/sound.rs create mode 100644 vendor/valence/crates/valence_protocol/src/var_int.rs create mode 100644 vendor/valence/crates/valence_protocol/src/var_long.rs create mode 100644 vendor/valence/crates/valence_protocol/src/velocity.rs create mode 100644 vendor/valence/crates/valence_protocol_macros/Cargo.toml create mode 100644 vendor/valence/crates/valence_protocol_macros/README.md create mode 100644 vendor/valence/crates/valence_protocol_macros/src/decode.rs create mode 100644 vendor/valence/crates/valence_protocol_macros/src/encode.rs create mode 100644 vendor/valence/crates/valence_protocol_macros/src/lib.rs create mode 100644 vendor/valence/crates/valence_protocol_macros/src/packet.rs create mode 100644 vendor/valence/crates/valence_registry/Cargo.toml create mode 100644 vendor/valence/crates/valence_registry/README.md create mode 100644 vendor/valence/crates/valence_registry/extracted/registry_codec.dat create mode 100644 vendor/valence/crates/valence_registry/extracted/tags.json create mode 100644 vendor/valence/crates/valence_registry/src/biome.rs create mode 100644 vendor/valence/crates/valence_registry/src/codec.rs create mode 100644 vendor/valence/crates/valence_registry/src/dimension_type.rs create mode 100644 vendor/valence/crates/valence_registry/src/lib.rs create mode 100644 vendor/valence/crates/valence_registry/src/tags.rs create mode 100644 vendor/valence/crates/valence_scoreboard/Cargo.toml create mode 100644 vendor/valence/crates/valence_scoreboard/README.md create mode 100644 vendor/valence/crates/valence_scoreboard/src/components.rs create mode 100644 vendor/valence/crates/valence_scoreboard/src/lib.rs create mode 100644 vendor/valence/crates/valence_server/Cargo.toml create mode 100644 vendor/valence/crates/valence_server/README.md create mode 100644 vendor/valence/crates/valence_server/src/abilities.rs create mode 100644 vendor/valence/crates/valence_server/src/action.rs create mode 100644 vendor/valence/crates/valence_server/src/brand.rs create mode 100644 vendor/valence/crates/valence_server/src/chunk_view.rs create mode 100644 vendor/valence/crates/valence_server/src/client.rs create mode 100644 vendor/valence/crates/valence_server/src/client_command.rs create mode 100644 vendor/valence/crates/valence_server/src/client_settings.rs create mode 100644 vendor/valence/crates/valence_server/src/custom_payload.rs create mode 100644 vendor/valence/crates/valence_server/src/event_loop.rs create mode 100644 vendor/valence/crates/valence_server/src/hand_swing.rs create mode 100644 vendor/valence/crates/valence_server/src/interact_block.rs create mode 100644 vendor/valence/crates/valence_server/src/interact_entity.rs create mode 100644 vendor/valence/crates/valence_server/src/interact_item.rs create mode 100644 vendor/valence/crates/valence_server/src/keepalive.rs create mode 100644 vendor/valence/crates/valence_server/src/layer.rs create mode 100644 vendor/valence/crates/valence_server/src/layer/bvh.rs create mode 100644 vendor/valence/crates/valence_server/src/layer/chunk.rs create mode 100644 vendor/valence/crates/valence_server/src/layer/chunk/chunk.rs create mode 100644 vendor/valence/crates/valence_server/src/layer/chunk/loaded.rs create mode 100644 vendor/valence/crates/valence_server/src/layer/chunk/paletted_container.rs create mode 100644 vendor/valence/crates/valence_server/src/layer/chunk/unloaded.rs create mode 100644 vendor/valence/crates/valence_server/src/layer/entity.rs create mode 100644 vendor/valence/crates/valence_server/src/layer/message.rs create mode 100644 vendor/valence/crates/valence_server/src/lib.rs create mode 100644 vendor/valence/crates/valence_server/src/message.rs create mode 100644 vendor/valence/crates/valence_server/src/movement.rs create mode 100644 vendor/valence/crates/valence_server/src/op_level.rs create mode 100644 vendor/valence/crates/valence_server/src/resource_pack.rs create mode 100644 vendor/valence/crates/valence_server/src/spawn.rs create mode 100644 vendor/valence/crates/valence_server/src/status.rs create mode 100644 vendor/valence/crates/valence_server/src/status_effect.rs create mode 100644 vendor/valence/crates/valence_server/src/teleport.rs create mode 100644 vendor/valence/crates/valence_server/src/title.rs create mode 100644 vendor/valence/crates/valence_server_common/Cargo.toml create mode 100644 vendor/valence/crates/valence_server_common/README.md create mode 100644 vendor/valence/crates/valence_server_common/src/despawn.rs create mode 100644 vendor/valence/crates/valence_server_common/src/lib.rs create mode 100644 vendor/valence/crates/valence_server_common/src/uuid.rs create mode 100644 vendor/valence/crates/valence_spatial/Cargo.toml create mode 100644 vendor/valence/crates/valence_spatial/README.md create mode 100644 vendor/valence/crates/valence_spatial/src/bvh.rs create mode 100644 vendor/valence/crates/valence_spatial/src/lib.rs create mode 100644 vendor/valence/crates/valence_text/Cargo.toml create mode 100644 vendor/valence/crates/valence_text/README.md create mode 100644 vendor/valence/crates/valence_text/src/color.rs create mode 100644 vendor/valence/crates/valence_text/src/into_text.rs create mode 100644 vendor/valence/crates/valence_text/src/lib.rs create mode 100644 vendor/valence/crates/valence_text/src/tests.rs create mode 100644 vendor/valence/crates/valence_weather/Cargo.toml create mode 100644 vendor/valence/crates/valence_weather/README.md create mode 100644 vendor/valence/crates/valence_weather/src/lib.rs create mode 100644 vendor/valence/crates/valence_weather/src/packet.rs create mode 100644 vendor/valence/crates/valence_world_border/Cargo.toml create mode 100644 vendor/valence/crates/valence_world_border/README.md create mode 100644 vendor/valence/crates/valence_world_border/src/lib.rs create mode 100644 vendor/valence/examples/advancement.rs create mode 100644 vendor/valence/examples/anvil_loading.rs create mode 100644 vendor/valence/examples/bench_players.rs create mode 100644 vendor/valence/examples/biomes.rs create mode 100644 vendor/valence/examples/block_entities.rs create mode 100644 vendor/valence/examples/boss_bar.rs create mode 100644 vendor/valence/examples/building.rs create mode 100644 vendor/valence/examples/chest.rs create mode 100644 vendor/valence/examples/combat.rs create mode 100644 vendor/valence/examples/command.rs create mode 100644 vendor/valence/examples/cow_sphere.rs create mode 100644 vendor/valence/examples/ctf.rs create mode 100644 vendor/valence/examples/custom_npc.rs create mode 100644 vendor/valence/examples/death.rs create mode 100644 vendor/valence/examples/entity_hitbox.rs create mode 100644 vendor/valence/examples/game_of_life.rs create mode 100644 vendor/valence/examples/parkour.rs create mode 100644 vendor/valence/examples/particles.rs create mode 100644 vendor/valence/examples/player_list.rs create mode 100644 vendor/valence/examples/potions.rs create mode 100644 vendor/valence/examples/resource_pack.rs create mode 100644 vendor/valence/examples/server_list_ping.rs create mode 100644 vendor/valence/examples/terrain.rs create mode 100644 vendor/valence/examples/text.rs create mode 100644 vendor/valence/examples/weather.rs create mode 100644 vendor/valence/examples/world_border.rs create mode 100644 vendor/valence/extractor/README.md create mode 100644 vendor/valence/extractor/build.gradle create mode 100755 vendor/valence/extractor/copy_extractor_output.sh create mode 100644 vendor/valence/extractor/gradle.properties create mode 100644 vendor/valence/extractor/gradle/wrapper/gradle-wrapper.properties create mode 100755 vendor/valence/extractor/gradlew create mode 100644 vendor/valence/extractor/gradlew.bat create mode 100644 vendor/valence/extractor/settings.gradle create mode 100644 vendor/valence/extractor/src/main/java/rs/valence/extractor/ClassComparator.java create mode 100644 vendor/valence/extractor/src/main/java/rs/valence/extractor/DummyPlayerEntity.java create mode 100644 vendor/valence/extractor/src/main/java/rs/valence/extractor/DummyWorld.java create mode 100644 vendor/valence/extractor/src/main/java/rs/valence/extractor/Main.java create mode 100644 vendor/valence/extractor/src/main/java/rs/valence/extractor/RegistryKeyComparator.java create mode 100644 vendor/valence/extractor/src/main/java/rs/valence/extractor/ValenceUtils.java create mode 100644 vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Attributes.java create mode 100644 vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Biomes.java create mode 100644 vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Blocks.java create mode 100644 vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Codec.java create mode 100644 vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Effects.java create mode 100644 vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Enchants.java create mode 100644 vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Entities.java create mode 100644 vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Items.java create mode 100644 vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Misc.java create mode 100644 vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Packets.java create mode 100644 vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Sounds.java create mode 100644 vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Tags.java create mode 100644 vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/TranslationKeys.java create mode 100644 vendor/valence/extractor/src/main/java/rs/valence/extractor/mixin/ExposeWallBlock.java create mode 100644 vendor/valence/extractor/src/main/resources/extractor.mixins.json create mode 100644 vendor/valence/extractor/src/main/resources/fabric.mod.json create mode 100644 vendor/valence/rustfmt.toml create mode 100644 vendor/valence/src/lib.rs create mode 100644 vendor/valence/src/testing.rs create mode 100644 vendor/valence/src/tests.rs create mode 100644 vendor/valence/src/tests/boss_bar.rs create mode 100644 vendor/valence/src/tests/client.rs create mode 100644 vendor/valence/src/tests/example.rs create mode 100644 vendor/valence/src/tests/hunger.rs create mode 100644 vendor/valence/src/tests/inventory.rs create mode 100644 vendor/valence/src/tests/layer.rs create mode 100644 vendor/valence/src/tests/player_list.rs create mode 100644 vendor/valence/src/tests/potions.rs create mode 100644 vendor/valence/src/tests/scoreboard.rs create mode 100644 vendor/valence/src/tests/weather.rs create mode 100644 vendor/valence/src/tests/world_border.rs create mode 100644 vendor/valence/tools/dump_schedule/Cargo.toml create mode 100644 vendor/valence/tools/dump_schedule/README.md create mode 100644 vendor/valence/tools/dump_schedule/src/main.rs create mode 100644 vendor/valence/tools/packet_inspector/Cargo.toml create mode 100644 vendor/valence/tools/packet_inspector/README.md create mode 100644 vendor/valence/tools/packet_inspector/build.rs create mode 100644 vendor/valence/tools/packet_inspector/extracted/packets.json create mode 100644 vendor/valence/tools/packet_inspector/src/app.rs create mode 100644 vendor/valence/tools/packet_inspector/src/app/connection.rs create mode 100644 vendor/valence/tools/packet_inspector/src/app/filter.rs create mode 100644 vendor/valence/tools/packet_inspector/src/app/hex_viewer.rs create mode 100644 vendor/valence/tools/packet_inspector/src/app/packet_list.rs create mode 100644 vendor/valence/tools/packet_inspector/src/app/text_viewer.rs create mode 100644 vendor/valence/tools/packet_inspector/src/lib.rs create mode 100644 vendor/valence/tools/packet_inspector/src/main.rs create mode 100644 vendor/valence/tools/packet_inspector/src/main_cli.rs create mode 100644 vendor/valence/tools/packet_inspector/src/packet_io.rs create mode 100644 vendor/valence/tools/packet_inspector/src/packet_registry.rs create mode 100644 vendor/valence/tools/packet_inspector/src/shared_state.rs create mode 100644 vendor/valence/tools/packet_inspector/src/tri_checkbox.rs create mode 100644 vendor/valence/tools/playground/Cargo.toml create mode 100644 vendor/valence/tools/playground/README.md create mode 100644 vendor/valence/tools/playground/build.rs create mode 100644 vendor/valence/tools/playground/src/.gitignore create mode 100644 vendor/valence/tools/playground/src/extras.rs create mode 100644 vendor/valence/tools/playground/src/main.rs create mode 100644 vendor/valence/tools/playground/src/playground.template.rs create mode 100644 vendor/valence/tools/stresser/Cargo.toml create mode 100644 vendor/valence/tools/stresser/README.md create mode 100644 vendor/valence/tools/stresser/src/args.rs create mode 100644 vendor/valence/tools/stresser/src/main.rs create mode 100644 vendor/valence/tools/stresser/src/stresser.rs create mode 100644 vendor/valence/typos.toml create mode 100644 vendor/valence/website/.gitignore create mode 100644 vendor/valence/website/README.md create mode 100644 vendor/valence/website/book.toml create mode 100644 vendor/valence/website/book/1-getting-started/setup.md create mode 100644 vendor/valence/website/book/SUMMARY.md create mode 100644 vendor/valence/website/book/introduction.md create mode 100755 vendor/valence/website/build.sh create mode 100644 vendor/valence/website/config.toml create mode 100644 vendor/valence/website/content/_index.md create mode 100644 vendor/valence/website/content/faq.md create mode 100644 vendor/valence/website/content/news.md create mode 100644 vendor/valence/website/sass/_markdown.scss create mode 100644 vendor/valence/website/sass/_text.scss create mode 100644 vendor/valence/website/sass/_ultility.scss create mode 100644 vendor/valence/website/sass/juice.scss create mode 100644 vendor/valence/website/static/favicon.ico create mode 100644 vendor/valence/website/static/normalize.css create mode 100644 vendor/valence/website/static/prism.css create mode 100644 vendor/valence/website/static/prism.js create mode 100644 vendor/valence/website/static/syntax-theme.css create mode 100644 vendor/valence/website/templates/_macros.html create mode 100644 vendor/valence/website/templates/_variables.html create mode 100644 vendor/valence/website/templates/index.html create mode 100644 vendor/valence/website/templates/page.html create mode 100644 vendor/valence/website/templates/shortcodes/issue.html diff --git a/.gitignore b/.gitignore index 04ded9f8..8bc5d79d 100644 --- a/.gitignore +++ b/.gitignore @@ -26,7 +26,7 @@ perf.data # Misc /extractor/build /extractor/out -vendor/ +# vendor/ /extractor/classes /extractor/run /extractor/bin diff --git a/vendor/bvh-data b/vendor/bvh-data new file mode 160000 index 00000000..9bffb03a --- /dev/null +++ b/vendor/bvh-data @@ -0,0 +1 @@ +Subproject commit 9bffb03a4b894a7884c9ec0da986bdde732ac704 diff --git a/vendor/valence/.devcontainer/devcontainer.json b/vendor/valence/.devcontainer/devcontainer.json new file mode 100644 index 00000000..aef18954 --- /dev/null +++ b/vendor/valence/.devcontainer/devcontainer.json @@ -0,0 +1,10 @@ +{ + "image": "mcr.microsoft.com/devcontainers/universal:2", + "features": { + "ghcr.io/devcontainers/features/rust:1": {}, + "ghcr.io/devcontainers/features/java:1": { + "version": "17", + "installGradle": true + } + } +} diff --git a/vendor/valence/.github/FUNDING.yml b/vendor/valence/.github/FUNDING.yml new file mode 100644 index 00000000..6e3c02fd --- /dev/null +++ b/vendor/valence/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: rj00a +patreon: rj00a \ No newline at end of file diff --git a/vendor/valence/.github/ISSUE_TEMPLATE/bug_report.md b/vendor/valence/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..71dd03be --- /dev/null +++ b/vendor/valence/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,40 @@ +--- +name: Bug Report +about: Is something not working correctly? +title: '' +labels: bug, triage +assignees: '' +--- + +## Valence Version + +The commit hash or release number of the version you're using. + +## What You Did + +Describe how you arrived at the problem. If you can, provide a minimal reproducible example in the details below. + +

+ +Playground + +```rust +PASTE YOUR PLAYGROUND CODE HERE +``` + +
+ +## What Went Wrong + +What were you expecting and what actually happened? + +## Additional Information + +Other information that can be used to further reproduce or isolate the problem. +This commonly includes: + +- theories about what might be going wrong +- links to related bugs, PRs or discussions +- workarounds that you used +- screenshots +- logs diff --git a/vendor/valence/.github/ISSUE_TEMPLATE/config.yml b/vendor/valence/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 00000000..6a45a5b1 --- /dev/null +++ b/vendor/valence/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,4 @@ +contact_links: + - name: Question/Troubleshooting + url: https://discord.gg/8Fqqy9XrYb + about: If you just have a question or need help, feel free to reach out on our Discord server. diff --git a/vendor/valence/.github/ISSUE_TEMPLATE/feature_request.md b/vendor/valence/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..163e65e6 --- /dev/null +++ b/vendor/valence/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,23 @@ +--- +name: Feature Request +about: Do you have an idea for a new feature? +title: '' +labels: enhancement +assignees: '' +--- + +## Describe the problem related to your feature request. + +A description of what the problem is. + +## What solution would you like? + +The solution you propose for the problem presented. + +## What alternative(s) have you considered? + +Other solutions to solve and/or work around the problem presented. + +## Additional context + +Any other information you would like to add such as related previous work, screenshots, benchmarks, etc. diff --git a/vendor/valence/.github/dependabot.yml b/vendor/valence/.github/dependabot.yml new file mode 100644 index 00000000..de924277 --- /dev/null +++ b/vendor/valence/.github/dependabot.yml @@ -0,0 +1,15 @@ +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "cargo" + directory: "/" + schedule: + interval: "weekly" + open-pull-requests-limit: 15 + - package-ecosystem: "gradle" + directory: "/extractor/" + schedule: + interval: "weekly" + open-pull-requests-limit: 15 diff --git a/vendor/valence/.github/pull_request_template.md b/vendor/valence/.github/pull_request_template.md new file mode 100644 index 00000000..80600c1d --- /dev/null +++ b/vendor/valence/.github/pull_request_template.md @@ -0,0 +1,8 @@ +# Objective + +- Describe the objective or issue this PR addresses. +- If you're fixing a specific issue, say "Fixes #X". + +# Solution + +- Describe the solution used to achieve the objective above. diff --git a/vendor/valence/.github/workflows/ci-pr-comments.yml b/vendor/valence/.github/workflows/ci-pr-comments.yml new file mode 100644 index 00000000..1d2ad10c --- /dev/null +++ b/vendor/valence/.github/workflows/ci-pr-comments.yml @@ -0,0 +1,66 @@ +name: Check Depgraph + +on: + workflow_run: + workflows: ["CI"] + types: + - completed + +permissions: + # Needed in order to leave comments on pull requests. + pull-requests: "write" + +env: + CARGO_TERM_COLOR: always + +jobs: + check-depgraph: + runs-on: ubuntu-latest + if: > + github.event.workflow_run.event == 'pull_request' && + github.event.workflow_run.conclusion == 'failure' + steps: + - name: Checkout Actions Repository + uses: actions/checkout@v3 + + - name: Download artifact + id: find-artifact + uses: actions/github-script@v6 + with: + result-encoding: string + script: | + var artifacts = await github.rest.actions.listWorkflowRunArtifacts({ + owner: context.repo.owner, + repo: context.repo.repo, + run_id: ${{ github.event.workflow_run.id }}, + }); + var matchArtifacts = artifacts.data.artifacts.filter((artifact) => { + return artifact.name == "bad-depgraph" + }); + if (matchArtifacts.length == 0) { return "false" } + var matchArtifact = matchArtifacts[0]; + var download = await github.rest.actions.downloadArtifact({ + owner: context.repo.owner, + repo: context.repo.repo, + artifact_id: matchArtifact.id, + archive_format: 'zip', + }); + var fs = require('fs'); + fs.writeFileSync('${{github.workspace}}/bad-depgraph.zip', Buffer.from(download.data)); + return "true" + + - name: Extract artifact + id: extract_artifact + if: ${{ steps.find-artifact.outputs.result == 'true' }} + run: | + unzip bad-depgraph.zip + echo "event_number=$(cat event-number)" >> "$GITHUB_OUTPUT" + + - name: Create pull request comment + uses: marocchino/sticky-pull-request-comment@v2 + if: ${{ steps.find-artifact.outputs.result == 'true' }} + with: + recreate: true + header: depgraph + path: pr-comment.txt + number: ${{ steps.extract_artifact.outputs.event_number }} diff --git a/vendor/valence/.github/workflows/ci.yml b/vendor/valence/.github/workflows/ci.yml new file mode 100644 index 00000000..ea46962f --- /dev/null +++ b/vendor/valence/.github/workflows/ci.yml @@ -0,0 +1,228 @@ +name: CI + +on: + pull_request: + merge_group: + push: # Run CI on the main branch after every merge. This is important to fill the GitHub Actions cache in a way that pull requests can see it + branches: + - main + +env: + CARGO_TERM_COLOR: always + +jobs: + valence-fmt: + name: Formatting + runs-on: ubuntu-latest + steps: + - name: Checkout Actions Repository + uses: actions/checkout@v3 + + - name: Setup Rust toolchain and cache + uses: actions-rust-lang/setup-rust-toolchain@v1.5.0 + with: + toolchain: "nightly" + components: "rustfmt" + + - name: Copy playground + run: cp tools/playground/src/playground.template.rs tools/playground/src/playground.rs + + - name: cargo fmt + run: cargo fmt --all -- --check + + valence-docs: + name: Documentation + runs-on: ubuntu-latest + steps: + - name: Checkout Actions Repository + uses: actions/checkout@v3 + + - name: Setup Rust toolchain and cache + uses: actions-rust-lang/setup-rust-toolchain@v1.5.0 + + - name: Copy playground + run: cp tools/playground/src/playground.template.rs tools/playground/src/playground.rs + + - name: Install dependencies (Linux) + run: sudo apt-get update && sudo apt-get install -y libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libxkbcommon-dev libssl-dev libclang-dev libgtk-3-dev + + - name: Validate documentation + run: RUSTDOCFLAGS="-D warnings" cargo doc --workspace --no-deps --all-features --document-private-items + + typos: + name: Typos + runs-on: ubuntu-latest + steps: + - name: Checkout Actions Repository + uses: actions/checkout@v3 + + - name: Check for spelling errors + uses: crate-ci/typos@v1.16.5 + + valence-clippy: + name: Clippy + runs-on: ubuntu-latest + steps: + - name: Checkout Actions Repository + uses: actions/checkout@v3 + + - name: Setup Rust toolchain and cache + uses: actions-rust-lang/setup-rust-toolchain@v1.5.0 + with: + toolchain: "stable" + components: "clippy" + + - name: Copy playground + run: cp tools/playground/src/playground.template.rs tools/playground/src/playground.rs + + - name: Install dependencies (Linux) + run: sudo apt-get update && sudo apt-get install -y libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libxkbcommon-dev libssl-dev libclang-dev libgtk-3-dev + + - name: Clippy + run: cargo clippy --workspace --no-deps --all-features --all-targets -- -D warnings + + valence-tests: + strategy: + fail-fast: true + matrix: + platform: [windows-latest, macos-latest, ubuntu-latest] + style: [default] + rust: + - stable + include: + - style: default + flags: "" + name: Tests (${{ matrix.platform }}) + runs-on: ${{ matrix.platform }} + steps: + - name: Checkout Actions Repository + uses: actions/checkout@v3 + + - name: Setup Rust toolchain and cache + uses: actions-rust-lang/setup-rust-toolchain@v1.5.0 + + - name: Copy playground + run: cp tools/playground/src/playground.template.rs tools/playground/src/playground.rs + + - name: Install dependencies (Linux) + run: sudo apt-get update && sudo apt-get install -y libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libxkbcommon-dev libssl-dev libclang-dev libgtk-3-dev + if: matrix.platform == 'ubuntu-latest' + + - name: Run tests + run: cargo test --workspace ${{ matrix.flags }} --all-features --all-targets + + - name: Run doctests + run: cargo test --workspace ${{ matrix.flags }} --all-features --doc + + - name: Run valence_nbt tests without preserve_order feature + run: cargo test -p valence_nbt --all-targets + + valence-miri: + name: Miri Tests + runs-on: ubuntu-latest + steps: + - name: Checkout Actions Repository + uses: actions/checkout@v3 + + - name: Setup Rust toolchain and cache + uses: actions-rust-lang/setup-rust-toolchain@v1.5.0 + with: + toolchain: "nightly" + components: "miri" + + - name: Run tests + run: cargo miri test --workspace --all-features --doc + + - name: Run doctests + run: cargo miri test --workspace --all-features --doc + + extractor-build: + name: Build Extractor + runs-on: ubuntu-latest + steps: + - name: Checkout Actions Repository + uses: actions/checkout@v3 + + - name: Setup Java + uses: actions/setup-java@v2 + with: + distribution: "zulu" + java-version: "17" + + - name: Test Build + run: ./gradlew build + working-directory: extractor + + check-depgraph: + name: Dependency Graph (assets/depgraph.svg) + runs-on: ubuntu-latest + steps: + - name: Checkout Actions Repository + uses: actions/checkout@v3 + + - name: Install cargo-depgraph + uses: baptiste0928/cargo-install@v2.1.0 + with: + crate: cargo-depgraph + + - name: Install graphviz + run: sudo apt update && sudo apt install -y graphviz + + - name: Generate new depgraph + run: cargo depgraph --workspace-only | tred | dot -Tsvg -o assets/depgraph.svg + + - name: Check depgraph diff + run: git diff --exit-code assets/depgraph.svg > assets/depgraph.patch + + - name: Create comment artifact + if: ${{ failure() && github.event_name == 'pull_request' }} + run: | + mkdir ./bad-depgraph + echo ${{ github.event.number }} >> ./bad-depgraph/event-number + + echo "It looks like this pull request changed the workspace structure. \ + Please replace \`assets/depgraph.svg\` with the following text: + +
+ depgraph.svg (Don't forget the trailing newline) + + \`\`\`html + $(cat assets/depgraph.svg) + + \`\`\` +
+ + For reference, here is a diff against the old \`depgraph.svg\`: + +
+ + \`\`\`patch + $(cat assets/depgraph.patch) + \`\`\` +
" > ./bad-depgraph/pr-comment.txt + + - name: Upload comment artifact + uses: actions/upload-artifact@v2 + if: ${{ failure() && github.event_name == 'pull_request' }} + with: + name: bad-depgraph + path: bad-depgraph/ + udeps: + name: Unused Dependencies + runs-on: ubuntu-latest + steps: + - name: Checkout Actions Repository + uses: actions/checkout@v3 + + - name: Setup Rust toolchain and cache + uses: actions-rust-lang/setup-rust-toolchain@v1.5.0 + with: + toolchain: "nightly" + + - name: Install cargo-udeps + uses: baptiste0928/cargo-install@v2.1.0 + with: + crate: cargo-udeps + + - name: Check for unused dependencies + run: cargo udeps --all --all-features diff --git a/vendor/valence/.github/workflows/website.yml b/vendor/valence/.github/workflows/website.yml new file mode 100644 index 00000000..13f0abd3 --- /dev/null +++ b/vendor/valence/.github/workflows/website.yml @@ -0,0 +1,71 @@ +name: Publish Website +on: + push: + branches: + - main + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + + # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + - name: Setup Rust toolchain and cache + uses: actions-rust-lang/setup-rust-toolchain@v1.5.0 + - name: Install latest mdbook + run: | + tag=$(curl 'https://api.github.com/repos/rust-lang/mdbook/releases/latest' | jq -r '.tag_name') + url="https://github.com/rust-lang/mdbook/releases/download/${tag}/mdbook-${tag}-x86_64-unknown-linux-gnu.tar.gz" + mkdir mdbook + curl -sSL $url | tar -xz --directory=./mdbook + echo `pwd`/mdbook >> $GITHUB_PATH + - name: Install zola + uses: taiki-e/install-action@v2 + with: + tool: zola + - name: Setup Pages + id: pages + uses: actions/configure-pages@v3 + - name: Build website + run: | + cd website + chmod +x build.sh + ./build.sh + cd .. + - name: Fix permissions + run: | + chmod -c -R +rX "./website/public" | while read line; do + echo "::warning title=Invalid file permissions automatically fixed::$line" + done + - name: Upload artifact + uses: actions/upload-pages-artifact@v2 + with: + path: ./website/public + + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v2 diff --git a/vendor/valence/.gitignore b/vendor/valence/.gitignore new file mode 100644 index 00000000..a7f66382 --- /dev/null +++ b/vendor/valence/.gitignore @@ -0,0 +1,18 @@ +/target +Cargo.lock +.vscode +.idea +*.iml +.gradle +/extractor/build +/extractor/out +/extractor/classes +/extractor/run +/extractor/bin +rust-mc-bot +.asset_cache/ +/velocity +flamegraph*.svg +perf.data +perf.data.old +/graph.svg diff --git a/vendor/valence/CODE_OF_CONDUCT.md b/vendor/valence/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..c80bf7ed --- /dev/null +++ b/vendor/valence/CODE_OF_CONDUCT.md @@ -0,0 +1,133 @@ + +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or advances of + any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email address, + without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +ryanj00a at gmail dot com (Email address subject to change). +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at +[https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/vendor/valence/CONTRIBUTING.md b/vendor/valence/CONTRIBUTING.md new file mode 100644 index 00000000..2f0b1612 --- /dev/null +++ b/vendor/valence/CONTRIBUTING.md @@ -0,0 +1,255 @@ +Valence has a public Discord server [here](https://discord.gg/8Fqqy9XrYb) and GitHub discussions [here](https://github.com/valence-rs/valence/discussions). Check those out if you have additional questions +or comments. + +# What version of Rust should I use? + +To _use_ Valence, only the most recent stable version of Rust is required. However, contributors should know that +unstable `rustfmt` settings are enabled in the project. To run `rustfmt` with the nightly toolchain, use +the `cargo +nightly fmt` command. + +# What issues should I work on? + +Issues +labelled [good first issue](https://github.com/valence-rs/valence/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) +are a good place to start. This label is reserved for issues that are relatively uncontroversial and shouldn't require too much specialized domain +knowledge to complete. New contributors are not required to start with these issues. + +If you plan to work on something that's not an open issue, consider making one first so that it can be discussed. This +way, your contribution will not be rejected when it is submitted for review. + +## Playgrounds + +Playgrounds are meant to provide a quick and minimal environment to test out new code or reproduce bugs. Playgrounds are also a great way test out quick ideas. This is the preferred method for providing code samples in issues and pull requests. + +To get started with a new playground, copy the template to `playground.rs`. + +```bash +cp tools/playground/src/playground.template.rs tools/playground/src/playground.rs +``` + +Make your changes to `crates/playground/src/playground.rs`. To run it: + +```bash +cargo run -p playground # simply run the playground, or +cargo watch -c -x "run -p playground" # run the playground and watch for changes +``` + +# Automatic Checks + +When you submit a pull request, your code will automatically run through clippy, rustfmt, etc. to check for any errors. +If an error does occur, it must be fixed before the pull request can be merged. + +# Code Conventions + +Here are some rules you should follow for your code. Generally the goal here is to be consistent with existing code, the +standard library, and the Rust ecosystem as a whole. Nonconforming code is not necessarily a blocker for accepting your +contribution, but conformance is advised. + +These guidelines are intended to complement +the [Rust API Guidelines](https://rust-lang.github.io/api-guidelines/naming.html). + +## Top-down Modules + +Readers of the module should be able to understand your code by reading it from top to bottom. +Whenever [items](https://doc.rust-lang.org/reference/items.html) in your module form a parent-child relationship, the +parent should be written above the children. Typically this means that important `pub` items are placed before private +implementation details. + +For instance, here are three functions. Notice how the definition of `foo` is placed above its dependencies. The parent +is `foo` while its children are `bar` and `baz`. + +```rust +pub fn foo() { + bar(); + baz(); +} + +fn bar() {} + +fn baz() {} +``` + +This guideline applies to types as well. + +```rust +pub struct Foo { + bars: Vec, +} + +struct Bar { + // ... +} +``` + +## Getters and Setters + +Getters should not start with a `get_` prefix. + + + + + + + + + + +
GoodBad
+ +```rust +impl Foo { + fn bar(&self) -> &Bar { ... } + fn set_bar(&mut self, bar: Bar) { ... } +} +``` + + +```rust +impl Foo { + fn get_bar(&self) -> &Bar { ... } + fn set_bar(&mut self, bar: Bar) { ... } +} +``` +
+ +See [`SocketAddr`](https://doc.rust-lang.org/stable/std/net/enum.SocketAddr.html) for an example of a standard library +type that uses this convention. + +Under appropriate circumstances a different naming scheme can be +used. [`Command`](https://doc.rust-lang.org/stable/std/process/struct.Command.html) is a standard type that demonstrates +this. + +If a `bar` field exists and no invariants need to be maintained by the getters and setters, it is usually better to make +the `bar` field public. + +## Bevy `Event`s + +Types intended to be used as events in [`EventReader`] and [`EventWriter`] should end in the `Event` suffix. +This is helpful for readers trying to distinguish events from other types in the program. + + + + + + + + + + +
GoodBad
+ +```rust +struct CollisionEvent { ... } + +fn handle_collisions(mut events: EventReader) { ... } +``` + + +```rust +struct Collision { ... } + +fn handle_collisions(mut events: EventReader) { ... } +``` +
+ +[`EventReader`]: https://docs.rs/bevy_ecs/latest/bevy_ecs/event/struct.EventReader.html +[`EventWriter`]: https://docs.rs/bevy_ecs/latest/bevy_ecs/event/struct.EventWriter.html + +## Specifying Dependencies + +When adding a new dependency to a crate, make sure you specify the full semver version. + + + + + + + + + + +
GoodBad
+ +```toml +[dependencies] +serde_json = "1.0.96" +``` + + +```toml +[dependencies] +serde_json = "1" +``` +
+ +## Writing Unit Tests +When writing unit tests, unwrap errors instead of returning them. +Panicking displays the line and column of the error, which is useful for debugging. +This information is lost when the error is returned. + + + + + + + + + + +
GoodBad
+ +```rust +#[test] +fn my_test() { + some_fallible_func().unwrap(); +} +``` + + +```rust +#[test] +fn my_test() -> anyhow::Result<()> { + some_fallible_func()?; + // ... + Ok(()) +} +``` +
+ +## Documentation + +All public items should be documented. Documentation must be written with complete sentences and correct grammar. +Consider using [intra-doc links](https://doc.rust-lang.org/rustdoc/write-documentation/linking-to-items-by-name.html) +where appropriate. + +## Unit Tests + +Unit tests help your contributions last! They ensure that your code works as expected and that it continues to work in +the future. + +whole-server unit tests can be found in [`/src/tests/`](/src/tests). + +## Naming Quantities + +Variables intended to hold quantities should be written with the `_count` suffix instead of the `num_` prefix. + + + + + + + + + + +
GoodBad
+ +```rust +let block_count = ...; +``` + + +```rust +let num_blocks = ...; +``` +
diff --git a/vendor/valence/Cargo.toml b/vendor/valence/Cargo.toml new file mode 100644 index 00000000..6cdfb217 --- /dev/null +++ b/vendor/valence/Cargo.toml @@ -0,0 +1,211 @@ +[package] +name = "valence" +version.workspace = true +edition.workspace = true +description = "A framework for building Minecraft servers in Rust." +documentation.workspace = true +repository.workspace = true +readme = "README.md" +license.workspace = true +keywords = ["minecraft", "gamedev", "server", "ecs"] +categories = ["game-engines"] +include = ["/src", "/benches", "/examples", "/README.md", "/LICENSE.txt"] + +[features] +default = [ + "advancement", + "anvil", + "boss_bar", + "inventory", + "log", + "network", + "player_list", + "scoreboard", + "world_border", + "command", + "weather", + "testing", +] +advancement = ["dep:valence_advancement"] +anvil = ["dep:valence_anvil"] +boss_bar = ["dep:valence_boss_bar"] +inventory = ["dep:valence_inventory"] +log = ["dep:bevy_log"] +network = ["dep:valence_network"] +player_list = ["dep:valence_player_list"] +scoreboard = ["dep:valence_scoreboard"] +world_border = ["dep:valence_world_border"] +command = ["dep:valence_command", "dep:valence_command_macros"] +weather = ["dep:valence_weather"] +testing = [] + +[dependencies] +anyhow.workspace = true +bevy_app.workspace = true +bevy_ecs.workspace = true +bevy_log = { workspace = true, optional = true } +bytes.workspace = true +rand.workspace = true +uuid.workspace = true +valence_advancement = { workspace = true, optional = true } +valence_anvil = { workspace = true, optional = true, features = [ + "bevy_plugin", +] } +valence_boss_bar = { workspace = true, optional = true } +valence_bytes.workspace = true +valence_command = { workspace = true, optional = true } +valence_command_macros = { workspace = true, optional = true } +valence_ident_macros.workspace = true +valence_ident.workspace = true +valence_inventory = { workspace = true, optional = true } +valence_lang.workspace = true +valence_network = { workspace = true, optional = true } +valence_player_list = { workspace = true, optional = true } +valence_registry.workspace = true +valence_scoreboard = { workspace = true, optional = true } +valence_server.workspace = true +valence_text.workspace = true +valence_weather = { workspace = true, optional = true } +valence_world_border = { workspace = true, optional = true } + +[dev-dependencies] +anyhow.workspace = true +clap.workspace = true +criterion.workspace = true +flume.workspace = true +noise.workspace = true # For the terrain example. +tracing.workspace = true + +[dev-dependencies.reqwest] +workspace = true +default-features = false +features = ["rustls-tls", "blocking", "stream"] + +[[bench]] +name = "main" +harness = false + +[profile.dev.package."*"] +opt-level = 3 + +[profile.dev] +opt-level = 1 + +[workspace] +members = ["crates/*", "tools/*"] +exclude = [] +resolver = "2" + +[workspace.package] +version = "0.2.0-alpha.1+mc.1.20.1" +edition = "2021" +repository = "https://github.com/valence-rs/valence" +documentation = "https://docs.rs/valence/" +license = "MIT" + +[workspace.dependencies] +aes = "0.8.2" +anyhow = { version = "1.0.70", features = ["backtrace"] } +approx = "0.5.1" +arrayvec = "0.7.2" +async-trait = "0.1.60" +atty = "0.2.14" +base64 = "0.22.1" +bevy_app = { version = "0.12", default-features = false } +bevy_derive = "0.12" +bevy_ecs = { version = "0.12", default-features = false, features = [ + "multi-threaded", +] } +bevy_hierarchy = { version = "0.12", default-features = false } +bevy_log = { version = "0.12" } +bevy_mod_debugdump = { version = "0.9.0", default-features = false } +bevy_utils = { version = "0.12" } +bitfield-struct = "0.9.2" +bitvec = "1.0.1" +byteorder = "1.4.3" +bytes = "1.2.1" +cesu8 = "1.1.0" +cfb8 = "0.8.1" +clap = { version = "4.0.30", features = ["derive"] } +criterion = "0.5.1" +derive_more = "1.0.0-beta.3" +directories = "5.0.0" +eframe = { version = "0.29.1", default-features = false } +egui = "0.29.1" +egui_dock = "0.14.0" +flate2 = "1.0.24" +flume = "0.11.0" +fs_extra = "1.2.0" +glam = "0.29.3" +heck = "0.5.0-rc.1" +hmac = "0.12.1" +image = "0.25.4" +indexmap = "2.2.1" +itertools = "0.13.0" +java_string = { path = "crates/java_string", version = "0.1.2" } +lru = "0.12.0" +noise = "0.9.0" +num = "0.4.0" +num-bigint = "0.4.3" +owo-colors = "4.1.0" +ordered-float = "4.1.1" +parking_lot = "0.12.1" +paste = "1.0.11" +petgraph = "0.6.3" +pretty_assertions = "1.3.0" +proc-macro2 = "1.0.56" +quote = "1.0.26" +rand = "0.8.5" +rayon = "1.7.0" +regex = "1.6.0" +reqwest = { version = "0.12.8", default-features = false } +rfd = "0.15.0" +rsa = "0.9.2" +rsa-der = "0.3.0" +rustc-hash = "2.0.0" +serde = "1.0.160" +serde-value = "0.7.0" +serde_json = "1.0.96" +sha1 = "0.10.5" +sha2 = "0.10.6" +syn = "2.0.15" +syntect = { version = "5.0.0", default-features = false } +tempfile = "3.3.0" +thiserror = "1.0.40" +time = "0.3.17" +tokio = { version = "1.27.0", features = ["full"] } +toml = "0.8.19" +tracing = "0.1.37" +tracing-subscriber = "0.3.16" +url = { version = "2.2.2", features = ["serde"] } +uuid = "1.3.1" +valence = { path = ".", version = "0.2.0-alpha.1" } +valence_advancement = { path = "crates/valence_advancement", version = "0.2.0-alpha.1" } +valence_anvil = { path = "crates/valence_anvil", version = "0.1.0" } +valence_boss_bar = { path = "crates/valence_boss_bar", version = "0.2.0-alpha.1" } +valence_build_utils = { path = "crates/valence_build_utils", version = "0.2.0-alpha.1" } +valence_bytes = { path = "crates/valence_bytes", version = "0.2.0-alpha.1" } +valence_command = { path = "crates/valence_command", version = "0.2.0-alpha.1" } +valence_command_macros = { path = "crates/valence_command_macros", version = "0.2.0-alpha.1" } +valence_entity = { path = "crates/valence_entity", version = "0.2.0-alpha.1" } +valence_generated = { path = "crates/valence_generated", version = "0.2.0-alpha.1" } +valence_ident = { path = "crates/valence_ident", version = "0.2.0-alpha.1" } +valence_ident_macros = { path = "crates/valence_ident_macros", version = "0.2.0-alpha.1" } +valence_inventory = { path = "crates/valence_inventory", version = "0.2.0-alpha.1" } +valence_lang = { path = "crates/valence_lang", version = "0.2.0-alpha.1" } +valence_math = { path = "crates/valence_math", version = "0.2.0-alpha.1" } +valence_nbt = { path = "crates/valence_nbt", features = [ + "uuid", +], version = "0.8.0" } +valence_network = { path = "crates/valence_network", version = "0.2.0-alpha.1" } +valence_player_list = { path = "crates/valence_player_list", version = "0.2.0-alpha.1" } +valence_protocol = { path = "crates/valence_protocol", version = "0.2.0-alpha.1" } +valence_protocol_macros = { path = "crates/valence_protocol_macros", version = "0.2.0-alpha.1" } +valence_registry = { path = "crates/valence_registry", version = "0.2.0-alpha.1" } +valence_scoreboard = { path = "crates/valence_scoreboard", version = "0.2.0-alpha.1" } +valence_server = { path = "crates/valence_server", version = "0.2.0-alpha.1" } +valence_server_common = { path = "crates/valence_server_common", version = "0.2.0-alpha.1" } +valence_text = { path = "crates/valence_text", version = "0.2.0-alpha.1" } +valence_weather = { path = "crates/valence_weather", version = "0.2.0-alpha.1" } +valence_world_border = { path = "crates/valence_world_border", version = "0.2.0-alpha.1" } +zip = "2.2.0" diff --git a/vendor/valence/Cargo.toml.backup b/vendor/valence/Cargo.toml.backup new file mode 100644 index 00000000..49ddae74 --- /dev/null +++ b/vendor/valence/Cargo.toml.backup @@ -0,0 +1 @@ +This is a backup of the original valence Cargo.toml diff --git a/vendor/valence/LICENSE.txt b/vendor/valence/LICENSE.txt new file mode 100644 index 00000000..f38bf27c --- /dev/null +++ b/vendor/valence/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Ryan Johnson + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/valence/README.md b/vendor/valence/README.md new file mode 100644 index 00000000..c1ced1a3 --- /dev/null +++ b/vendor/valence/README.md @@ -0,0 +1,124 @@ +

+ +

+ +

+ + license + + + + chat on Discord + + GitHub sponsors +

+ +**Note: Valence is currently undergoing a major rewrite. See [#596](https://github.com/valence-rs/valence/issues/596) and [#599](https://github.com/valence-rs/valence/pull/599) for details.** + +--- + +A Rust framework for building Minecraft: Java Edition servers. + +Built on top of [Bevy ECS](https://bevyengine.org/learn/book/getting-started/ecs/), Valence is an effort to create a +Minecraft compatible server completely from scratch in Rust. You can think of Valence as a _game engine for +Minecraft servers_. It doesn't do much by default, but by writing game logic yourself and leveraging Bevy's +powerful [plugin system](https://bevyengine.org/learn/book/getting-started/plugins/), you can make almost anything. + +Opinionated features like dynamic scripting, dedicated executables, and vanilla game mechanics are all expected to be +built as optional plugins. This level of modularity is desirable for those looking to build highly custom experiences +in Minecraft such as minigame servers. + +āš ļø **Valence is still early in development with many features unimplemented or incomplete. Expect to encounter bugs, limitations, and breaking changes.** + +# Goals + +Valence aims to be the following: + +* **Complete**. Abstractions for the full breadth of the Minecraft protocol. +* **Flexible**. Can easily extend Valence from within user code. Direct access to the Minecraft protocol is provided. +* **Modular**. Pick and choose the components you need. +* **Intuitive**. An API that is easy to use and difficult to misuse. Extensive documentation and examples are important. +* **Efficient**. Optimal use of system resources with multiple CPU cores in mind. Valence uses very little memory and + can + support [thousands](https://raw.githubusercontent.com/valence-rs/valence/main/assets/many-players.png) + of players at the same time without lag (assuming you have the bandwidth). +* **Up to date**. Targets the most recent stable version of Minecraft. Support for multiple versions at once is not + planned. However, you can use a proxy with [ViaBackwards](https://www.spigotmc.org/resources/viabackwards.27448/) to + achieve backwards compatibility with older clients. + +## Current Status + +Here are some noteworthy achievements: +- `valence_nbt`: A speedy new library for Minecraft's Named Binary Tag (NBT) format. +- Authentication, encryption, and compression +- Block states +- Chunks +- Entities and metadata +- Bounding volume hierarchy for fast spatial entity queries +- Player list and player skins +- Dimensions, biomes, and worlds +- JSON Text API +- A Fabric mod for extracting data from the game into JSON files. These files are processed by a build script to + generate Rust code for the project. The JSON files can be used in other projects as well. +- Inventories +- Items +- Particles +- Anvil file format (read only) +- Proxy support ([Velocity](https://velocitypowered.com/), [Bungeecord](https://www.spigotmc.org/wiki/bungeecord/) + and [Waterfall](https://docs.papermc.io/waterfall)) + +Here is a [short video](https://www.youtube.com/watch?v=jkw9fZx9Etg) showing the examples and some of +Valence's capabilities. + +# Getting Started + +## Running the Examples + +After cloning the repository, run this command to try an example. + +```shell +cargo r -r --example parkour +``` + + I also recommend giving `game_of_life`, `terrain`, and `cow_sphere` a try. + +Next, open your Minecraft client and connect to the address `localhost`. +If all goes well you should be playing on the server. + +## Adding Valence as a Dependency + +Valence is published to [crates.io](https://crates.io/crates/valence). Run `cargo add valence` to add it to your +project. + +However, the crates.io version is likely outdated. To use the most recent development version, add Valence as a +[git dependency](https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#specifying-dependencies-from-git-repositories). + +```toml +[dependencies] +valence = { git = "https://github.com/valence-rs/valence" } +``` + +Documentation from the main branch is available [here](https://valence.rs/rustdoc/valence/). + +# Contributing + +Contributions are welcome! Please +see [CONTRIBUTING.md](https://github.com/valence-rs/valence/blob/main/CONTRIBUTING.md). You can +join [Discord](https://discord.gg/8Fqqy9XrYb) or [GitHub Discussions](https://github.com/valence-rs/valence/discussions) +to discuss the project and ask questions. + +# License + +Code is licensed under [MIT](https://opensource.org/licenses/MIT) while the Valence logo is +under [CC BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/) + +# Funding + +If you would like to contribute financially, consider sponsoring me (rj00a) +on [GitHub](https://github.com/sponsors/rj00a) +or [Patreon](https://www.patreon.com/rj00a). + +I would love to continue working on Valence and your support would help me do that. Thanks! diff --git a/vendor/valence/assets/logo-256x256.png b/vendor/valence/assets/logo-256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..f6e9a86a3e68888e95874b5988ce98a756b4df2d GIT binary patch literal 15166 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 literal 0 HcmV?d00001 diff --git a/vendor/valence/assets/many-players.png b/vendor/valence/assets/many-players.png new file mode 100644 index 0000000000000000000000000000000000000000..730bb057c2b8a009ff274104134bfcb560ed2e63 GIT binary patch literal 1058485 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≦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ර-d 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

OkBK)+u|ImwVf0Y*gv@1;EvXw5Gp& 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

Ak>Sh%l5sy;_UyMFu*(y#I zl6)?CS%%utxh_fn&3b)#3aeEw``jHOjOioFs)dt6gSw3LxONgZmfhL@_8R_3`&Xd} z9st0))&YyV=lC`Se1F4zch?rqKPaA4h)`xlXYwY7$zWjZq~dny>Bes^zvlbs>zXY& z=?-=T+cZFBeR8F#z>H_#QY@|e`;ou{i7+-t)BxC0Co5Z#_hB0$(b?p-S(30<(&emJ zZ!d4p{6gg{1YaK)gdd3}#8KKORgD#l;S`xpO^K(!-N9M~xY-AVHclPcJ)Ksm=#QQqsdVzex z`XbQxX8OEABSHtIZ8xW_bjg{b!O{4MFwSOgO4=RHu2xS2;x$(kU{G7BO2EQvCik7is)3oOeB&%yq7craHbJW#A8-H}* z>j)bi<7!ZjPWoqdFAx{t_<(g|?Q;ojVm=`#W>$672mC9b1zHCf(SI#ba#*E*kVs74 z;k92S_ne30M((iwr${&GB&ALzxV32>nKbu7ei{N+cY40t?j8S@AMjGJ%y`On*TbYL z1O@B=_3R;(dy-`9Ty3z+u_|On-PaPu!W#DBstw(}%BGRUG6_qSove1p707BJ-sqDn&4tohu4k%RvxJK(6 zHQxv5g9~XMrcRBOav7pej7Z~ePK-IR-!8S2nm?e@Zl9c>E1{=A`Fx-5yB!kgh7=Cl zd*nC81R)&3eRLFDg?)wLEOn zo$@RiSjd+A%B%#MY|SjISX$}mrin#Z#)TxR{^algXB6Q_q$8FhoxZJ zJoup8a8M?)SxDvn^A9QLI{>Y7M+`Zvy)WftyWv0CBT+iu+S@&s{)knv`r^|^GADhGHxWLZa`pY+8 zY~roKTXI3Jml8;dU+_cvLXCb)vZmuD*TrQl@68{(gFR4x^cZ2_}xK(7pFXnYKI8d9SRj0 ze2FI3MI4LFhT6%QFQs24jkAiGNQVw6GAxFh{r8?FHwaluxJ^Ln!Jco0>5_t)#uHHd zGYiUX!9rOH4)3`PuBW@dJ3|=)#w}FuLUxvKZ)1+|&F}8FjySdXUMVMjt0c3#Z?Rk_ zBNx)m^8X=F^} z-M8>daXb72@7=3>-we;vxbTbwFb@!QKOpjwWc`@b3+}q5_-*s<;wq|$volYSv*0Fx z61{l&Q-h*}R}g)JNL_W#nyX;Uvp;84R#-@4<#N!oiE;@WgTUv^yj4~h+OdVz_lC7v zc$mOonZecRoq^_g?2qX(lk?JjS9qG!20sKFK0KVdU+od8EHH#pC5CkdTc2NFyh}Vq zZ6q)Idm(Kn;y;tBDgB7|&4tp<{J~G*jPsH#*s#^SSJ%&rGrxcL5k=V>%O2-&)?z?m zmhOLkac5?(O2tZGNV4oJt|u85`cqLcX>Nuaiup$1k-^XeFhA z#^DGZ_~$?HH^&5R8ZcPj68e3S@aNP7Q^)zEI)T_JRwbn%r^ZyE5Va|(9?32`254kd zk)T)8messMPCbG^kss7#m+r@xi%VxzJ)te>&TsPGP#Fv$Q!RF6gJojYSLF$Ko>gER zEt{6;5G8GQfX{qJD44qG2>$T!>7T8|Hvvsk@HVifRR%g zfI$*! zCJbshUbSK?^-Z3^8ADz{kd%;8^0$U?MHwaj-#(s^`@HJxfbqDsze&f6Y+&(eH4z4# zH$eYjcq#cEAER7_f`B6YK3Q5UFDFG9(^!{iU@sKN4^}_Hus85DHw)EY1&?H-+UywW z6kI%1%Xd`%yiKG8hA{8MeOktZA4xM-w0G8 z0&Xx0?-*dzY~JI#B!>ATRtQnWVoaL5{VJkcc@x9_r$At&;Do(3ZCA+`|4Yri#3&{; z)cPg#M1_)WnI?Twrjof2ZaLi%s$2C0RZ;d>0{W!Iak1q`0ei*cr_&(Y1a<*?Q&r(4 z3CBTzOHHLLM{#;mxSX0HcJGE8u;vnbs1AIQ?hQ^}Bf7k$NM!6vCQwAM2?fJ*tnWNC z_SLkwYAOXSingMGDqqi27?31sB*n!&UwZck#9KOZ z@;R6;XQ}N+xE&?s#)gLTB=pAyA5_9R^;JP1c1<^$ICoP|o)U42tKjcZ@ugRq?>BFw6aqrL%Bo@_obo0!D1)fQ=rYfYKeKMx!)} zs0gD3l~kl-W2Cewp_1|yRK$URNRE=Bs1p%J*HpSY&wl5ezhUp*=Xvk@x;~#jt5`=d z69^?ma=OnIG75S#k;;*#;oOWc*aH!0@)iI@=t)IJ?4pY(wlU80Nro!N=Q#F6AOkt4 z$JcyM?{V|o{#5MXhbin|5@cgO9H!K7?Ra~z? z{|gk}HpjX!2>JgsM(I6caA-Dsl#%@z z@|2z=z0q^;%D?M?C0`LS$fxvf8+)8}xto}WVU=$mZ=&ryP}A#PfRe1Sz;0c&ZZ}RD z69o^8QczqeSwpo^u_-EH3OkxgK8WRB!DEzbr}YQ??{Oig&sqx3bhG$#hD3hmrF$m{ zF0ES}VU|1X?d1WwxRt;JE0~gmRb`g)RffBFNa|el=-&&p!Q73#DeS!@ydn5T5O6G1 z_ieReu+-z+$M3Cz!Nrd#JDjC9e|*7R!dU&({B#z2--#}e^;Mr!CZybH^o5oLd0Bt= zcTng1B9!1g3)SPd#D0{UZ4#<QRWCSmw0LK|u$Vr~mFM|Eax@m3nqamE zED`#`d9mrJ!ACr-D01+p?zOeeMCqCQGCc$EDYAcqr_;vW5h)0<(q@n5E| zsJhCeXo3(Pc*BI*0lMgW#Pi*gq?XP0;UAZ$FL%%6H;PtnDo2~jyh;_w2Bh$eJ?P)u zUck)Va81rT3?mccBni`eWX-jvw6s`a6HB-<@o@n9DC;m%m zKHrl{f-JAz*-p9b`GHsf)xMh#u);Dl@7<*h2aH!))Dikc!{g;Jr6 z{ii3A>{0x2Wt_kzL|(AWO4>$m1Rj8IHWH3QR#@Dpku;6%6jz8czz4A|GcEj}gjHm? z@Fp4F+UVx{x7+X{4rG|GTGZ)o(hT!@#sg>gaHH(m zI@?yVLB8;fL`T>@#K-M+=ODcX;o5=|dS_uCVDyk5?8CUW_+RBs_3Q)ct7};KQ#y&y zIj(U2k*}-WL$sqpfa%4r^wK5R$4SJo`PfLSq$nGBT~41EMN&tl>Xe@TVG@^(b^G+e zA`S7de&gu9KEG|o7cl#qQc(ql&3LN`H=cIfsB*{OeCT%)xJz@DIqLss6v2o7bS;5m z!~xKr34O@jo%j%?i2iI`<@i~-2DE4{p&-rhl&xE+hxwWLwJd{Wn(mNq7vPy86Pvx* z+IkOP28^PXqGwsMIV%SGE3>A1-RiHG) zIsV3FlqIg&p5ioFX77IBB^;G+k=_Cnm*_H}?_rI055^SAg$o-;f6Nbu<1$kc50kUA z6K0NVmeG`~%%|xryW*cN8n`kG%+Gzt>AX%_tyZuNB?3cRqfg>Sv*WBfPxnvqq(fVx zGaF@W2P~fggKaO?em>KLkPUJ=8fh^z{Nn^R@v^-n_>PsBTrO& znn&L@T;NvcN>d%-XqG`fZ>N(s`$>Pw2@)8q)O2f{1pOinhjblGhxyPs3 z?=&!A+r>WQeV)iEpi6qMa{>x6n|Sm#@HMJ@hLe_{*C@WU`oLV5akRtG$D7qsPW?kx zXk*FOoR4#i4~LG=T(QClgCBcu(ErVvkb1qog8uG?uXF45-moR>$03Y>&j6Ljf^OiE z=@3r-=$q8+U-L8RD?Z+ob1Fl-d{?&U$m9-L>N(k~lDHrkZBAJ*FRW|v9@3&(>Wiu;Td#Di`~c_nIlLQXZ$-k}QzFe~1+pRO`JJXzdIwz$K= zCI;Cyp=TwWZFM@{t99g#5G|)4Y#JQO(cc-N`5xV9#dloKP%$))el4dA?}Yl)cW=bt zZ;2D6*XE(OCZkyIM83Z4QRLZ?I5&BCq|in}B*<87#(j-^!ZLe4>pz832QeUMjHMsP zG;a4EOKoh80}fRu32VH)St}Yw>W)neEfz~1izhlG;@>XwB&_a6r~e`Up~n`Lv%q@M zc-eDDo4ohcpvgbFzIBlpyXlf2u|9KKZAiU!V0v$v;4W12js)BCoDQRWu*sAxaP$Ov zEpte+GlZsTE_c7(iVk=+js&{*3!j7BVBbF&Q-I|2>pw}I8A9#-{^)O(Rv^Cith%xi z%M62g0@B^g%?(1@zL;AmwnUy~V8CI<+wm;$^+f*aCBX{$iL|StzW-#C6NOvTqMkgU zTSuLy#%!i$nu`Q)i18}<^qXfP9*lE`#ID6@{pyH-+oM9WyQ)8dS@=*1g5+;xk0Ww( zc+CMK8V=kv7Oa)Z-cdJOP!?ifZzu49+*XpN?;zgG14ZE0f0g>A@z!J*77g2rZp%7_ zRIWB$F_DQR{(euoKlqF!+%X*j(2yDmwrkku23P4A1_>@J~h*?MdsI~Wtf#sMFT zDKvSm@bcgdFNi&`=flVO&#KI6# z4tIf;tj;m6evjT`yrFq~e#(Nns>5#iCQi_&OuQebhjTBNWzN$NMeJRQu{C+Z$M}g^ zx49*uM8b`bSRy<&cqxu58IUa{j%^+g6&H>r_-pv)Dc4?S^GW3}h!D8@#kOu%FoJ0X z=JxqP`}wd6x!~H5kgzMz{^{J1?s&~jPX$XCcoVdc9_^RJr?7ZaXwtRX^a8v(HzFM; zxg4W%?141Ljgvb6vdi%gqGN~$8=V9ML+f;0NZRMf=~hP~i@>%8mj0g5W#jT6i#cVp z=s@xpXE^A#rMNhwHz{mJtG1V1t4*>KLxWd1_u?x{9?GB1Y9GRU>=l_jDgG-Qvl&TD zau)#;?^0@z5I?CzfYe>B3_o|i5tyiJEU_KCXdneaef9WtMz7%O$ex0vQZc<8*%71h zfKm3Fk{GQg6F<81lUy45$Yk7viTQf~2Yp|Dbqgn`A?85bm#iYLSTn3VGtw)|z0$5? zAQhD&r$$1zC+qAAsS}NS)RaF*D;HKMZgMwV?cLflqOY{Hzs!Amn-JQdwEY&VZfO9n zC|@oDK9$Kj+CoZ0h$-6J6J7uCUZQOl(_sj*Zgov;!i>LWkl?5uX?UOh4=<9S!_Wpj z>hdVGnu8~BKVHd6Qw>id>&@o3lAyi9?@0I{g4`%tK9KcP263s`9L| zPGXb2kNx!V8UIR#wv%?Z8YR)s42sxp^r4=E`UEDjQSFS1&S9o_@h{|qRw|8(J%Pg4 zkIwYVOyZ;R+Fzw<2HLVKah<^5-P(qKWfeiaw7@ptFYrP-jMreI@3)?_?T=+t_~(9yyTOB8_-d!%+&R^e-pN1wIIw zGO{D+7(gypq*&K-s*#%s1$H(c4K$dZ$40@OlCvV z$CeU;uI*2Qu%VlZ9}JFnGV|Ni2C^g4XsZUGoeH8A=rSgh^3rd}1Ldy4Ug>AFoFVP& z$F|+$L-)l{myZs?3&>Ckh#7nHyMbf;|Eh>H|EBakM>2FYnV)$Y%SSGJN=2Sb-rTQt z3lwB}n1%QkluzWu$=yA|Mf~9e56DZ?Qb-P=ddkEP?)+p(L%L&e>^H!r4+7%LSS7a2|2XTP}wPK!B)K9TFtHD|rFMYYyA+uf4#*9VR{_B%;RVc>n# zO%6-B&2ojN7;65-L(eoRVhq5lwq%NzZB6Rz5IQ6DHnc#@cZI@{W8!dUv%I+*>()M8pz20Ozd_)HVAP+1@WhiNv5JvO=?jX1 zLHCt8KLCA>9Le?ihH-|lUF&LCIe^+N=R1HX|M>1*Iz2h}d_Td8LBfVCZo^LCThGx8 z0R{0MD*aISQRPAUcoQD(E!}Xd%ri2VHOC`3|{PNQ9v@0OP zPY8Ye1~uoh!y7n7`&?w8yrO_?YsUcE}r#jVQt zt|bb&GSX}LH-hSc3;8}&c1zoyOg{uTLW9VDXO``N`7XuUj#|jnNxFI~KwnJ2Uh#-% zm0!w~oDEq$>M{tu!}T0oE^4HGN{nnYU|S#lV!n6R7bwztH&n=9D9oNa?D)g73Prf- z6E=t@+@+XsXzsl(nxET8{}6T==H<|ksq__l!N%>HRHvN(v>?6QQdUN~e|>%8UfB*x zBMcK0XLT%IA!Qgk95>6}U=P*JsL^5w*HAnRG?vH}?k2Kug@@Cl86&!ikROyGyfFG=RUvGNLGd&WN7P8v%j#aC|1t8-z2ozsx>d;6ZDR~ zw}G2K#`hvog;j-V?Tv@5@C|pzb@67z;B|;->zf~>k{9*D0qX?!Htw*Gf7R#hDBTS9 zt}5;W0>K)8GN-aSUj4VEK39Klw|@cl=aiBn?)AUhz;c+ka0N4+UC^yunFC(Z{B3oe z4u5!^AY_z2&W}sM^K@j`4pLN%f><~0ek={WBYefL27-bpYY#ywcsW{zNI85xzuQ7zh$sT-b0aYegp z?0xdfGa?&v^r7kO^tlwX3mvNyFMs1?eYjb|?`KehU;H^wxOxE|sK^#GC4GaiCk6eB z;v72vaGve1Gx|~(%4jVFjlaCSOdEHL2c&s2wtQ*D?!gb<&_RuxrlHu)9VT2&x^S)9nnSjMk zO%Z=Gh@!AoLnX9~J;m!y)9Qy|B`n@gS^&)+`Dq?Y)9CoV{9yO8?R*_i8{59BA5z{b zPnu+KR;OWD*1l}e*h%`sJy@=(mXAI2y;H)|d*;m*f)$3<9e{d|>4!2!eXbU61j!FQ(f()HSe0mLY5DQjP?@|Em=$B5kQsCE- zl&{f#({{C#hTg7^$q7~)=1>`|nLk13DGHtnOi^K;VOLq!rq!c+Y@ zm)VV~_)4tU#cd$9;5CHzKA~7PA*suaW403WI98gMTU1(7W7`ZIn!M%*h%)W@AsT?`4d52DBF{GI zKg(hJq5GN`j90HojfvL`Gh|P?LGvN0A22;mS~-4-m~(fcgL=XDi@C4s`}mq)XALss zjNq>e{H;#B?=;2JEp~ersr$NR(mo|SLOIu&Y3;PdJed^3^7_s!^k%N{$0sE4J2^QaD;cr$2HIb>`qCno>({P6`u*nbt_Y+F zuOIu`o%gfh#i)~q7Y9>d@#;U6xU7%nbCS&zO49obS5S0D)#%A(OH^602-AR3paUD1 zlqzXiZ-VhU3Gn8!>?msQB0b`Kz2?>k_+3Sf$VpXq=5O?KS0g^rwumkEunA_Oy;nkA z$7yRU!xauIGpElN4Lm~0kTzfu!~U75{|>62BWNW!vFWA*x0!HKkvy>+?(3)HB=n2E z!Llh6^WH>w3i;UQC*&vUD6#O>4KO&OW>w%J9MYRXc_p_bsN1B~8;m0ykC|Q@6?GdH zy*p4W+Ied1)(UlbYapurvDz=w1{=9uwCZ7FS6kkBy z$jB`(>2*6#6fdXt-%&Yl)~+821pi;_IH8;870!KGpJCc9Y@_4oFz2a@{xlXS8*K6Gqjyv2egLdGF@b8Muq=~$C{wF3%SzBA6&W#39@2+E7I zn^1Dg^cM#vBl4IqRM|Y3gxtng)wMAGj9=N8b~dYc%$eaNl@%_Ht`%%0ur?(@Xyukn z*Ao|*P`##QqAY2@`$}}uylOYPJ{H3^#In#)i0YB}tM`IAY1<%5hC&us$>E)y#oyTa zc)ptdP4bOFYbze7$Eh>A`#ePF7O_;FgVbuyV48|v&Aoq_O3T{G)Y8QnPewbD_{uv5 z=!gw1+>4_Z27fysfc1j(6(@RPUL<-W52?RchiaHO62&hRh{_dqtlCDLF>dK)EZIzz zYTDRXr(rMZKRnXHsFi`7HGk84+fq)Klx?9nNxYj3&<);6oah`U-4n`tAuscZ}NHV$SbxoTE&n_ox7Pc z8!wa2naLbl^EmpVBTK2)f(nS|HL`78`x13mxddh4x|Khs*#6Sv1 zl8nKuwr}jKS-4dwB&mk?Szh;dKSyk)bYDRF0+Zz}9$`xm`5FNt;}>nmJ#J2i207?E zvH94Cblx?-UM%RzFno{4De-q7eFyT;bxH;CR)97~-~VrQ+%-7Nns~LqqV<`N)GYq;Jfjnk4t*swn9n8PpP2F)5q}7Yd%~g$ z@f^b0_$$K$hvHV;JMXevau8*w`AoE zNH;Il3x8)vPg1|#>MYAT-dyicdGS55(70PBx!~huOHAMT){g+lc28keisv9#?i9ts zJ;vG*5|z4d0PmdN6p3($%`dPG-%$?CMC}E{ME9(=D;O^eNK!=23gU0?<0bgrMC0`* z7fA+}0jcyJi&DhdHph*r(^ZxJ=7ZPSHWymar(E0d7#clQNNNHcgn9V7?bF4gJZ^kC z@GtsVj(UNBYuY7yHkz86$fDNs^vtS`UYhf(vZwF=mok)w+4ly@`*cF5?6#x@h~?KQ zeSt(1_Aet$Ghf`Ev)elea+mP@Er+W?c&b&!~C5_LyOjSMmLKKU}U>*2|jgKbT%Rj%@U+0W;OxGC@X5 zQ{wr|4qrEj{RP~|r&-ykqKNRkMq6<78s<&jdJ{fp)8y*lo454ZR9Sxo>d({FmC%mK zCiHKSRox9^GJCM?v(M_2fH5KP7yw*`2?uHEkKk}Ds zyT+46PJ`U^0!w4fp>A~ZI0wQz(fa$!C)S0p&GV&2b&RtF>!Xoq;2u(76J(mEisQ*0 zF7|kRL|SPthS5Ooe9b3k7_4{vY;*HbP)o6w6jr@Z zqWh7blsF^n5R5~LPYz#q))O+;5`i{8P1AzQY*mChkNRr(7RpGwCPRv)@x0d?8adv9A<>T$UY7#%I&kDMd#k9Av^8X5|sEZd> zc**78_KNk9)>B5~QywofnwC}&xhk_+Qt9efMsZ*+Q-UUN#cUebEI*7?$tqAHX%@t_#h?pypkn6*AxG7}LXq01s1?(WhGyYbBeuoBoDU$uVuy`_q!k`cE>1ehnT)2tbJ_-7nRSpz0o)s@;bcJNJc# z)BdW0TN7qDv@tVb{-}T_q!EQ1WPOuaywW6?+dWpzJ8nzE2i}C3mS1htk2Tb0@Qt;& z_h6p&42z?aqAoeMa~{qRf=bxo_9MKiqFbx&`t4->GM=$=1@c;Z&A1U0G}bx7;E=MV z)PT3xo&a`R9(F<`+F}xd^%_6bB&jVkYiHfeT1$s)ysp>e%~kgg(CjM_NNda+Q5gfD zA0g@_%3c|7`E$;BT<%*!htZ|yFRJx`j2OaWPL-gO~1KS0s~irG;S+ zFe_=f*oVuzVmk`=axtqqbsw7h01g3pN^I3@lr-7IilytwX{Zk|Ke;6gc~1~t&a{w! zQc^t!BceTn>aX%wGUN)!!S0%kl9h0ZIr)%IPao0y|5pweG<`?gGL0rYa4>zoJOeNh zl=^L9-`bM!)PueVx-e~ks0ONJ9T0n{#M7OIcNI!iCm*7;oYKxKbBFr0MI<<|t8>8| z48B`1rBHI5u+5PhCik2xrMe72{?k8;rebhkxMeGbJ0L?PD`81h3k-#<0wl@b`gx+Q z-kJ~{(*pj+C82O}=HNP1l@L?Gr-pt3e^onlY7m>R(U>Wj@OR!HGS$q?%dm1Aqj#01 zN0`)u=pU!-s*v^Q^u~WKHS9g+PM@IM#-i)Jye`BJJ6|a$ER+t-@G*mbt}{d%-!i6 z)I1)VCgE&`ld!2S-JT1wT75inW~wgeWtd4~09U?a8a)vdoW*B*inPV~b^>1mSJ)F* z)){}Nlq7U~$TPAYd&D8}w@5F3qonbG;I+&aY#DYfP2O2dS|LH4&5IRmQ^QcK&2kkV z^Nq!Pe?f52f@!-!&YW%jBIoUO%?^DC<+VLo1OZxAjNVGzZ^pMro%YkmI~(?R~cHD44#@r`l87lb7m!DDjv`b>XMqcwGc&kc+ zWVG9T_&b9jKuQwYXRI1KCsqRgYoPX_z+3fEHj%~Ax5AjtS&x%^h{>se{`-zw>Qd_k zp*Q(o5gTe5dgR^Jc~!6EDK##nC?`KR;M)yNJ^7mxT)j~ai?z>tny}KZgoq! zVRf1Git+^a`s(5re^QFzfk#4FiwJz%UQKIT8}Qj=(&B2~jdnu3oDVE}GL+y}R|(rj`3$=Ud#>9^Oe zr)d5L>U~50U1L{essC_gVvt2cIAoi{95whuSXN%~*=)gM zt|GX3%a_3gftC%Yw@qQw5~8mkwS3@d_`>7~j8dyRRegfgR^_^{0EW+tSa3&PU35z&su5Lon@>vkAZ|RE}4J)K~>9Hr^YGU`S2{77jAxVp z`(#Rn6HMrwh5Kh`5~r0<3`K(=wZOU=d_Wmu2-q|96K}=2EhV7nbY;~`a}@UJ9%8Oh zS}1kiRsc~l_bf=Ye}*jv*bj7Q*}G}*%}8&6pU;t=W9#MjC4>Elkr%O#R95iKI1W9@ zi{y^I0(T4R5-m6C&%dl?m1ZT!4CxHl@0UQ;#(vYW~T(MJ%cpEIaM2 zm-4=ekKO7Pl7U`&K!)R~vJ$&RT3Of0sV0F7M*8;rQ(Rx4e_WFsJ8SQd5gb9rlnVb$ zUiof!Uk-nZg<4F_P;}pLPc(dWGb}xRg;cs*^MeXe!m@`Sh}aL8tTEg+85?= zZ`0PCfo6PxKpm;WlULL)I_GL0eoBsfk)0WpI8kFlryo`K-Q0dzl)VM^u}2KE!<~EC zX2-HOXQ1vt_v^RN;7yuKq{sP@aOS$D7x?ekqbq|)v06n&A!^45ThArs-8?=|+ymBg zoUxP2MiHVvM~})wu4HS!DslPQ?wU*luc)4!{6ko{h0iQpgHW)Cd7|g!UjYAxI_k_o zU8a-Ofy|2pz7D>Fzv9+|^zG^W&Gorp4b%MWXE#dR5^G>Equ(5*BQaXj;G;1@43V|%_vAYBf1;H^j)Ip_0ywMxPRo?=~gD5qY=8c z)*h=W6Mb67Z}l6!L2NwyG4zh%eRkPYrpvOIB5UD>hO&ruetjc=5gckK8qbrm`Kv3e%$y=bgpun`#`n zum%es=SESzU6`PAb1z_~>imA(AoY>U;q_x=7kJtl>(u;|>ki!F@k<@B z?|p_SLsYJCU`Yfq^p{*B2;JT1DE%D3z^w45>){Kn2q$lE?_d9wfL2^wUR3lb9;kZ_ zxjjENXvLBV@dE0QN>MLp&5e+J(m+eK$c5k&f zfm4!|LGd=9e*uUdu_p0YL%v2#0SnS7~+ zJcf}|WB!2Y9kJ9&^M2k_N$?H9 z&hRD5u=sVf-xC=M>Hgi&ohupmE$GBl+x_SO-S5C=68;HETm_iwZE}oF=$6p)T{_bn zV;rzrl1BmM>9GgO?>=OZ`Ha~ruw+gkWucn4SpqVCcc{!IEiKAUyWemA?K?MkE2`NJ z4TK|;8Oey&mrIyXcwzww!{RO}r%{~X>>lts{w~OTZCiO+CSIkPGiQfMvRrxaol(3^ zxHatODcA}&_nbkm!Hdi2eSkO^@t(7*s;v+EfW-==LSbe&G{~s)GidsOkTms^`59V* zACQqq$eq?q$i>It_HU8;omTDlGrj*w_;53x$Xn&NJK+k?(JZibE_A5nIYqgXZ^;!= zAT^(Ypk>Lh_1wlI_7APbL~YTjlWFpvL!4v;IO}g*mQ+m5!{9b>W(%xIb2rw?tiGl;QULap`(-*Exlkddtc+Xs{5U9F1o z_$_qTGx!gSjQh0Bt-d2s<3+Rb2TwK;$ba)vHn^dioEKlxEk1Pg#}2Oh`Q3{o|43Ko z@0_uLdIXFC*Z4bxh85j6W{A<_6CIJIF)B-o7~iOjuZr1;)53a@Ll5IZ#N#qvo|m$j zX*&DMQG{N~+ChnaOo-AM78Me{6-?h%%{?Da_&xDnKgt6q{Glb}7rp&}ZpiMb>G6y3 zq!+>mvYW}N*ZZGv^$t5n#Zy@T=!o6EUIiF6V+tg94)BSC?^K-h^iO|(rP}AR9MblW z+Wckr%qJNC85%p0<-VlJn&TEL=qW#jx~y+uOEe5bd`*Ak*=o^2;AywY%p=_B5SCC7p(XAff~QI2%g^7ym#ZbmpKUdaBLz1uK~QXjgbZ5^M!ZeRNsz*!%D+ zph=YP=B8m0vMuO@_0i*$ln4d~+E28o?Qhh7P zeMROELJd@`=M*H{*(CI^k%y+WPuLr{EVA;}-5>20i$#k7%Nv%G6q0iS`T9Fz3>kfO zm2AzhLEMFUj-p0FN3drtUwm)IIVk*3WLZObrcBC-$2G?WU0|SlVYwL^ehD#K zowki%`HX8J@HytCB-vmAZdt9=)rD8*9Iz7$(2If_a=31Hv4*CdU+C_9P7Q=Y7bEu9 zRUvARy6rScZ{eu8&@DpC)Bg0tfh@!ZM~i~nlh1X%K3GHQ{m-Y`-O-E9nfzK37yRPW z6*1brJ~gobO_}H-e?4uJ$h?MyDwekZ>F4xFO{NDPB9*%YXx7F2N)?Cw%&~?e)QBcm ztCH_n(0@fL%y^(RtwCIV{suVH$N7SlJxaeogs- zSm1bqY{w4^-j8@myleEK;n+6*-hb!KUy$c$7mZL?S8eJ#lze+vJ0R1iZl6Ny!e-95 z#Pp~yq(=Gj&hJ}L;uXl8)N+O7@At2DDqe$9E5|}k&x2La9E4^*4Ldi>Wlx2E#i(BP z>QDQ*w>K{O!CCbEX8)x8hP9DA0@Ym&b!*?Yen9x^S6TY4EsM>+nr-5%x{JN7!!S7o zf0`dx`l_u~NdEKi?+zk`l8;#zn{}}j@tYRzRJbM@;`f{-wfdsVUYX7AW9@@f zy@gagb2juY%=p9fr(bNk6OSW8*Ynn5k*6o#B{EnKum9de$DU@#E`^=xt3A0zq8EC) zgdVN5U8Q^%q@k&pyD6=Cyk|9e&M>N@V%KW=;w7SCylCCZ#vEHP3PznzT!H26s3bWY`BA2sPL9#V)&bM8ZlJb1X~uG>y=@)QtA2;~%2F zYYKextAesC@bwHQ?1M!_U{BJChmE&gBhDKjK1}4O-u@pvZN^#G{)_915^fws@GaUQ?a#z(t}k z`X2~UUb=D-vI6_=*QN9Hb(Ls#8y!`guU+?{$BN;olM{-s;rhVmC zGru{|w^(m+(O&|=O7`!eaZ5?oNL)sAV#+(259jWdij=aL5yO3Yi#k?My-;)e3j6+p zz)9T%q1}=`7f1Euy@7(a_f%A4fo~3sXc=MUPfum_^fZ5wi{B4Wzfw z%>Rf6UN@P%YE=^SALCoa&uORj!C-KKJZ<*Q!LoR)EoXMc*Wz`cP%- z8_`e11`O$v7|s^KOv_*YmOrIlliH+B*$7F+lqeW5TK!c9_BvvF)!NQaHVs@!poI0cYpL}WEQ!XAP@KB+F zb`UHaF9wBo)d&V4U38**rpu)g-9d0BT71!&KK^TcyAc9-eAWk;?cxQE$(!BgQxQ7E zYuZ^&=c)v{=cmtf-6NOl{YtqAc^fw9;8t^s(O~{iuL|B_kVN{dY=EA2Tb=E$%?Z2n zSiVcR5=6c5UOM#5aP0lVUt)XS67*q3i8!k9rLd#pjP!>r#K(@&B=Yy>-FXRcF(+-1 zeZ5>?we6!&lC0y&_JOcb<2xbnruppDTC#}<`2j#s#+g6AQIr2PCbk#n=MV5yQ2EG7 zh-Er;fYIv(=kcjcXUB<8*52z&9PT1N;0ABJW*K9Y4VYnNe`$~xL!-8PLZ1*6&xig4ZY@cj%tp@mc#~VxRw?jaKEfAqwa&hmXAKL>^@@kNm={~!=>>-_X z{Vj{d@6WIMvj}et&?WlvS4KEPsxR%ho4$lnmXInD^+ckFg!-SVFQ)ETLBSbq=Xy>71Upnr+AMWdo)p z{TLI~?#)>V5=QUN3@hC)${!<==uM)ZYX2!TAc1VoiYmX<{kS8K#s7;j(|?sOy@eBg z{+y$>Fm9iV)el5m=BOxF@nB6auQ^tiL+FFb^WsPv=GH`slQ7qCWQ@F z*CDrkRGpQMS=AK2tC%SIEwpiv!Gjxl4l;0Wg#FV;=DG(RH8av(zTKtru=!@eK)Fr; zJzx;UKMyeQ0#v`O(2qIi|9Ea?IP=`6!S0C{C5I%GAdlLsi&;m;93uKm2&M@jY?c&q zx~oQeIqzoJ#MDsIkOT~`E%=X^h4J~Rmv}8ep>qcZp;v5}NvkOkwnrOKqs%-8>k#oN z#4*>3ypgZ9iO3c3#9nHYl;Q=Kqn#y0R|&Xe_dJ^;q7^ckaB?D8mXXbg^$uH4`O=#K z{~5|?<1?*wu^1bLz4L=B@)Fbsp?HXb)tD7_WH^FX^cX&6+ZnU1Ub)RT4-g*M_<`ON zB2iPMBuRZFh7|=)ZIA$6H!IpMR7#h4KbD>@}a`Q;QRIj%vm?#KKqm5QglvT1G~B zpFIViinoQryB@_s6JoH@1??@)MJJxkiFRT#A%&|RiZCmNsV<~ei%!`U%$s?ZHA9DQ zefVml<7MEYLwJ!CB>X;IFPr@rhrkt+VZut7NxpDn#xNv7V%}K7DUAEZ_~Bn(&y7;% z;D7QBCPBpAU(biLWZq;+g=YUI@GT!7q(+u8kA0_WNcif|`&*e)>l3@=IYnY0cAG_l zvd^^~tgK#F3mCGIaZL)>lk*k-BylMfdl0nU35^%1W8u1YM}GFJC@9B^Dj6HZ?_xKF zdD5yMD-m(Sl_+$%zav9So=>2#ljtu@t6pm2>z*iAD`~!l|BRQ4#hVPh*Jo~h_^okG zF`*ucfnLN&E#kI2s-28Qp2xpVO|~)G7@G}O;co*=#nUNV;vdys!ckHrRO*RXnK0Pl z3_i}&wVW;fJak6MlS_X7uB`d!L1unA#OhgKiS-k=oAW>Gi`Em*2Yv!udXPgq#fu#Q zV_pX|o>|S{Kg)#m^|%!r56`wICr@|VOZHcZM(x0Aju3AJFxVZGpL7`q{8S8aNVA3V z9DqkE@#2X*k;IAC`4nDt|IC(OdEh%y4u)B&z+6*ex(1=&C_^+WA`9ue44=@o!FTk; zc@ub>B79GQ^ycX%vr~Gla#zw^_bn;Y{=z2doDPF#Y?N&z>$PafMX;6t*BDE{{6q1E zL&U#6ei#k>BB$NQbQR5^^@s8uS?jR9_Ad`6M3T8gb<#qTt|fqetJHi@Q3N4yib}PZ zZi7?{jFlu!T|cme;R>Pykp+_4&+J$5ZmbolDLJK|X2&VHva{W4DoXRt%=p5M*dWvj)PvEO@xqJ zX10SpAe0P`tn(#(Q}s9P-nWA`?liDnNhTD`EL|H=c-4EAGLwp+jx3P(r167<3|Y?b zdZv$#(^#?1?0(b^H6!3PhlAI?^q=(KLV9}Urg!feTKc$*e59)l6_!?^$r6^B-a8WS z?}8=>uneK;ORlt+T0eIbDFEkKTm%nHWxdUH^=8Q>)pY4GCmfp<-@LJc9$Se;ZCxBJ z(c)GP>5DPW40U`PFd0;qNdU=1x3WcBZS^4MCsdMvGB%|B1naF*BOha*dAV)l2G77VI*Z;km7fB=E zdTBa8&m(SvRj6>IST>*c=E9ABYh)=)?JkO!*!py76-(tPT4zk@9LLdeCv6`l-uuy} zNXn=Sa5fodJdd%xIrK+BV!5jZ#6GO_Q!$;0$3#6<@clDiYs4|V+W|SK3~c4{4gSe?oRF*FiU4#7 zTno0WK8UoSj$4Q zD+E!Z6|e^nh{a6fH+^L*AF?L*_7b$hHcrPvAsG2V2Pl%i0FQQNQFScHr`s=#GgiIA zJXX?%=j+U}=B7goul_u&G`2sv-Y|_cvS|W$wHKT3DElydS2%{_G^Q|;Rw7Y{T_q^i z6gaz!+xXB2qyD3f1-34{U}bY6e|83+;nWI1`w^_i*2jB(^=fxDx4gXh4WQh*kz=at z_o~e1mvMe5;BEH9HzCw`1#=PA1?cmA#tqB?UxUx=X>>Q1ao)x4_HE;vi+vv5DIihY ziWqIT2dx90j%Rs6#lH~N(o{r@b!5ykHa{i3=HD9jyIsN{)RcH6?L@o(m8I!uC9_cY z(L#%$VFDDVHr@eHwcz4L%6{Q1}js=IlRt7xh zS-v6*#WqLP@Tat)sVrea!N=a@X|-iNHP2}8RU^r0<9#l#|3lGPxHa9jVR!)}Ho8U( zMhGZKcMp(INfl6ujaCsU>DUq6Pfqz=-LAAJUW zmgtKZU&zKkWzqwD8NqZPAM6uNpQt-Mu1)-QCGw$H-t2~jfs!@9b-0z7=mNVkJktlV zc;@2ToD{jE+!*e_@8jv2Aa-R7F-)^AggVlP4KUS`ciAK+bCme6->(%d35u)a3v-44 zsp+a4h5v~@hUz-ecPFw;oQuw!SS7txwW z+|{p=lK)91=v}+DI6kf+3Ag+*+7Xh}#yfaoC}7|v=`Wl0)Z9JGt+jM@%V%lP)nHN~ zcIDlVQPHN#EGxwArh8K0`2@*6q{N;U&)gmsdH4(<~xFwC1rjhxDEd+}ve5}rt0 z-tZHe>H$2l=j8zi-}>H53|4jpiBcE>W|(Q`avvw9jL}3-awaY>9?JK!eme&;*Oc(k>zMQ8Bp3N>7n7$+egSe6LQ!%KK;M$FFt1)XkfS ziQ&*rw9-j*9^YqHRKq_UdKWJ|R{*BYFul7usCb>)bz329aUvC!Uy%4u0lUjKJv(2yaF zw76|P==Ql6Jjm|{3<^Xq84Ew^dAG1S`UTeeJZ`<)Pz^A8>JM*<%T}3c44l(nOfs#- zEn5VR!gsPWl#h)%IjoSn$mLo@`*dAwXO;{d_39D7ssroe_QykX1qb_0$NW@E#v4}* zeXzwjM;MGJ!$BkLOaR|dEoWpIsnzi`KC7s=0`?ZaT&uCiuflZlPi8OqilkWP7SG&; z^F@Z8DT5Nagl{=Y)GL0Rc_cZsB-%(|R1OUh11f4itLA@wQ9MHwR&Wr{RP(92Ju_s? z8WR`zl1~jQ_tSs{DKxEgtrjBkm&#%yT#Dh#uU+ z<3MnerJ)b!J|VP2lK9-;p!Kw;I>}%}EDd)DP#fCQ(~*vH#Pa#No9oUndOIRGudc*| zFY|YN$(*Epfsz`oG39<;(;I8y9~ZInEH=rqSVrGM>$C$PDxB)PalrtVhHbj z56fK>LRch-_GWBc11GlvU`GIrYlYBsKkTt#z_ywh1o=qD+)=G zJ1>%_htvt9m{pD`j`uLqPia9ucgo_ByqVF#-*Ok2JRzhbpyu3@oyR2o(}T=xUO~|J z0(lXAw1kt1PSe!1X*Te??pzZkYqW@KoG3J%Quj*KOVBl-v16L&rw>#=nCW{4BjwaV zA)QdO4OO6-N*)IW&a4@T)9ji%F$ad@i07&nMSkaWhlUXBMC3`vw5k7M(F@h|A`+rE zi^-W{5TC6i;bY*zu;qTK6t^GSX^_Bwt&Uw5#Kbz)iqh5f-2TW0d-13U?Y&ilYz)0J zv3bomA0{~GAr{cactoJ*!fi3rsvg;NQ<&#Ws5Cu8RA$Te^E{_km^0pjRJCWn0rme$(yxH($ho!uuucP`ok zf^KT~pb(4sKI{dfLMF4M!cn|2=O9g!f*gjLt+V4?Haa7=pdgh-G3pfLy3nWuqDFYb z5WJ|^Kjl`^zowNqt_l+#13nKV_t2PMu+{+o&jojU$t5n8Ls`eX!YknfwW&w7XA+fe zK^R`An1rCe(BcTLkkyIr8zS~nP;aV5nd;@uq%5l=5mIo_0WHRQI76W<4GlMxeK9&M|4=jh?6YucP5}ShGMDT!ChFr{| zdLdd5GgwV0m67`m8s>tj^?P$%mLjQ!3@%mriM3vSzh4lF?6tGjmWrG9rK#8XbeSOM zgZJwXX}*wYA4-NZh3-eW75gzpPy!u-Vsp63%g{D53LDX@1 zZRw3c+t3Ua=`I zf5zlQOmgQ-W4c4UbSVYCdcamB+a0X0aCD1fF@#%OdrgEs${(WhFN>*1c4l)ltA(lV z8=s@p=2Vk7U+w6jJWIxIrd50zPlx66!ofczz>@mc<2{zp=j>%w;KoY!sF!@T+k6s` z``TE^`26ZLc{}mXMg3gN-XZd4X*n+vful6aJFVGo4OTy>?;X0aVX&0Y`Sd#EJ}y(g zML8*uu%FFwNIz=natE<($)Yd1?wM=am@JhC*2o2{WPbEu>a2x0a3fttz;>x`m?eS} zfu$*wZ-xK<{kxeeK1VMeb8fw^!a}V_T$l|h3+Ie%ts1wfSEEMJYEWB{OcdQVq(I#@ zp-zTp`VXpuxcaSzuth#V+IL2YA$o*f%ERr9?76;)_kD>fV2?cIwzZ0!rMKKOw3?fn zN$?RnffVg%gMGGILU(X&ckTi%EJg#XxKECkwLA37Zou*gP=Y~}Ij<#0%iuTaqlY(MPQ6S#)$jb9zd5eTn$aHzY=UW zn}7WLJch&nCFc>MwN?7Xq?pEG>c?NPYN%!!P?BIp+0@m)A^LR6z?ty<8%~SAkIrf3 zoR8PkVL+}|^(koz_;AGa1iGp0ZHb?vQ=oNx4d0>_O?w1fvk0E*Eqx(vtM={&>4X-3 zQa(9g%HL3RZ~eBher(nJH%?E+&zAoCrTK0B&B=GMElYwW7YJ>79Cm%X^?Wf8lp-~- z^@&UR1N{PzZ`fhr7vK7R-#DAcKnwvxWok8gz*}U+$M$SfEey+4TXM={|5R%TmGwTw z*E8t2+`elnh*Oa0#ymm~)0$r_mvA@e(^U{|QLfa|FUC1e@!5m^EZN5{svtwOvg~oB z71HMd*02S5O~lpv9QYh^(-69e(?I5(vk`*~DraFaBpMt1;qOht#6t3q!j?Z*A?yjm zQ8Z2n3!0Onj+d}puFu4yCg@wDzso&EvuyZx@b?K)2HUw^wf8_0QkNKqtLd~%yjQys z8b4S%-K4<606j6mOXq9K_r6cs@dBmP{e>9lwC;m~ZtHGU%OM|3$)p_>!P8!3g8BYf z2k-DNF48?Mav?m6ES#)9f;S*PI)p>7Sj5EYB^00et$g6ZGzFtnxNuHS>wlgl-c5K- zl6Q`y4sWL>EnlN`x&0rkxdgBk$ThyTMK>lPCJD0RxW8HAK14gvm0&1#{<&{}yP{w3 z&sx5uT`7SL_N=3^7xIM2NJ^2p0vI(@CZr4%FvCa$V1C}$@!;<}qX5`qX_w!RJuxp; z$p$A?-uMNV7|=Sp&A;qVh)_CN#2^r3s>QVJr_@Y8v7P?tNKg;hZWhjvfuCmSV1sbf zmteRWiO10>{3PK@3jxT&>nU0A+VQrH=*u4vd1(+L9eiH`FO=woEdf6C|8M!rB+aUP zS-u7RXlHxFNXv@M)%Is1Ymcq|LGs|5*L0i;zU`l&L^M}`yOcY?j{mp*K?c!ibQ(Lb z3H;Yl2L?&2VFcazKKLwF=c0sIH}-*H0p=~xx*6A7JsHE0`8{R^4g<14vbD(c zH`%m)Tu5@5#9Zw8ntlPUR%kN*n{>n$nIJiKb7M_(3d`F&rC8xh!t76+CbpUC&c0v+ zeBPo+1til*yAnpvvhmL_S#LL1S-LewPnx};1})Mky2pxk@N4Jgkr@51*r_fLgyJ)n zOjy^{MMR^TR2aw^!R(0tRKR}+3(cUaY4CziLNy0ca)UXS4r8qgMIRYZbMWv7=q!_Q z#clR_GVHDsR3NaPSjyJ*F*ri>@pj>nH{?Gg*|!4vpmF*>%KUrluqBsNF8t` z@D6Gj2FVkk%m~nw{q+rtT!!QTA|i_T4da^0bwSmp)IN~lG}C&XHNilaUQRTS(vC5x zx^zr?D33&YUijfieSDFS>_s)dB2;mmq#eaE->%kG#;skNbv1ov+!8*k9yyb% zXWA{^!&X@oLikocb4wk2l}*79pbpXrKc)AoZMWo`Lc4hap3xKiYdihO-$2CK!@tJK z+D`<6<>lp|sM)y1RPl|~EqaSHF?nMnHNM-Esry;<II0-*A5t}&y zI^+qvAg;N0Qaw#g$^WL{aRhe!c9Hj!6Ic@ zl@$uxbEI2oTXq=%6=4%CycEhYiq#0h7Ud)gmLs@Wb-j{+&Tm>)$XpQLsnd3sm?ydF z0l7{L#U)kA;UW?lDPP^s5DDMzWg!{}Oq1>OS+nuM7F8U0^Gs^v-Se8xdb*-}{lRSAiCIVWl-uQw=HN%5f*Riz00-V^$F&}bIaz(tm)sD z)17D1$64#+V8kb~fh2NXBE9F4z5zuzd|U2dC+IXbo(qksRZdbJ(nD)A5l@g~ruOG;e# z1{iB|cn(!W0;GJ#b3RljNUbEfXGv_C8*4Ar#nSdS9-Rx~Yj#ExOhE0u{PgtNXM4oi z(f;F`#3EHP2xA@zXJ+(0EI!BHL(XHge`}c4(^un5uQ##{~vNl@u{L6HY z7x!?KoZs4r&}>EOWNOrcbBKF42wMxJ|~&1~d~^Oi=g1RSijZ=G%50 z5_pxTKm>7c^*8#wUWKHCpqFOTcbZcy^nDES&9A0m4zH3=)1+6OYBleKuie2QLFm!b z?;n@qUgo57H3Et#|Ii9ylo_zV1n_#5g1g80FKi^6!n;*Y%A2@H`bhBIQ6&!3@pE%? zV4{5LXH_H6f^w(>zQ8_k&j4bJI_yLel4v3vIdG{dI=0Wu|CT2JksNi(KX;SUF~{Tp zLhz^QV61l959%|zJJm5)Qewg$pYjXq#W`LCUczT*lH+$n4O|Tklg|F1UK6Q%^%xUA zfeL9O{j_e&-y_0)wp;!JmOM8yF@9-9cYez7kMEP{k2RG~?=QK02q7D=&>!?h_jJ?T)cNQ&b1*k#&5fWUIoouA=ojx0TLF#8)gJE1N+qQesIg~S=f=vS`pd!dScc{3#OUh%Niv* zJ;WFDR^P4+;QHr$Kgw9QET9f2`cQOku$3>1Ws?T^hDkl{3m%_$a__q5Im#J(lw~!6 zzi4t>mX4<^h?X8=1`PcJOYmE)w3~r)S{+u6MgB7oe&NymwSHp;Y<3%6#>)Tc%0F?? zIvu3sP3*%OP6124!QjKDX#PBfoIlUIbkVKYHE?BqV_d~s0HPE+aFEz3j;2UOwnn}_yMKzFs!n=L zDQcxcrqHf9AaL_mCo*4zmz6-&2tpihn#v4`|6F8aGZq@c>dDK>;KRxR zT;kv;z(~d=%9KXm%-YQ{O90PL8#N`^HEiyCyj|Rrh{A_wTQ6W-xcIWqD(GT}w^^H@e{a&NULSyP{lgHJ z*x0C|53UXa(V)SVJeiOQMXa4ln`C(QDZ_nPS8Z$QPY*Qh&XFSjrG4Z`u3)-r#9hX4 zSPN1Ryc0H4!!_Jj{6v~NMDa9H!qa4`GWoo(g7$~oX>Ez(b;x|lO5#sWPONv@AfT+wc+f>s-NXeo-hfEay1ff?dER8>=9^1;6~4=I z#*BDg9Wfb@g=2DRs`5!oBX4=@`xnF#Ia*Kr5A0ZXR!**0o@R(*f+hi_X8i&*bWfb< z)J}Xh-$t1&7R2t`wDEdBefm^kszBp>o9}pyk3#qG4)=Vu4NW^hKwYI8T<`%bD{Zje zb_|WF(eGvQ}2O075fYTbb7MLTEsYjAN4VnL0Qkm{?Qv?>S$|B_ex zO7rERa!3lQ-8G#qJFld~nbpGsFZr3S-B@`j457qAsd2&sGfAf7x*| zMu8~CG8RMUtO=UzN>y3;#;o%uJCTj5ex4eYeY9XDvU#-mEfQ!$CA2=3A`@Xv|abl^=tJmCW*{vhHr7VyejD* z&(zucZa{aib*LPvv^UE~p5coYCcCq(FnUv*ND8me_h~i1H1Mq2f;AA(<9C~Srl=E1 z&tx?BA0Ot3yxP>BvD-CoL1lFgQZ1Xfoq^d4S#nOs|5zpWTuT+7^k%xQ|EVS&KJca( z{2*e3_4qR~=B$4sMV5DD{Uoty1^^WdYN>D010PA~l*&9zy8Ot%)EIx1MrZXOiPxV_ zGR7#va;h&INrP>LQlZe8l=7N_=H@cWy4GH3>Yc(NuWf6ATxahUVLhN0_R z2|L4Wn{Xa}&g3AB)->NAl1gapdm9x%@uy_P9VFm*f?m^C2R_#4n7v!C<}Ow;e>}zF zZp6U0vv`l%oLY-?ebvL`9SCjcV(2xMK4j2bJu7V=W5IQ`rb+k|gICWyNHwMG!?2f@ zm7V^vgYRD@<>b&1RN||WbNo`2aHps6MyR~BFs58z^jQe8g%2v|R}9urWq7eHeh+j& zF*ciVTbQF08HS~J=TWan>Q4Q1BHO%u_b$n}@!o%up|KE_#x(WtSEd6p&mC3zJAPmoIw&SX%yC8tUG^eT%1Y*@Wlu{tudv=qg9>zcU<| z0gj%>?GoNG-1c62M#e_^>u-H+A~`Pb4y>6i|=)hZ(zUiAX5n9wE}fw`Z3NX}^qF35TXy5ngm`TN0u8{D@w zoK_!bmhkWOyeFD+$pE7_=tL5zc`5D8iSJzqPf;eV-89xydmRG};spG%ff8Q15kJZq z=>>aU@Kcuw?Yf-7^niN*wxf(ko6K7*{oj7=R?>$I+RB>WjNVM9%z$38clcN$kLHMo zf4oOrz1gGI59K=ELiG2aobv4}-gFdttLZ&IT@J$wuxl{053in62Dp`j?CBR-FJz6i zmgFID`Y}kBC*NO4#iox0K?1Y%)YWtS*hT5Xq92QceY%d9UI+S3tkVE@kUC$`Ws)Gp z=^1I~Wba(CVh`76?4k<2A$=OkAD3MI2~0z1SDon}hv#Q!fK4VYz@C5~C!8yaX-QbF zwS=Cs$t>)zj-|b19kTgU_C{Swoh+v}*GM1sOxdit`VFkSnxJi-eL=e^!e;QvK>o*v z_q?!Oz(p-+7HZJJ@A;GB`02CwZBN&v-STPYx5V&0ZU~F0C&ZbR7jo?ic}AFGtgvXQ zN8z9>YO}P0_>6GDW2B69$ZeCp(=tL0*LZ~&3DIgx4L&)OT7L=&6)zazF;~&q6F7bA zVSRvGQjdh@nVBCG5LZ)Kbp+X4*x{@kCRfh?_{}u4dP1?gKZ?z1OY3>wm~ZjbKr=j7SP#bbXyWzb~7+51s4| z^5%qh7V)qRV}A9SeGQ-sj=8+T952E>QEs@n=Hdf=!;kLKi8)IX@RiTbm^fxEG%yra ziQdofgU?!TZ_z&IeJRgF?$vK(40ZzUQXvCh_UCCJ)M=}hZIbqWLj!hJa~Y}Kaqfec z1-Nd4V z<5=SmyNm%c6=|T=9|pyp*w1eMpZ{L`k&veH-hQ<Rc0R# z5t3cqm2clhe*8E|N}kj==u3Nj%5*mlI{LNydb?$`9pR1|Xes%g{j^p#y~~d4=tI** z=>W%hoTP=VSoOXP%0u2~lTl7}&@!P<_MG1VyUXakwf{}Kb55tsBlg_kk)7BPoVq4= zcI~^lz7p8mw~i^nlEM^Bc<{}Z&)I{Z4zL2fv=}H|;fAD#_}K=>$V?RV7_jL(8;#Ii z+A@}^=$3m?o3cWHZpAyYF~0KWrxW;sL!6#0(@Ru3WUVhiED5EK3`{Sqjb6Bmdw!yS zEp?lt;KTzihP`x#d}$eez^c?H136i6qezk8L*Q)&r&_4%;W?UU7{+nriprMdUk4-_E@2=$4aucuiYrvm&z zAEXOUt~gsSyp(D~N*Wxv(^K289vCYexx!>~S{G9l!|3Dq>s(G*o8{p(*|LMy+{)~w zruxdz(hNRQcn@*51f|l;L5a(V)lmU!C@`f*R^(K7W{8qF*=cI4;}pN0X=&Xv{zGp8 zs*N%M1xBGzHL36*{^cpNdiM96FiYru3M{q~l+xfA5f(XeRouEIc z9WD@5u0X9K@%;NlbD2mcvEZ)X7Z*`ww%wlH*N6E0zN|W=fN2VR!vCwEl6F%|O`z5g zQLBZxD@8Y&tr(Z#-^luPUtCja-)&*19Nx|#O;If!9MA>l89=V$JtJTPq?Ijudz zH7cP{7o-z*d~HLKzPvcngQSIIy_6P{UDDnDv5eoq6s4@7q$>2R=N$*mfn5RkGxX6(G~0^R@oLjhqC2W(f4~f4&6CZp2lgoN_7ws z(_SHrk841=x9c;`!O5ct)XM#RrG%TFvV9VT(zr+)&VU}6gk>inwj>#@q3QO5F`+DQ zOh)xw88xsSw|755#OxktZVW1?qqP4bd|0aU;?rqzw)hm#XQSv)pB=nTH1A;%R8u%P zNp{#>=!;V!$4i~!wCaiCY3DPV7Px=rFEY+PH|vY>N0G$}O??ejIdyFLxqoS7 zY@>vY2TPO$*Pj0KND89YKFUwdj^^?uL>#t6pY{QS3q1%Rfa=qGenXPp$P@|ypjeqG z@AERj1-C1v!DfRY<=}b&DjWsGT z#nP_Gp#FZO$3N{BPiRSqg#4dE+h)FRvz|g{aaP04tF!`zb#8#ngd`Rpqrn|-wzHhD zawAE{QGOGr(5nl?aM(Lp7nU(|fPmls*U#XU4AY%g8!`iU#W9Y2`is#1kVmn>E3VM} zzyB3XwHvm(`UOXt3+{Qx)-_BtN48NW85;y|7(2#JlMnCu?W!eYH5sCsa%;ZdWuM26 z$ev$JJ;h=HL?GeSQD{9WUj%IU8NN?%bKc%50+u46Q}Nc4quC>G$(~rr4wq;wHCgtI zGjv@Oe1udUm{Y77C9Tqnl96lIrmFudWVQaUAV;MdR4nr*3+wUK9BUCn3n^4aCI zDXlhk?Jl?>$EmFVczWg%x#pD|x3dl>{GBV&jet`+!d*-m?8FN%T~g>oxyEE5z^NgB z;}sQ%GwV*;2>OZQb7*$UId!=0N01gs_s5F5LO_i*-?ZlHn8d?!KG*h$%=K5mLedy zM4OiWp(04s8MY|<4f!(d5=^-fcEqyYG6lPT3jRzgjQutb4(E zN$sob6Vwghs)|_I<{esYw9{D|`)Gi>E;W}r-m38(d8zY3TcHfBRQEvKtGhA+_F0dt z32zE_bi?+=#9-Iyx}-=L0yCzo11BEbpsqyN|^npBbL=w`En)C zzTh6yD`9AQq!ydDj8t$BmxFs-oEM5S7tr~2eOM3m9V!W-uA%EaDE>u7_7e)&UIR*; zpS9c_5*PIp`aCY%dUlBv--s4g3IhP42>ZE_vW$*YC9 zgr$UyAQ?m?oPS>+NC}m$u6VkcbZUD)Er?%HT98^wtE#O~`BMbg+S+<+XRwPK?6@H8 z0#ZiFaFo3+tJb+KnHBpV~47f){^qHFnNBNWT_R(Nkh1NtgT#b;HGCDcgFqv zxeKLT->*HFlX^=ZRW2Uc#VlOZDU^$|VyXP*>=Qnf(;6yCi?rq8K0Hwj(I-6WjN34O zA(lTl)J9Vm?#;%cF2Pezhtsni)aD zNIi{78$m}(f4ffL{zWS6ZRcDG7=<%Ir(0^ ziv21IRd!&KeIL2EC)n1UUNgd8CU9qZxCrSxRGp^qGR=A5Nu29s>v`Ufa3&i$ZdD)0 zq}j9RsN?ShtR$Ol1v241LvWgT#w!VGg@=^2Oti0e*U_QW`*TcAE7F3Xl%5v=yV+26 z2c{XTCHuTa{4FXy)`|2x@QPk9tP^Cdne>qTQ{~5;(s#_q-x$bEk#0Hc`<%E=jCTC~ z%l|)Cb9x(${7rq>1E~&aQX8^UqBa>q7?VfFS%UQI=;6dB95df#!%flD3|6CzRH!5D z4=<1jX=P0kI4!|~O(GqWAa`s9mXN~hsXefgzqh1WulR%|z>Vx5jwRo??V>p6&Q5iT zygaOk{!IKJOdS8+{FYydnpAU%^Nt$Pe^dGTWHi68Nbh(7Im8#V{x@=yH4p`5(KKg*#8znO%@QSlrU*-^*1Urw+Vtzipfk%O^~d zJ}}>A>EK6~_hEU23|BypKH_0Syj?hcOS%H_;pNNrtYVmEu|Uwtw)j+0)FQsckQ6~O z(B49=8c}V2EoL*@f-iBQO$}O28gm7QbX^Iv!kGOpw6euFh9MyeVynzoM3UlG852H7 zpdQZc8$0&{wc+N5CI+8#djM8Jl4YCmktzr_(n9Ngy%fsyPyB07Ob^;drR@; z#PWa~lckGHi~gcoX>cnWQWt_vRUYTM#IF#{B(}~Av7q9DgV`O}!Hrx3o_ve6FQteE zoRTRqs|s_av`r(a=C=q++r7T%I|jmwhpEGpz+D99F{0Upd1ZfFn=rvtf6rI2Lvd<6 zKl=GghllfXQyBIw<2ycBl{vrV!OIClnKqeAs*GPe>WNzl9iP4=HEoRVh?+VCg4YY3 zV~%)j{^g~|pI|uh=n1%MPm2P)QyppbU|DG}p#+TBq#kvA$g0>NBl$S3C9`C;c@>RY?@m5_Y;)Qg7DtWOQu?E@JSMZ&~8EEh6 ztk09_-oN1&xa?|Fe9|@VY#VZ<)PJz{K}6q%ujw4Sx7xqXVzLK4`Ulo8O-(_~(7*|* ztG`L@f9eJgFH!Tvk3iavT%`KWiUeL$OV!{~wsV9#eu6(wUZzKPHO9vq1fJ}?l!wKli?05m<|cNc1T zMY@RhxC>2RPt(`h5^J|qMiKH~8^VZB)B#3Erc7`SQB zjYaiT#~daF!8G3fmon(Ddh3d89^i7_{51Z0=l02Q?*@m4{mHTvZkAU2uzmKu3htXQ zlu8M{=+h@y!Cn^%&~0Xn6Y;?@)+M7i5FKWffM2`GuPhBy4XrYcNw9x6n36V>9Pdmp z{<**=@TsfD1{UV{kD#JIF?OX-^%1S?RVt2lQ^5Eio$rf4c9xS3_5pYyU=tMHX~Jvt zFGSP|B;Fu2sVb}BLF9_)*FBl#axYw-k?IWP+xjgi6q&>o7#(@^g9Orkk`KK1hWeAW zdVr&Oo6i#(w8cB>>sYOx^^!%!PcLlCsJ8piy8g`C*f1jL*_Y_#r0c!FIb%Eb1xS_RJ${RN;Y^_>?)C#*)0qd4$swSRv6V;;t!8NSiecM6YAV`=Bsx_-We270!xs;LNAm%^hq z4gG)kd-F)wwZ`0#{c$_9NgL7om_Xz(TVuPQH_)P;btr?5#f_DqH7tPRAYHC3s6RI6}B)X_9#yH z@1kcdklx4i1vZj&eXepkX3~E}5C13CX74SFCasRp!5c&Kkh?4h>pso>S@I3gXmsO` z@iP=3qj@?l&m(VU^=n?+@8bozw@p06abVg5MVNOiQ`m21&3B+7r&sA8$ECY}8`;|{ zD-SG#0xp$rGI;mwh>83*qyJEFN3_Y?AV-)Q`~mX`6a-UQlta^sOe>GEsF3xxjK(+w z_{XP zhDct}r&d`r`%fz`wE27`eTL-KuC)j?v=I}gA-$}$;L(lbbo@hBAdFVJMwsXWt}`a+ zJ9Vz6fh{!LK5diYZf=aH1P3R%9THd1t^|uWYOYVTwC81A+2=B2xt_+|iVr>#dqF?* zO4bJ{3OqkGEkZfl*pTDIy*K4$T?{RQ@<`a0S=hWzR5`LDhXntb_|deZzf&_47x`1TQtj^^U0 zHvsUWLi72?v&&hyj}zlo))lTmIl1NiMAC;btlgwu+tDTp%hV4f?rmo%7hSvL~0JVUy7mS`1u(M4(@4C*^e$|^2^z+~9Nc=_8^;chX4hX(N1<4@_$LUffr#(vG!QsjW5Qt$Q*W!mtja;~DqP z`H+a6{aaz2@s2d(waPmnhI5R1+O1k??rbf<@C+Kd-gTC8epA=eH#p%|f(v}Y2PONK z!QyGWPG{7UxW$ZJX=hgtNgcT-+-$ew4)@jPYU@Q>*Az&zP&Hh_BSlsR78!iL8m{i5 zh7EheY@DAe)1$dwZv)HwE$w-XrWQ#$!YD*-|Qo-jEr*V&|jtCFS zmQnl8`mqqiJ3ogi+L;4d+~kTFQXYuAR5xDc7g74}wJ-h4%!bN7POq_cD>lFz4r={U zt4LP$LmJgUIP55CRoMP6Lj7FmuqN&avaB27>FXxaGJHZ3KrO`FRGJUO7H9M)sQx+F zTdJJY?an%B@O1~o`wMw=ECsg;%WyfEXHfB1UTA-&9P%!R$ ziA{!W{KV^|K%&qbC@aiZh#_iY}qzhU;xHoFcY(Pp7N+|_;^KjYUGZpI)c#$IET zO?e&_xpgo{kqXD0q~Em(L5Z?iSBxaV%V0bHZU?`xcQ8ZtMwi5*ft|ps(A)}SUR?W$ zuEO93lo6BkHG<*W4Jt3OYCJ7!-_F*NuA^r^k6}wDm04k@Pin0tW)l7~lt9W!{h zGw+(Btma`F#+K8)G&Y}k{yuWFQ5i;zfbO^}2x_G6x4J6W(XV9y?Ck7?quTT6?G!O?rj@o!yB{BQ4O1QiCReBcCo*F5JBb+=CWDg@@z?p(Ru#I8MUFcZqf zZ7YB(IiSx^r3Dw1c!H|<-^Rv|X9FF{gPau^FDpD(En@H0UpC3a71`%u{=5l<)wiEP z2Y!Ao7qRvV&+0(fFYttYL3o#oNh7{SpB4avs`R#WH;M69#v~TfgEq|x535&*JWPn0W~gKG--&-j9e|KqQmc?qLF0xP_Un_~HCb}p z-UINU9$`6_xV6gJ8MN2I9=>@t5|!?5EuNQmD~meDa5s`6<-5fTHAO7%MydQ5_#gQ4 z)(6-CNumAMuT0?Ebl}rqgR`gEDCyhV4#lF^&zQj90ADTfTTB)Qu7T<`;{?Po0eFiV zcgGj9^pBBtT_K?E&N-2Ykqo0uX+PvgLyWZQsTpa;`g^QzM8alZYTh(&TNk~|hy+is z;wQ5nkD2!`viL5G<%YH5a@5Jck={xSDokk=!cQlsnx>-BzZhfiQn4^qEK!Ikc5|+28SgRfp8DM@>X-4?8c>XGPAV&KI z6^DOA{yQ(_eYnWaY(9BI`@z&v&}Gs6m$(5tWpT-_3T9qHbKUMuzlWVCwqpgON`v%u>cL|298fTHTYcPftjAtnF>GoYn*J zPJsK&MYAaU1J2yM2wsf6IC5R@Rgn5dzo7gk)O3GXnBz8#ZAbe@LxOO`c=Ua=Z#rztJ@g1tBhKb2@8im*xsK~3jtiz&B&5?HgMikJ@t+@OS=AYSVVm=& zChIB0xL$*9d=sX|=?!#p_ykl(XwOKG*e*)4x+^+{anwd|I03-FT* z#v%eU9!V+jYFe{8iJvom_-??}QKd^r&CP}cogV1Z@Ku)-tv67b6iPM8ueCfvL@lCmT3AZi2M+Z~z zOosH#SBv;n2|H9lF5oYe5{VqR*9LM`dizH-|9o0?#@LK9Phk_`c<2S>r-%4JsT)oY z`i1EK<%mxXU;7DC+WF=(7ym&tcmx(XW=5l={0yMV6kjx@p0@-!QV1T%BbSGe^t1%~gPb6LC;^Qe!`NaHiN}sM`U94m<{Y`#|JU}%sFCS8J?58Tm zPc zrFRTkS{aGg03D|b5sq-ztnO>#~;S-a5x<0sts4ai6~tCk{@16i4*C4v0aLl=Rg`5qZ`ytjCV5JMYG z(z0AX7sFY{0dj_b_uDG$9l}3J^aAAE<@J(6oD|!_2;Db>kIUttx+@r{-|N={tN%{Mcq`hB-;c{r{BMHN6wZ z+76OE6j)TG0WB`flgxf-&G@QU?FMv7pL5(CA{RM2tQo5GPvA<<2ZzUCzo-g;^L{k$ z@y6F6^KHH$vG~`pz{icl-G_{y2oGn-%?YB2-82bVJEKS^goKuI}qyskK;GoopJUa=d4in$c{T( zGFqsNvsL!q?(CJ33L#fi`jU`@6KBLJbVSZxmn3^{zx)0F`Rnt?=ktEQUeD*_fh^}! zyVw#Yr?`TPktdhG&w33DH`y>3(uSk+xbe+DG^JlSuWJog2B3~=jreH(++BjJEBjmX z+PWa+nsbw>u}H>drY#m$8SqvBxsd}@F|c+iE7AOe@ulq;xCmi%GOv=qX5^g2IblJp zi~Mn+tM`iS9-8;vtIzjQ(HxR-GeR%u!tO2nH&Oo9Q%Cz-gGGvbD@1-VP7|rTS$(sH z#<$^#bYU;-(Mpg^h&y+4J4m|aG&^1h+a_nKg0HpJ)>>aVZ|)U?zOc@6HvY)aK>rFE zp5i~Z^}Cz^4wqfa5}DncBE^{7*gVfSq0$`Bl5r(02$zGK;QNE($ZdGghAsmG^vUa% z3&hi3cto42ZoGv{{3PH(C2rhnDPs-wjn=*Xgy$@`TKeh>eNys?91JhA7713pND_7# zCTr;zKJ`Tn;O=BbKN>mH=5laWsJ8H= zrnj}NO{t%k!?1t!fHp<@%d5&@;PppH^FHU{fiGLpGlQ2jC{D|RF3XnZjAVXz`J=)1 z?%SwXBVj+$p7lP}4Ov0|D##VYxe-C1>0Y7C{7;5`eYSdSmYaX>=@dB!X)k`63;*CF zegWlgp%yr_k*X!JpBpTs$D*zzj+Dt>ERAy#afOq@YT~P$WMdzR?!D%@YI?X8-~EB@ z{*dxGLNq&ARV#Xb9ZWhstBMPF>*`&Er>Aik@w(XcwXZ5_5Sa{O1_=LFVLphVHO&KB zAC6LJL%EL!mK)s8_v>i+2CXMvl=z4P{(57go69Zv?8S=#6qATgd_~Z@5XxKZxWlsR z;^XkF?_tEc?>t4v&IFHkZI9eAj+uxafHF8*ncI4y^K;IQTnBCR3;wQpN4GvY!&M&p z6yg)6nHvOM8eLKR=^t>(Ym4{cBxs6pf&_Tn)4a`lIxJbQ0sQCu65}kFd&>N5TTk?n zv>nO}AlO5aX=yWyaNQO63hPLjFj1sp_94zc6LqjB!1w2W^6eqNK+U}LMUDjyOO>+E zmDvgM&OO$m1f++}^%gy_SLKzh&?pyW$rX*IgA-_Gd$3(u+??UkEWBb!G7vK;3ivpb z$ZXSLV-i0JtK%)wMwf(Bxu4_9n)&WW$1y0)8F@YCE#)Ugo}cuz{kQe^;bf&qxzTkP z8BM!_L?s=t^@y|`@08%f=puUc)cA*Mfw!yi=oqp?i^z8jtqB(G@-`K<&#zpzTGtp+ znpt9MjTHY--n0!k{^m!%Qn$pZBC<+>){WtMkV36zd=JCx=)~89b1`<+NBMKZw}&n5 zE)LcHXtZG#vpVvvs0U6!9_rvUR)}Rk3&PnpclW`2pLUoY-{Rv~oNDLaCk(`4{8hLx zfcH#*RWbjk~eZWRT-zTZmOgRy&%5Kocs3VlgX1zpV8 zmDE2kv?aaVQv!F6)GJDHM|PT`%(LR^BKrsNHUp6l&^G^_x}W{nSWpj;Y4luaF{$Yz z^4c_p*5bMk&Tsr~yiyMZ%WN{I&d^C#p-r4b*OlExIA$jxa20(U8=gMH7ZTX_-`hix z63u*DbgEn5%qVzxHG^M!*bn~c@6rkXLdXOB2iNc89pe42TS?=Za)Hkk0#*;)ML1Kp zP@zK~ttl9zu>99W3Y|?c6J~+jOC&F{JO<({oDB18%ULOtJI5Xh{~GuVtA6(NaRcU& zi#KQcQ7oiujG+XZqrU5sld`Pw5mr}OeV@Zk|BVL!w!blDV0>?6bha`qSFQyzd3$H~ zpKY@2`)qinBU+Lz$0`;bCKR3n7(axqh9>sP*fD0E7~S!L02X@@NpPz&+!*Dnml#kXd}{UD6m@_s zn9jA0&1>w0&$u9?Et8&#)6(YtyCipwCy%06RJI&E@k)Rl26oDShewLTBXczkI(39I z(Xk|*19)qG4)?o9=dknZuDpU(70<3va-dY_ecyOEY}L`#=q~wS7v>)z!cI@*7EDy42b=c&JGJEu}auyCv*~}twqVQ7*BD!Aa)VNFY6~2^Nc@m-q z=;~Gr<`h}A2-p{Eyg8U{LuZkmz;j1Mx@?*$tMxd)Aoz0BvaGQ&EY6J|W`H`}Y_F0d+u07;+t4|>7JCJ>E1YSw=q1i`&5%$~Oar%Z! zEFf)2-ILNS& z?~+I5SJ#we<6j4_7}?>ia3 zWsGKOS)0UViiipl z&_h7d3vC#_fu+j>E!Lwk-ICm=(h`BwTS5m(GQP@DYjx;W<@!pH6tUEZ+7Qt2&Gev= zkST@NMPBs>_{JdZ;$G#6CBNpGORc<2jKbBas$?Ep0A6|wFn4t*#c9FhnZVhfpcv_3%6tRLKW^z_&Y2%yoYl%ERm#~ z5;b?Op1Qw-*F$QE5^fn8!sWTF<31fk{TcE9tS61#-q0aznTr6%j-M?17|jY|h70Ik zIC6K^oC~pGRb{huwi0Wc#1NifxJsY_%Xk36^ID&rjxf4TV^lwV(5cMyq)1 zKO+ZNiojl3O-mY!Kh`ajoxclM3 zmiktgf*r!!=(5)=y-iaF+C!uO60Vea*WN8PNJ{a<(iLMuGreYk-3G#-CK#huq(;E$ zvBGA;VAr+1`7NmxVP}0p*1OL?xRy9DvB07fALYj=$GTw@;@06l>%P37WI1=*IZC@f zt*|0dc&;ze&z&>)alzBPqB-(qDk2-nw-W5$-V>J)I*tAIOcQoJ>}Rj2oB%Kh*sukQ zxUI0V^pHn#I7?PD?1`;<$o#dn8ZBVV7I&x)l@@BB)&6;TMVuBiq;xPd>BH~5L{`2> z-e9z`xjV{Yn-$Ha;w8r25Xl}Ie9KVB<+6D76iFmthmeWlp@Bx_N^PG{ zcor+2h5lCw{go8v0q2Qa_Ssda-WI=`LIn%`9>h`y_;Wq7-gRSCKYIms8GvTGhsn5i zX5X5rqKonE3iS@bCxDZ6soePO#eVSjvM@e1`FlhZ93@=b`DuZ=^U?=?WGHO#9d)7R zbv^fIGhSSj4_5mfYh#bH#!4c5_)7G725?f|UJ-@AF(uB!6>cz)4ypX zQ_lwx8P2HCDeO0O*^*0|A3(_u6cR^KOgt!rHI*Tbngut#utG7i2gXOMt8Y;SW%b0~ zs*`=Aye}ggfHj{4udn|zay;ljxo^xP_VTX!uL@6m=Gyf&ds`)2lW{iLX+L@MSG>P$ zMIOr*tZMRdfXS2h9;TebmjBrILsyv$C-s;))@^UZ3#P`Vs9&uKH|}g&`YpRuEmJ`K zeVilCh5kp#3Cj~JN@~IQ{SY=JSapJivZh+1S!e`&V?(cNjP}}I`vMJ1pub9W300`` zJ*J96_RH?rtU#7*bECmah{C>_z(MaPgygt0TwlC%hJm+~6ej3<)Y9$+JVelM8pRu4 ziyn`~x94Uf+27J|9dsFKX-XJ^0{5>0&~eINJ+LX#>$9TQs9;0cE3~gOO}>MDdgcCW zT6~=IZY6)tD&$>Ki7;RYybTL%JvcaI0#khP<%;TO4B}8B+N@N8w(hT5Pxh>(l(r>W z?W1)q;J=>1Ux~pZy_4 z_DRQWNBIZF4i&9Gx}lxIIeg8r2iFG-%MGZmWp@MwmHNYi6EkqxG2O0`(pJ0R?8M|x zKaLKSK7c^)fS+=U1r)7rQ()ZS-d%(5el>+WJn)*6bjMQe7aHwEf2LXy(!)#TSE$c# zbpbk-28>E4UmvZR*@Gt=k1Xk+0q19L^%XdKS*YTr?VKZqjN2T-4zc^y2hLQ8jfjf|U zcyi50Lb|$jjT{vGP$b}Nwf!N9?k(cEk77Wh;$2OH$~(FTpkU?Ydz3`I%rjQRz4If6 zzp7Vv&bXdwDnkN%lbvQndfGUnB83}dx^t}BqYpL}I&+Eu$?E{gz_*#eV7y?k^v{k~ ztxP&NK^&+G!0L|0w;b~{eCIv1gcL-O2i$+DgThBCj1k0taW^oI`#T!Y{pYj zRl%V<`i?%#S21|#@w(m!9WKAq3%N3%B=R{4(y^2eatO`taQ3#03;hy5aQ z7uz?MN6ew#Jt}2A1v%1Go7{6cOEFaGhEc2d9jBYQz=(EKtP*v=z$KdrEXU}ASHlPf z-qtk}CF;;ywqrF53K;G^F!_+9x?CGxzIN8X^1O3)XC7iOq&nPwol^UQw3d{12+B77 z8ksG;r0k%q6YgxGPEGX^%Nm37$Nf>HR!4GAC?<RG@;b-3Qsy~t$*}z1-=G0lo0V+3={JS zG6Z%eaeK8s7t|O8e&s%J%7Mg0mt%DXLh#49Bf$v?S@fMR7vS*A->ZqAIwa%n#f$Df zdB(L-FNrBawEW{8uQr+9W%_P_kD?!QCdA=5?eQg7Z-l0bzVbY^gl`~J@eIyl(3^#K zM0|ecA>^eU|J?~ma^BS>*+9sfKfpE;?-OOk*6siua-df(CIK4-pQ0U}`wrZlebSLr zTyeUW@^0={=DPtbOS&3#{KJT$SR)^I%)slYDI628T?6^63m%yZgpMca|lUC z>FbPOtu!+D3y;_J@k>i$^@>aLQ8t%WvOudR5Qtw5a$X`Y&aikg(I-q%_IXYiOa)|B zc66SfyQq}EUxrp`V~X-7Sh{NLI|u27bYzigl|8gx*nx`J zjHd@PbS^%MUB6hTN9V?c}77X>Rm)h`|fn#G|{(%V+CELfn0Rd3=&tg4bid z3DA1SVU7&QnaQf-y@=q8l@(u?MEH^ZSsU>khlkiN>Pe5SCw}DS5+SblkuW)2LBp>@ z(si(huOi|ue_@tH=rw`h$jR^7l(5ESPUn4Q;Q%O8;AEb9X zQE{$Rgs`BeI8=--qJR&RAo0@X23#=+6Z&$U?b60|HxzGFeF~?6_eVu3usZDb{xMN9 z5WUtOQY;twD*64J^OFT6cq_N!gltyUKM~sbX=B@;?Wt6a1t@{1o-xo>Z@MroX`}pu z$c}00zE{r~{dN%TySOa69v^WkTx$-|^v(Sm5CJ{ZFrr+w)z_{@d-OZD@_!{MII%y1 zQ@KB;b5!)WE7&L5eNB~zDYM-|=r(lgd}H^JH0N_;i>+04Gum;HUA-F3*@_pRJ3D>t z4dTv^-6;Xm;ww@@`a-y0o?J-+%yt4YLbJ-S<3#BToNWh^QRsaEq81c*irYj8 zX7sfRv*+NGfiyjTudReBJSU>sV;%Z{_D-~J^q{Rf%8No(Iw{b zIC7?Y8flaaCx1=s2NSA6gQR<0RKG!BKOk zAPps9*=;QFkX|O(z&cB+ElooVKFU5s8b#uZAVqGVv;<12ZcMxkt~PfB|8GC^lc!xq z!#@X_1_7$keXz#4H?oNDy<`^&m^yw$41040R7je( zXo)Op#rlG`t>+yDDwU7ot3;Yjy7<)*`2SWSw>LR`e{&LvV}>B{~S{vr9?vws;Qe`bF|a<-0t4ZCo>gDatUo(@>sR^oY5YGNi8dYM6D9+;?ahz{wqaeM3JJg3|52QJ{^r0@~(_SRK8xg67o)!SgEzwK>0AiDdn& z*WLkCs<~YzG3HFAf1gs^-Cv*SQ500mN!Fpi`jik{TlL&{Ab4qC7PsQ}EfKE%%c5tR z##>|x=;FB#hHy4adIBs!oL4FM^e;tNu?VI4ENKJ1O9J_|`q7P2LAg>fxx0ST4NPA( zoD|gc9cj+%-qeCL#{%3^k8bA{V8HcG1x0Cgp=+`><)OO5R=M8;i3j2Z%s-+v-{sw^ zGYM1HX-H7D#&CYAsnP%Q@!Z)1)mp@>`Pd)v8-6n(a8mHGai~p4n99NxD9im#6fR$^ zGtsBux4y;)7XkGh3E{Lttmfu0AV^hhF9zp%h{FBU8n{kb?cV~$HH z!1}_~l00VruSnSwhRYgh?_m7x+GT9qN9C<7HJ|VfB$AYw>c~@-lM~4G{0!GoR|f|~ zy97*YkL9q!i;P;|x^Ds3Cw?`@JB%E~raEpL&B}k5%Xd^ELfJ7g$>=a(=eNrgx(6XQ zc`3f+0Z~f1M4f9+_CLd!rlb|5y-9kU=EmuZGi<4P|?gY~E+GxC>Z{PBocfLg_r>B^=$dk z;{MG*lS##ak5AP_1(lmzxLzc^+Gq9eU~ei*|AE~la10|DR$&2Z^^slF! zZe+!j6#!(l3xYU?2Z}9Kc#s1ID{-7(NIj=cv2e|1b6a5G?Tpk{z)6!DBaLR$3;?Fb zq*L;Bu9QI4>LEIZP@dYQ5p3ElV~5p>qfCGT~BOxuahhj z6uqiTW^tzWZatGm+YiHeKulj$e2%muG_qD$dqMRU#Hrm7|zDouN<`;o=9QUg8#(v<`Ak5c&Pz9^3FK z(6~=54p}#Qr8R=VK*#zMXK-C7!{1gXN&wkkX(?a@ZaT`Rlmp7K(h&<%Ze$Cm9_wmr zw=~3Ohe7|tA~rKy$jHzZ6;qbzdX>j!$3vpFIU4=NX)dvC5EnfLQ`T#UIx*Ua#>wxU z8y<$D0qQ?l)lT`rf?(dW!iVxslxit*2cJ~Ac=djg6$Ujbl_ddv3@$0{Y6tQM1LRmt zUa0bzw7xQo)4GlZ7G1+yh{fM6!bh18UjB%-dWwDYsdi4&9TcI%a@r*gT^eK0kx3Bw z!WOLZE`UyjSIR{k&a|;3<{Qd$;HFK|Wf5YEj|G2lKsBb+>nf?p_$PezTUkiqykY(Q zo{QwFb(W%(GdtKDR=(qII0LL#;b^EeJ(c%&Wgp^pj0>1Nq!GP_K0qI#v6dkK3%W9^ zO9?~0y0h1}x*SZlN?*RIOQdD-FsHT@!;_!tjl7w}VJy!-y*SvNOfF%-m@M$$%`)U_ zW^t_ZgETq8nyGd3sYZ{-}6U;rsEO&3xwd5jaMX)|6Zdl`pU+vIbT4-Z+ z&z+_;uol#kiX`hCKn6hc$nOfW0~R9@@KPs8sOP25E9xHRk#Mk*}_KyQ3xP zLi^MZXd(c3OBBzg)Rxqeg35-h%{nEK>^u1Vd$iCO4Ts|9$xG%dsZ*xvPGl5GDv~n9 z7Clzz>k|}ZA&c(Rqf$GQ_G(WJ8r~b|Udy9V!rtmvIN9rT1I%2%oliT{1D&kWD|($k zZ}mAwQab8Vc~n^wT11oY652MCIKS^ZRj3T$jhVeTDA&x`Ds`3l~=N2%#nlm|Wq^LmdL?PyI%iwl7O-r<8U{&S#7AsXTMiaIGl zRiu{nb2i&=W3=3G5f_G_it^>)>$qRcSSTc^8Kh#(ibuLzEWNmq420G= z5L-YxaHlr5I1`a-21iP+?#T&Ab)TP!JG-#`|C|z6_l`C^UY+IiK%YeJw5m6npe0*& zP=_he>Iw~P2Ft2=t0Nbc>^at&8@RviV~xaEJ-)i#8u8im(_y|y^(hx=t(zWnisn%Y{osBb`+H5;+;lPu}*fgR)Gk8TTQUF)D z%Nw3Xagu$?y^`f^ZO0bkCNFsAn&2G9i7}LWHUL~&@{kNwOP-1I|6pzM;)EOgEWdBV z;jsLDBR40fC(7?Y$@PvA6XC}`(m#i(97bg&OUS9b;Qq|vlB1pN)TZx%^Qd~?0pLim zNIgGFh>*<0vMsyyT9s=RWEUj>8|ri}T;UWh*C}4Hqhax97(VR8?E@Q`AmMt-Tbt4} z%JB3E?A`_Va{180fM|4*RF&$HN$2ffHMh@_K6>CvZY(n0QTL&0p`Euuspvj!rDLHBiMbkA8+;jmk#JuAB^##WIM5I57;R|ZKgP|(SwiI`5izun? z9Qty_+7pjJ>3Z;~9x{B>mSXkxB#ss%c1#|raC~0c`)y7Fp{>t3RU_d4nP4*B>ItyINV+ERp^0vDpr#9#e=dRlmd4l{o8J##FJ zv$j8>(!kO1SD?T0v>~IQ0o#_hxQr6*uEcOZk$KVe<{!@rdLFfB+~A)Ix@hPb`u7=) z2RQfkom`JI15@yIzVLZo3k#I?Stvx>r(N=U8I}5ezNMZy$I)RU=#TN>TF>RAwByqR+V2PdzW{>r?;a9Z+PCwZ3w z&;w4f&*m6+5t=+E@P*NIFo^K*IVAEm*Ve0qPo}FD!QTxJ21D&dk|5)%gFEBGW`kt?KC4@!J42uT9T+jtlzaMBq5 z<Pe7Zby+b0MMXel4bH>g~hn^#E3RW+fuG@Y&qu$ z1o1L)-uDTibcA?^)hWYyP_M=DgFV_@UDtV4UZntAX$6VeLU6}{dMxgnGBprh|Bsia zrANI4n^JFqWgf6ThY2b4d^Y=wq&;bkWcd!2&nzpgwK&tK;Zv1Z$!TFVUuOAjrxRgLHcs$-y4M8!7LKBD!UdB7hC+HZPZK2?Ql%M!QA%`=+%L? z@X+7$MJpn=hE+I~q!U|QBR2)Q2Dn1*#}+&9!8A5;54U(vS#ElV$)0!A=5fW$v(I!X zES4*fo4h!ySC;{gmGSevuPL8Py*B6k0C4u%rQ6R4`L!n8@#+$2e)wM`b%|y8H|hKp;GU2b3B73KtNwD`-eh_(#aC9sTZFR>56mp9N}V#qha!$n3l$^mv`NK4 zWv{p+dH=T}Lm?MP`);R?P3&JPI&05|BdLh3s{PL@(s&J)ITnxE>u7u#OC0d@i;Jj> z`VGTqE&HCKLlq_c%%O!P-hsja{3YN;6@hz%G|NkP#CMuOjc_X`TQ0FgANzy2fwHO^ zs`<%4ulYt#Asfd7poxTWEW`o2K&g?JDqd0NseH3d0WQ1=!Tw_DGJeIAog1s8PEbt? z*P3wN4ZE(oI%O!e_sULM>k41ot4RZ3ASEzC5}RK&)y*b2pTvGOW7NBo?Ov@w z0OO75V7l~^?vT{78SW>dCKCzE@86Qs1ibU!wd)GQ<8T%X6gpMYEA$DHB(yW24rMro z1vVJKxNItMgcx*2=uB(UikF3qj|lTN$>CAT(gd*Y|EcMw_EEplpoa< zd3UVK{{71_$H@VtGAsQ z8kX{fhXwC`$b69;9h8;k%Z2Qb6)30 zUJ!xJ{QQmWSL}#;gB(!dIY4d=CU?!iH-jj7<)-~p{+&}s;xbx0Dpx$;1eGW%%{zGR zIGnlkb3~p1w`FYB&nPhSq_D4xJR*ZqbRU7uGAGnU zU8F5dwlC0ZDA;IqL2nFbYEC|qLpp3fo`dOV^Jh(#rt}GFFF`U1y-4q`q+RrcXOX4-J-hBe|JBVj|;^}wYmX}c+F?YiA z*H_cIzN{p`;F^ivL@~%wBfup>uh))N}(HsBNaoV491j_n|C0=m5P@rS(^xar7{M}BJbUaw z+|hadOn|+cL1$~{_`?ib)(}pO&w77+n%@ZF&^teI#%mv>HE5Sm+MQfNq2d-t@u!g0 zC+z~0v?W%k@i}DX6zlaDJAR9IU)~)9W$~WZ3PiXq{%89QJ~Y&oBoK`gXFAm{WY!7? zI|j!${P*Op_MiI!KMydHN2^2LR&!J2p2 zPc*ohP2uR1#JTl^@Y2!#%2+4h8&V{|Qmya#)0~)MA@UyEvq<=&uXPkkA9SOqlgCxW zioWGBWXNLDlMoWj4$0g6Gvhn)2A}mwa9Rt_zqaGJ2{8I}3_ z%x-K#pPv~0+Sncq`@gh7G@%@+;L5g%D<*Gxm}_?49FwM1aX-J1?)>#|U9p~Brzw8& zIMVqDbDxfKPSm(6uqaS5uD833VJG8}OW~eU8`c)Ge61_=fDQ>UG1R3A#Sm6;yTd6YBN z3(~oyG<-E3ck^zk^WgF-oaA{dnjf)rl+%yx#jPY+46!wvKeo1;6L_dUDwU#^wY#*- z+hSa{zLn3_(bsd3bq?XLuB^t6uuy!R+|0bSlLmQvmEf1Lp5AXlzj8xqT0}|ItkN)0YAojiglSnTONE;AHoAS3iMaM8jD-8Qx#W+RDbo9;z|yoG zRYniZ*(Q>K+HdU`M=XUAJBHcPk(s@>)wEbF@tQ2E{O}^WWV5;E31lVVqQCYM#q-8b zWzI%C_8AZHjP*LLfxY;U@2|f;1G;T)?1U5_Ybfm%2K3tC4X$U@e`azF`cKg*r?OdO`eycnmOeNRY%Q|ZM8*^to>Uj5|h_f= zuMMrl*&q#>ShIIa>Z-b#5>lT7qo-$PA+F@01h@be#&NK)T>sKrIO=&m|jNJr8b-VI|_k9Z_YkN;?efPvnZ$+kyiuQGA@@S8aygg z<1ktp?LmGrXJo-Da-J8Us@jR1%y?YD|2L@RQk}`Qr-%HspE!RijMQWDy@`tVGIaF6 zLleJ~$3$5VNRM4_#&^>;BjX-y*&*-B(>h{d&};lhcHzVM{Y72q*c2lYS%H~;bMQ9%!P zVT9|n!Wvugw++5Vrp*qt>AfB0;QjxeO1da2C|70yZCG%$ct<4W8IEV`#dveU9L1;W z%LhEdpS0}!0G*K%KVR2A+0dW{W#%VQnYXeuDe-W*+oZwfmS`P#OG{&RbK=t}e6N9Z z3^saFS-Zwz&kl08x?OS)t6H@V)f!)m?|VM;UgZry>(!-1qD3u=yqJdY=S*XI_~-@>g4-^fmpI zQZ8=xXO{IXmnC8T2(sFO89!!?<@nkt~>6wQ4< z41pt^HkGLI1kf)AfxZ+6nT~JqP1qrMR{?PA7O>?3^0_g}#9__8o@q_&8HN-y44*78 zA)Ynu!mBOK?-n@Y`26=3{eeBD$NTN`vPw#JG0>s|AA3me+g<1XFd=yDoXThRppWXe z^t1jm(47{T90m1)j>T%ySgfNUzhLpdOGDhB`A0eDb%_A|&siub49}x^WZPK6=f8aB z*^%HY*Bu#=I*{tixe}6x4BycmceYtZPVuLL=y)oW$-tTdgAeRr3u9Z+@msRoIfUJ# z%_`8tJ-<$hh5db2#C=K!N*%CV7B7i&j*%eGUiKn$tFp0P^259xo(*L4{>%Ca=O zSICJays51($>|5N)-5bmmd!B1>jYyq5YazmhOgrz;S={AW{>(=16Ot;^`OZpr26BI z-SzYH;Ix$Q>PSW6xcYFN^&O5+F(-oWN|?0k_zyKayNdcU?uPbt)Whm?zKAENybO4WwfAgi~G=fQ#AWw-c{X_t!dB zzArSt0iB*1Kj_kvk%4ut&!i&Cdw8Cf@!b=^HJ;UkAH~9DY7vK-{SHC<`m_N{09k^7 zxT_~_b=DPHsUrX3BO#R-q_e_0?O z%>sc{%sAb-3~&1CUMF~lDIb%*<1F+piAj5pfA|b7{PUrV{ug=Za5iukf_B~ev)0<< zAD@=42=+D*@fJJiEBVZ~ya)J@LdOsz?rSSo1{6QmtVSBDC8Xp% zb@qHAx_2wFp2LFiZ{UHay6B@oZ<+olX)T6lV-_a_LFcg5`K!}*>+Ng_HrMEE$QG2) z(*N8!y#UY{UjK4KkF$Yq2kO@0gk>uiEf5CS}>Uv%lYCcYGqrPE}-w6tW4jAi@% zIiDPr()HEr(QtewTY${B9I2?<2zu3nE>pK1)(@t8;KJP?r`pcRUF0bw3nn1c>M!(5~+t{ z2)5EI*NqhewfuoMFI_!XSe{BgWwK$13%n_Hgnu}bPp*vG&Hr}#@<)Ylb1$K!V(I7@ z)=Z!22{`hkd5lS$49yUGHJ&~_%P{s5ctr|(!&#GB(7HYo7sroTwIx$O z6ykVBidowN6Olc$Tv=#Q>j}h4YMW_>I8G*v)iLTjCZ#8&Mtp)k5)gis(s~lj<&JOX zu|uvr1G}LGytjB;TrbNpSJtL@*b~`O2*^v@>r5}qnCs2dsR)0}Y9kLhRw`PeEa^WH zF#Q6YwSKB?iO_;Nd227FRBx`QET;P?htOH@_!jAhRe(Tu=!xo4B5Vt#PMcjPN6I=^81&thRAH2^7*SWs|BI2%zkA7gPHa-0qQ^{B=+4x=n)bU?SL;p4 z8A5hHUThtjT(U<@UT7Ay-`}5K{-Y>f5{a$OA8ut=+6S>F%X50^LtSq`)c!&)sc%?d z=Puf&+fHFkBne8n~P`aUXB51YbFeJATOvw@iNA*qOmSxc09T43Gsa$ zlr%=w9s$}msV**O)dV>hr6yR%Pyb|5Gs2p;yq#(}dDw+{C;H9*WGJYwBB@*43#Z%( z0C|Tg<=x=DLAw?5(BUm~+If^y*?`HMUboiUdywTRL&$k6l0;}HQtlPw#6^Wn!)x?6 zmwE19I~$U@sKOrbTdK9z+gOJtxlukeuReDUo9NsXpJC{uD+ZnQ5WBEG9DGeV$^9A$ z0~);Q=r6XwN-c`gk46w!+LzmrF^tnIg*nre|8C~o=t5=G^)8HW_~twW+^|qQxXuJx zC12h~uN)+}f9rntkRMZ7jIK<{-Q5&p4v)7fT_9vsurv$uHT-0t+L6Bn(O@SvPk$+D z8z>9%VZb>egoNCz6Ts!*n4D-i(d1?@3g9zx@8c%{`q7^ee&cSRBJhdLXUoNa3MIe=D2)&HtM$j z^G6L2;4$;OEp?eV9hBEA-iXVBCw!b@?_YHrDpUlDH*BG2XtrR+$is}?jrLe-I!ApZ zd>DJMx2*tHLI`=^U%33N*YUZ-|HHP~hRtyf zbDl#er#YY5oGZr;sK}ft=bVq5IYvw>r)1<4MH)$pnDay$9W3Wi$(bl;zkPpy!XA(N z-uu4q*YkN@OjT8GMtVTf9w(z_k8{Oa4P;G8tA{GQ818$B=Q@ z^5RLaMsZqD<+9FbiiAs&^bYFQ4T*X9)rZ8kOt2<^Xj{+7oi? zBtKu_nY9$B9&jr;>wWu%%yb*FtdlRoiYr@=ekyvyw=lH!C(oU#HP{y0LzV^BLLH~_ z*4CbV_D{#tcmUPv{r;N@?U zuvq^*ECR_RnL|oImU8JH08GILYON-&cJSn6-&QoFbAN)e^&qY7Y%miG*$Bc0wEOYR zy@f6$sW8DqF73a&<`fxcWl=_y$IXLsQi4ACQ3)GSCHbB&Dl9OmUsEEBb~qC2R+a`- zrQMsVg(BXZi(Xfhg9tLFj!dk@SPT=2YFe1UMbzs6x_okHI_~L3OtpH&x;JD!4k~d1 z*XJuCNC{OR;UaIaD{R?UB>cWcMW=Cwf(|mtZkG0urNWOM>ZesoM7e5cpT{sqSe^SF z9XznBI0Jp`T;491bQ8AJ1Qq-HL#Z&njI(jnaMAi#V$*;!{D^fenHC#;AD}rvm^=pC zUO=<_YMnLcWNYF4RWDy<;iI`F0owOW4n%Yf>ZXQXEwB18yulGLodyn2n|BuzRmkE0 zCj98aq7>Z|cf-{dyC&_-SU@YU0s5lX(cKuJo%S=v@tRRpaDgDkXxhb^ry&+F=8ZIl z;_HurQ~$E-eBJ8RQnMHS-n2*gAUb^XK`T{h%}ArULx{eLh%US9?47vlV1H92^Ra%& z!P2lAaqNegD&s0W^r33BcMik!A{T!Bdc84lBZ3#ZPPAe?MyzQs9ay~i5+%cR|_ z*kd?tC!W-gp*n{GCrXkYkUpjA>Y-vE-52=R$LsLu=;J^qW`I?-nK^9!@2soUC^70e z@o*>SVljbJ-v%EhaE7v)lXPFfa4A%&Ij52MP>D3cl!{K6sx8!5wS$TnGUdYlETKVc zvQJj=AN0)ak3C0n+A>$Aw)IUJzrm;<$HhtT-uzRzGV-2!DGQBVpGim|gZ(H4=W%mZ z+G2oO@T=;X_C%OUH10RD{i2ZWFz3W7Y@8i_OEBk78-f9jV>NDQed{s*j-0mEV|Oea zl7#sfPyQt4n8L}Zo(u=5adok*I(PmQ!Upi%v|C`|GEF)*S$7V44BCtJc(ZDBoxu>4wwBx&G+|+Zp zJ9a$K(&JDWweN2p19AvkOn`ay}yvR;3weA^cWvkr{T3 z!_;oFP5s0AZ$)=i{L(ysp~nXJcm;UOVmNBS5>SbF%lDPPWpicw*aHLFpt{;kKS*;&%5RFVf zP@SIrhw#_haX);ienQ~1U@R$Iyvz&#gA+f7jji1kPl8;14_|Cul(N$G5(HM+|25SQ zzj0;@uIi4mw7~S662;)m_|tAz)QuAhgEh&S1n5d|QpCsZ-16ox{CyHCC*69}*!>5DUm8=*YlX)dR=!79{wnWK4f}v5G)shk^+j9G^uzWCf)9_UGolu>Y$`7L$%E8bBAAKiO4g!B zX?He}&Q#wf9K}$->r9`Y^gi=6294bv4M{xRUoF7N6Z_T5`FeZqAKC zT60L37Y?5Xw2O@CBZIUx^Y)*tdWQMEBS&c~>90z8vkx%^s`dJr0-uulGO-P|evb0i zQ=I(B>7>IaZ6E~f>2B&0s7U*woS3vVwLYdLR!57lb{CI2_<~>X0 zit=`*&SJwyN?C{9t)J98-wIP=!)fiO&d*u_iCYGXY>VmZ)tzw|;uiXYb^xi@n0yFQ z5yC~okIb9c|L3MvgkydS?$!7$EXPj=Wr*E8Jby;a%s}a#Ol?LP&yJw(UiNyfvx7Ug zH)>18j)dIGRY8kt#^f2|xy32zoQEb~-lol|n6{dpkY8OS4PIa>xsoYOUbrA>l2~>D zqPsmE@|nUT8&;u2c~&f4@c~6_e#5053%(|s{#?0PH129?3bHEa6L4+!;OMvLv-r@} z7FoYh0znt=*iH(K?3;PP^DjG1YJB*G_Wg>hhoGk2JB0)hd={;B$3ON^Lt}huk%G9F zbhI~!fo+sp{!GbDhP)}9JS!A>fIJ@$O$;Nxddo&EKm9W$JSRg2Ex3=ZH z1A%)AZh=-aUHt`g`KJR9n=DNLT!MwO7WyV?2Z3OfE%?R1`6iv24Q5DYFT*hC#>{`t zaJx89-2y~-8F1naJoh|Z#n%aU9i*&a+0nr@z)dsAxbM@T$^?|3KRjo{oC{Uxx}NuU z<%zn>+8DJk;IW&f&q|`&+~lgrH@4f++!}Olv5uqs&Ir}nbbQ77U-0jYRgOOG8sJ2+XnAWYpvkQGx`kGAd@>gCfie)lc;{SMnK>}c zO*PQLB3i}h1SR^28pW-j1`@5>2aJv6RY`ndzmR8}cMmOZro9pP=P68wZ&mZ^3Q(>u z+~EdPJnxRf`CWfKQ>&dWIpk88rf`Xqo8K-WB0<1^?sc#GeFEt1E%>)PcZ|=$l_w;~ zy75zKItm3HjJ53EXe*^JpL8yG0gsX-T!>t;tKz3y6AriyeNfeRtFA~`K8tW6JmBwW z8=wzz?TDl8M)Fd$FZ+UK{;-uOfovZhrLA3Hjr7GRUL7b~N!*n9Hxjbw;~IBCDXbGP z>B&($9Qq@kWEdB$phAR8e7OXapQ4rplh4q-RoIC9py(IY8x(bi@Rc)fp>tbHou(86 zK1^AnHrc3d=-&D+fC*%UQ6Bu2X#4I$j5;~h&hE*m3JD7k=sRcPpv$C&9hY62WsegO zGiW3bk6J|XxF02YGDQ`Ze+|R0_6aI1_CLQ+B6%VuzP@*2@^@HnD_7VQ(N0^#UbhB$ zog6@a_sox5;GWgOwdb~fwDQNUa*xh&kg&8n%_bjtqM>soHbC3`F0oMNuB)8n6A`)H zDEjAb?9gN6$STp+<_IA15_+SMzy3PsYuK2qs$;HRqDVM5+CdE#NEL`_S}s4Yx^d$* zar$gpLSaq0q^Fcv;{nraU|;{ka|Qq&B|blbUjGjsVM_vsrbsfvdR~p|AqRRl1o~X` zOK6JKtvb`PNE@*6ZTR~&(tvP+!AQP5_eeDU`)Edct3Yg}&=sy3R`eEElz}ueD|zY@ zYRrNh-%y-s2;RYwxJC}<+knI5<8`^-WwA5syGOSc*ltIX5yiNmL@6mL2whf{X{5ix8#pH<%gvXu zqniJPx*urVSCpMTE%k++@@0}1jVcfkr`*gVId^prVN~Qtg!H7=F)RbCosM#kvz-C! z)@f4(IV(<#HMh1ktKbf-eSU?-7Rdhi?hUj?Q0`$mGqm%NXo$%hjBSyV#4TZ?Sq+Y3iNZH%UVjn~cL@sO z?cU+PT+v-W0fVd5);cfvo+&RMvhgq};2dNH_)Ck-Ast=(svEQ2sU0o@JOs; zQ?(m)ts^YgVd-!k_J?PAG@~*bkQ-|fl?6(>F5cQb4YU@ybS$LOh6@zU?e#95t7c>I zQwaPL=u$}$t1a+xD|>7Mcz<(L_D#7UEC>HP=2HO8lWQA{q9j1xJ5vVSi{gv%LF)Hz zqRB9Q%pSAxuS?fLw#a4VAN)Y>@di}THV0o&zcP1v*W~7M?`1T?kbTJ9+hCL1|6X3` z(P>rdNfkq8OC!rjFOxCg?kPk;7^HJ6sMnvqbVD;f-s=>I+rWD^^7!_1^R!<-uhW!_w@_ogVG=!V0Edeb zLBu+?mFXm*X@}vJtHYEx;%{#PM82JQ_Kaln_ZK&4S=H{Im)QEW1-z&6=uOIZW0(I3 zbzD!ZZQzY@98G6LBkDA*Irq6d==DAetB2LiLtbRohsnDDGXsB?gSoCNa4wZ;oF2nY zb3r^{WRrA|f~(!cimwV_j8L41KvOsh?%5F!Z3_YGe$%{pL5N7AD0IK9wny@*JFLr@ zzOcq#n>`UTA1;VzEo`4TFK$hb60X7`u6{u#(ombWs}6B+_pDD$8(dwsdYCu5HE z-6t-_Nk<V2k*vZlGzqePoo>}Mv~ld*G)1@9IM+9+r?E1)iDh*vjHJR;^L4b2p)`1ZDBtGbnH3K|3 zaw&^1IPlWjy!DBXGn#j}9e!|Kmove79YNxPaghd(uEl2y1`_-1;6WG z4qwP}_c=?$4UaJsnxtrvb8OP<3Ed9>#~Oz+VNGT>EGG-Fa6Lm0;Cd5`N{8p3bkvGv90k}iZWHLr`xb)3dj4zrq%|^s|tnpn&e&w7eNy> zxH@I6M+34Ui{@QRVQP}bP_))a1;e+zdr1G!n|18wX-NMSUy?hT=GlkmXS zN$l2%#|}s{Px`fe!*8iR$C>uW4_Z$gmaZEHh(5<09^`GOX)N)XUOFEzK0Y4$@`-)9 z-Mu#f`=kQCBErpEID?;5k^9*L;X=(9uaN9<1mU;;@pPG%!vVJX`$gxx7Qu~B6E&mJ10Q9~LEWrXb-U6kGTlq^7=sKC=bKf2mI)bljM{4WT_7yc)sPu+M|h6S6Y;3W$f}Hs>y&nLb|dXElnlW^bV|N zuI5J?1Wqdu?jYr+LnM{C8^QXHu(wJ5R^ss+DN#Wc_ij4)^h~dEXb4=Y?}V&$`aIPC zSs%j`7P|Vz{Ci^QfQaC?}Qek&P*uollYctmypiW^!U4| z^^>c=I)pb`;5_W{&xvHlsPNW;>Sr){Kw}~6rHT7Y*A%1#)2+jF*7ZWJecWD;Hg_*C zMjZTxI@9|a^7G_{3h_C-#QJNq%&1puhUD8Y?ueZFa~R=1;I44%hCPrtYP`iuU$T}@ zBgzGN_^^f_u^Ys*jj`*Z`@`l+#US^!T>3E2|HD>mV(cGduZ6}!pXLH3?XwLjc;l=z zA3ES0H}r|moNWl@tTsdCJZX-o!Ly26cpUk{1lpX{{Md=1|BTcNUbOm?eGthzG(s7; zXqug4o;bc)3bvUbPf;tPih^F1!)JsU9kYyG;POS8A6ik6#a)>T2hi*Gz-lFm%4g~q zos44Gz1N=wyjvCcs6mSt#mzdYajLS79F>k+UlReaw7T5Bv&hdVf)<)u2av7C!76&=Uq5#Yi z_W*wbT{zztweH?AVDOWr=^F4IXmGa-;WL(_An84d_#6wgeVFo){c1y|q3-RrWndGB z*b}a%F42jpn}KuzFhyJdt%F*p;IpJ=dUHCoTc?|FJlHCUg;WhF@cGDhTm}z zAkP=F`*1Vw3|o#PE!+60t>fc6`nn>&$mSQ;3V6EKqUgZ`1wm0oz5r1@h3L9j0~OZi zon}KvR9f^7-zRqP(~2J|xQEePJdQsP;}c28fy~n zd94!^-`#n28F{@U4#4H%IXX60PHN#15~{Y^7zrHic>Xd&;U6*Y7(acQ?JHh0w!KC# zAJBG=hk@#i(v;rsY$bz@lJl3?wFP?`lxVG~-G@`(gUw8$1h3>GxzRwO)0rHhvzIt( zyP5Knuz;eDV2yPCnu2d*w_Uu^e&>X`OUE+3TC<<28K|G8U)00hVcNnS$+N8`bmmvR zwF>uO?rpbFtS2Ovs$N_9s3NqV3qsH3?>#a&ZTIpcA=|k*h$x0F5fgxDbAP^$ZivF+ zUm200Sy(F&5#2mb9_bCw$(da%4PO%jwa-@$?65J(pNpA(+Z0yu0*(n~o3ohCWyuT9 zCbupmWk3`)g4VxdB)l=hrL;N9JUKrvjcbRv5a2M8TTESRSvN^Whc=pRt>n2ggv1gE z54uk>U1MH(c1PV);N1C#!*u8%oF5Y3D;Wi-rI#n4(A$Qr%3TrKQP@|1xT`*~nQ#bX zWQW?067D@-slvY+i_x|IE6NPR((?xv{{_tJ-w^8t%5hvxd_sFJ zo`K?l4AxVN)+*am`y2CQf`?wL`a%^u!_&<{7`l8gFd>s0nNb+eE!AICZWzmVJ*r#o z)kyRN-tf^%4r3&9oy~vSm`#c9x{Z!rMz%=h;?r#prN`XKXTxvF1VJ2qd!+qcb~|N2 zR{D5VQ_PK*r~{ahQp2ey8S524xSQ;PhhfZBx#lUF1Nhyq+qen~)M-M>fC@=$!@xRDvQtE7X_yDsYi0$AGC)c6IJTH%hxJlgI#S zzV;Dopp(CT04@fP_h#MH5dazEn;As}B#RPAa#IZSmUHCeREEsT_fPE(vDKp&(vORf z@N2jLc+)|2d7;qlHe;f3dK`&yTVoI@wuV_d*B9A5Q2CQ}_h)9y&r=FN+rC{Grs5?E zt+U@_3`!l8ArJ2O2MIWs{8k-xd{Ls_24{NfarM{21VS>q#zExH05|aBSyNAl%MQ+9 zU#vd#GQi2G**ZEReUmv1xBWZQsXmg&Odpz6}l?HYP&`i)b@0Hm?E7>4{q2Md9#`uvhtt&NC`k2o3kRG6zr6qM~y&x4IwM^N(K)INV4OKBwA(CL}Y>t(Kc-rHsvN@%X_$00Ap$|HrL|3aA4VjDecLK4YrU(b4gp2A3iQaJGf zhzeDn@e6y6h949oeP9d$pOx=hXJMT<)Lw7T3swH;exK7ME4nD;X(tN^xy?HMZ(%ih zmmxYd-?MTop6ONo^c_=V?1JesoXrVJ96&XLb{_ab)EBd>F0{dTN#SY{_Y_;J8y}WIL=QzME8I* zUUUGa!8uVgO8ElZKfP6--C|!oeGDiw-#rG6o|gN`bt^b(@`<$MK~7SSMjR&PbBdGA zP6T$%DQ0Ku)K`j%ss7(LmB{cjW*6giT$L-#>aZ1XgGx)ue(~B}={=x{D5!3Ptz-q< zfaTQJ^WfSDTc#MA+RX2$j(dMlo&7CFE1;sHLqY3dsjIrIn0Lazy3^us64ifv zQG|RUwr;SBdU7V5JI4xId1SNBLsO}}Q~N;up;TkohS5`Y1ARJEp&2;&k=WUa4;hYmuyEEr+uF}NtSKhH3@BGYAYxIK?rO6y}kAoT-(2=CG}@ zuGum+YVU2vn!CI=bW2)HyUD^4_3r%7k2oA^zGlt9%K4(n7l6DNDf(~M`?DK6HoJna zP`1EsF>uMD58&%MEw`tL4OGm&B9md%(M>sbAx-LdQwow(Hb9?3(RKuALkA%|#PwU; zrYaB8R@KegCxi^Iutl=2WM142)+FoJ4MWzsAY0|qt1AL;bcEIt7;BzI`rA}!+4v*YZ~S!K&N!+>cU^^sAF?`v)vRB2a*XJNuNlu8!RInYP%{ zHS*m}^YRqbOoG1M;-7$6F;v_%K-TY|20 zX_T~=B?V5MOvB_na?e{ehqqvnM-`$iICOuS9IxC+1PLb{u?WghF|z_GHb7=iA}gzP zW~n{q{+{4R$l(0AFzA!b&>5U}Hm*O4AkDVd?p9QinaQ?cuJm-z_ne7mA&yO zpvW(YSnOk z!Y2gE83=7=1L^CR%%{KLgVOYw_l)}$TIccqo43iNcE4j{GQq2>5cKs%g2kyViiKqPJwNfIP@R>MX0gEnW?st zU9be;1Isx0P_hNK+n+>x7KHN}zjV9c`{#leaIEhIxFX>`B2Wmev1|gl5o8LyPdgD_ z1fik;LEVv-g8uS6{?|n{bveeL1E#`mCkSoa0`}iSlrTGGTha$bLchmFocMHx!y45z z5>B-EqkK>N$P2~_*Du4;Kfbod*#Nt{coPowvigA+HNNBkK6c}=xH|yQ3x*CIe@=C=+6bjOU}&l?cz)m%LSb z(^kHaQ%UWD7?bbnAzEqPR#qn&s=I-SiCG3)%5au%NH5K+y zNtX|4n5qRoowC-GIDTKC10TN&{H!8^)P6orofQ&fX*c1FNR>Dxh|iTbpPmBiUEum+ zz9F8ewD8Sz2&1nj7xHE!1@J~SeRPC1(t1P=?Lmwp$A^5JvUqon#do;)U|rbevIUwM z{#z1xcZ=%+eBAMNC40c!KVQv#mIaaYAQ!n$SMaS#!g#CQ^-^_kAb)dvmNDgJPLh&P z%}coA3mh{xIru_dNjwmup7HjHx~&D zuFAA?ZVm+5u2{GkzYB~f#E7m8r~>o zRLGmhf37f}D?5N(u%!#F#T0Pv%EhqL)^8H;Rgm2}P$AzZ_p;@^2y%q)oA~B=ge+G! zcVM(m_qJOsYq57I(;I?lh=*!-W`wds;lcZxp|Bg9B=y;{($4d=y zpfS9DT)9BsiRtt}2wWD(oGrsYvzo62V{?Ue>jRnU6h;)xZ0ddLgEefm)13bG5&{I* zT4zlBHJ=UV{fCJ^PdKO`SoIo@rn%~+?_~OMOtFl+We4%?s&cA)N&7|&oXP&zGsAo4 z3_hOEXI1Wy8HyAAXFdih<)^*|3HowvrD~k|X9bNGPwPi9O)iXF+`?1`4ovS=LuoIX z8wHL8`$4b7&;=i7=v>B?9%2NEdy>s0p0DjVU#QCDN!GX^^f#zXIyK=cgtir8a;zR2 zhLijchi$#}Hexl160gUgwOT!zU1N@JE^n08_?L#xW?N$B(^BhOq&Iummo?=_=ddcBrOqt?1o8)C;^qZ2+GFTj)Ov6KJeN3jW04N zy@h>f)|~`TKukVgi4R$wEAj5u(_jtP%OYl~M6aVH^o%j+(|@$q#GCo`eE6s4A18ME zOqaiUTsI-qp9rkY~-vC4TzQ9QSa(BtI?~E?*WaD9DP=6&PJ(^8olR1-x2`hhJfYd zM1Z*BorEUMT#Gizb}7L(Fv{bd3}&OsqhMfr(kJJuPOtt7%Ucs*BA>3nZ#F^5;yHij zFWO=bZi8_#aRi?vAcBhCVK|+jUf5W<^K#!Maz1Dddc*y?nQFx=vmSW;B}Z*hv;!MR zishWF{UgJ4#e-eIzr?KF+#$0Wi|onoR%6gcZoRNBrG71P_6pQV8q(M>l^3(Nb}hxD z;#7aeWljw=mY93d7ko+`cU&7>#^wyYNq%>f`i+2?OOx=knoZS{GVW=JUZ)QQWQ}6O z5dJ?ztnoXl-vL=y2AkEY0P=(@SuM3Zd;Wf;y=r+zHyZd#UCyLCNBwJiLKMdpHmK#x<1>dNaNN0`ST~Uh?dLRc!IHo z>cw8tz}&ztO}D4-<_Qmm6`}O#rb3MOk*7|9DSPO6j2MX_gOdR@ZGaN)3HM>ZG6_Ik zs^~#(uqDtc>}UKLf`JFKY!0WialE&hZDW0&*BSklMLc3&crI6(-Vg@+E7QfhSL8>U z7>Pcq93+0mN7c!!@7tPPbp@R?=rM-j`JIZkHIzQM+uDR*0t|W#|&WRUNDIy`Nq!C;Ym* zM;UDc0pZS$FFFo$r5L6q{;I?m095Ev-+D(;nFtBlU}fU<$^Ps^YOc3cy|XOq8|1T6 zea9S&naegyUFYYfGQT<226q|l4ZTlEd~#{xRI0zC>MB8OP^{>BN`<^(HQZw5*F-$> z2BsiGSeP_Y+M$C2k-1%@`hQ5TANT)6ZKR?v&80!+irihJLu4ceId!-LHqM;L{%wvC zq!hp>_PCc-?+v)8h>q;=M3Q#4ehk8a^jZ~6REqvP@^NNEgW7Z`*!HS)t9Xx*wKmPN>E(Jy!i%7EPChP#| zKXo$XJEx*&HDw>M+9HtYA}qFtd=VOIhz<&Y%gJ{M3J7eVyNjs!n`(Roc=>z3f9)7i}HevCAkuoP1~W!h{HdXUZhXu zvb&DXPnKk+enUUOnbIR#zF_JCh@SWntylNYxPX+ReQBIr!whnGPW`@f&$!-*pyY3E zyd_ZhiuP~n^m&i3CQ!V{kBW?R6HSVT?)$7OcGqe#g24p)F3fATs~r`tm(%3o%)*#Q zAidu4#u~%N=SdRtq4IeTjfSpc*?0TQoD!0c&+N)Va7ey_c1-nb1v5W;_KNVip)BCpJem1~7rX zIE2~6?`+3)-r|d$e@#DFMGMt@c>89OB-OOeaXWx~M`p3_1*;u@N*^-xPBH%AO-$6c zyO$`K^#J$y@0>28i^BmL0z(!*(@WamWPO3Q()*x)D)2zWCxw2TOqoi?q`YaAMqMs7 zYKb>yOcmWum!H5U+!OC4>ssVGi!lw6?6ZdN#&Gi61`f|H$|sb8E|Sm6n3P9MS%56Sq@-a(c{%QxH)eW51}oH2GYr zU?IN8I04_}P6d*gX&`unI67)?GjSc+TqxG2t1IA_1RFtEy_}=>Ug{V z^#2Ndphad5#<09ay@A}0&aD-a%Q?ZwtzhIr=Vg*UokdamW1~N7_Z`6RnFc_3GPlNZ zGP5xDc0va$m)>Bzv;{*s8O821>EEg1KXN|Ilgr-G<`e}hB(B*m+G(+?^-P_o41~BA zw4=i=8Td|v<=3W>{~dEDNK;n^Mkb?Zz#XEG zFY$3k2LhgFPDUT=xwu|W$&ixhzb!=q$~8&!hVVHTQaOz2OHbBTqqDZuhVQ#qr3z6- z6Ap#r2{Au@`#qFno_QmC-Y8@X3wD(m=*o%c*>%$zKr^!o}PBz2^aJ9F`8fLi7!m=!~ECpKj1==hd7t^Bn{A3 zy$2)lHF-d%y2l*O#J4AAai}bCQ4jTQ&c^XwL=||yFvgc8D#6FYho}dtinCj^>ImJ) zD0Q+V-~&dHMJ(aX$(ADMP|gJBROOx>>vMexXi?Wu4`FX8 zXG&+3DdWajHL-Tft4XF3aNr%#=~khN)WffrUpnlb&L>3>61)u-U7`XvGeW}eGnuv0 z@BgwRc%b<*lErrQuSwnZ*F?j5TQVn(j`;O?6SgO#({*ZL!fz$i zHOyP3bH}Xyg0?nYW)HUWP1z@Sug*@j(qN7Ff>NiYE;!|}ipTiLG2VtFMK0~zH3>#!c%g{IB-j-=GPUV(gopB+#6?CVcf`lOdn@~C%qML~ zd67R_CdKcl^lV-P+>&J@`haGx;N?ppycg{D`p{ zlR3q-GOnWo?oH|HLOlMv@LJ6pt7X_a(1~9*2l4AXw9sW)TPr28;}$yI=~@;Pf`5_z z$GuF8-{^*nj8mJw!bNXy%JU}vIq{FKyUlFVj}&TjZYLS$ezgKOhc)#`McZny^us*< zsa-T!uPn`0+v9%8qn(tZZI_a?qG$c)@DXRIUsrBdnl1A|ru!K6<;#{(F8Y!y4u_F^ z{rfh+_Lw1hSKZz+)}XmW%h?}@xg-cFZ)w9 zWBn}!U9-xj1m-;1CmNRN?d!c-Q`Fwon&>c%L+M}wLy|A5koh0J-j#kSjVhO}{KXu( zq2gjuD@uy~qp^wFw@&T=^?Ttj%Wv^+44IPtj?P4rY+1-{+-JCxDyMb^yCA1a>FX?g zY~G7pzslW>XW_{XGihblNHx2Ao4+}`+hpMIv)Y*!ugPcm1D(&43Y0qw2xRe!-KYa; zd$vkju9T?EyNO*~5khMFn?2~`2OPKV#qW#^o?*-h(07UT($a?2D(0@Y-s~@Eq&wU? zZBC~&I9!T*ZbVqDPRSLE9_^mA29!|kqItcjU;jd;mSNAT9ksbUiuo<<*2#A?TEsZZ zk$nv$&P&etTP$&hUFzbwWgUzavuRHFT~*EFA(j$WOFhWGs*Iz@okl&5=d0`@9e!j8 z^Zb?~XV+lUIIRbN_z{?Ups47K@ImbE3oz}}S?c$MKlT}T>(LKczp{Ibf&x}8S48J= z1urQ{=ppZgS|==%W0u*gKv8Ftg_J7v{j7AE%^DzoI`wk!8WLT9Q(EWINd5G3(Hp^F zzQ8t~EAXk3+Y1@Z-FIfpleC|q+D=-Kqo-0F_WEr#v8S5xXYwkA%)E=%9qqm`%*kKlZ3&409s~FD>PqcT9 z-&>9lDse5c<#@>eR5K603I~)rc>4Hyqayi==Bz8bMm_2I%*pz!Vs}wM#EN7^mixj* zE=pMpKBS9FlijtXbck*w{6|Il1}FBo`j#D0d|4~@S7N$rbdO2^Bg`oD7ZWWD9TkyY zfs-|1cg-H5A)D+|fFahlnG*J^`ONBAz^a>r$l>{3apUBQ*7pzo^H|%D2r$kLH)*Xw zR%sml)bhNnYoNLylJo21b?Upd_0?fqEj#bYAECzWib~1w4yl?=NN|MOOLe5;OZDx0 z=4uL8($Eyt>WzroxqT8jfq|Der$0=fh@CX6iWE8BC~KLh!-kl6vz0^m6+Gyz5K`8m zMI_99o>^CFX?=L(1`-()>p1!5MVpvZM~I|ZZJF@F@`uXea&`LTb5!Y0uJEXYm8q6tGd6bsz~+=Z2rrq|HLBRlf3Qd1{>J zXYisd_g3Ot%HuNZ{&bL4yA~qSZ}Oj{J5pCKhO%#V{y`of7UwM6Bxx}BKq`t4gX|Dppz?{wM#W*x@`NXIY6_&l4=@7bcJ0e@siOc}=5S<9aZJ~`9&()r|ICXU#ZzF2=PLe_L zk1P6pH5!46Y_q1x^se;)rXf(brYp+VQy6A`mD`z2u|MCT%r{AOD(dGitq9bHNSam_A(cO!2_RfvEIhOH%@6{}t?a z`Wsc}17SuBDyUinI_t?p5^7i(zxRg0qH|Mu{J!LMo6KhQui_Q7dc57|xpPcI79s4F zsBk7L`4hKmNgn?4N0-Jl1-C_Kf95G4E5b}4M=GL@0vz_coAX(d7Bn0#()eflj9PEO zZ-(a}nK9-+rW4XewRj)RP~hu$nK^}kFimIU6ao6R3>`9XZW+|vKPDin4(;nO*j*1ovj4ys<`f`4l*P*8)#S z-=G%>Zdp1yF!A&Xrl>8q25$kH7Te1_d(Z(U&;VuYFZ5?Z!tw+>dDqjc zvs~E2O;*J}Ehpsl>3ws^7T1ipq90$GHXlsH;q!1g%lGc6vyS10Tq^I#_jx+V{Wk?K zzecP&1s1edY0r(wJ9S$9A4TUGmgL)qVFbki?g2P)YcABBxNuvpmRUJ)X64RV4iIM= zYF1h<9RIR1MKd!eZp@LICAnvrThrY7@_ysnbMU}%KlgM0uIoGvOOyg|BAsddZuI;+ zS<>h2bEh_YVpOC0c93PAo|D)sw&%eEg%`u7%qxsusu2*%hDU9Hi=PyJ1a#j~t`}Zv z#w@Ujj8?5RKl_WY+?B1Dw0F>Sf3d@~Hq{A3k{UOK?C{BYh>)$Hx53f!E_q$EH&Zx= zajKZd-e0yQ(iO$=AMs5G(|nm-v2MMc9XLT;AFt^Gcuy3q5iP^GzO*EbNS1Rp%4GXiw`*`K59J6kW{+Vc_Ao?)&AAzCLzUiy`QOliFd#W8bU;j(_rTC zQu}pdV41?_EfF0E`iZ~+W8!a>0#&ld4d?d6+en0_+wsDdN%=Fi+DE!-lmxd^Hq-fs zCjuRBeK}$KbeAN%5rFK3GDA#=C5fdl$1LvJccP^;+&e^8WAt-YdLnXEJ3g!z zH!K-a4J&}Txg)!gAMjCwrYIk76Fu^`#?2YYh+_Ka}4Cofqj zhkwt}7FrE1&%^Z;`huz%Z}yGo_>0pIPvo@B0^>4bwKh!rQG^l;;a~I z;su->E_iw(F)uglYH6{8{J?4ry|{ITjX381C~@3tRD43Rn*3U4=Y~b{;ACUzz&H}- z3h1I2J>}|~H2due*OgP$$!**Q&|HvYwr<&II`uKdOZI!OP>!;McQxE>RApJrA~i}1 z?Q`9rYPQRC*1af}qMHKB;fOsE$wB|<`J4*BP9x7c4q5p>M2sR89F8z|*!_$^ktm2W zCtb=eRt*t|oQcaj4qlgAeq&8i&lmn!W!EUN*Kc$Hj!Ne*OOJnAXw$ zvc*-+vpQsc)uB!=3%QJ4n`5*}M5)QfViMaNb_wYj?bQ%QO-y;rCs^lWa*6kl2yxBQ zb;QcGFN2O*rXQ4lA+Jrfh8fEGWUKW_EjSxMuL2m;yJbBjg1ehNBAlP6X|ix$hBmZA zBh~nF#i`->ogSYr!otEOx1H;iDIpNF_@d!+306JQDeTfIUCMjW)_$A@u+VgI=U6H^ z;{GMehjvUxy9c<}+Ia?b2YK_3`H*p`KGFrQmkBB;&{KUP~xi5i~VHW2AXUGJi~V0V7MjIv!#vLd6KYr=pB{SR&)gc=A#G%ec*Uv<~PCy9b9*f@}9lb z$1=t58xDLIMkCHne9ri0hV3>iQAk`{H#7K!7->FCnty6A=r|PsUd_sx2{MR!eN?m? z)Wd3WKhj{+l$>6KYJdJW0C8DZ+DbDq3v@rt(OGa9&uH^6Zbd5ON>$D4MW&zdf*3-1 z;=%5kq!V)#hSi5h#4ZA-*@?|%l<6`dXK82JEinE$+GYPZfnB7m!ao3IL){?xL%St3 z_GMTVP{D7e2N^mpiq-CQ7OR$Lp0;9G+M~qW#!X!0)J&sF{+FqgXalS~oC7xdK%b$e?S;uA@9jl^Uh;&pqXcDq*_u>N(^uxKIkq20tu-KtkP}N>- z)Y%OPI;RLy=LKB@R9p!s+qeK_y)t0~q`D-x8C+$y0xftj^g)23@wR|mTBaSq!>zSN zUG#jnz|#D{;2_(Lnv^IYta%^!6R-CQ+R`i_e|$(n|8vXg75Ol#Myc=yRt=eO)I5aA zfE8pjJF)183YWQMg)M%K%%%Z+mos`@1@4+ozS|RncXW8cjYe%w&-N1EzH#e)t^|#W zih@#kd#D19k$=I>yEh++sbLv-OhlnzcEH(5Iy}uxYvr$&<^0@6VJy^ei1=@I9}kZ( z`;nxlvdbS)p{cxwpZJmx*3aPk1m?_XEgU%vd6h_ykDc@Fc9xjNCpUY5ob`Prm=0Xb z76Q#2()~8+CgEm-66>v?qUFMow__2i8 zLE4(XbH;!B#2;oq2#vT4b18-L}V<#M3<7Rz!^d;Hkw?z6|hJN71~#V8yV!ylWxwq z0StTExhW7;1f+*WMAHc}QJCSGZw+w!T(*{2lzN6PYq>a~9`tCi>S(`$3$UnQeCW3L zr9c-Ab!{V}fHsW0x)*i=->^Ei^rjt|O7ptQM!di+b~bt3gI{>?ytRM#$?;e6noi`y zK{pH24X38~)rHlq9Ywl-ZYG9v`S)Ws8!LKc5i*-~E_O*hlBM9-OMKQq%V|%+crtwj zu1`Y>R!s7dnC_8lA&S+58$Yr`8mCY2_L+UBqraiyq^QHm(!=b5nqp zqT1};G0jg@BF$Q8w1GblenHUdd1yZ>AACh=xd56_*-vc7@-(XFxcLCe34a*#h>emo z)`)=JLJ>5}1A$wyJhgwr%{>qx*tdINC*FymkAG)>l`M#pdT2HdSEZ zA?}UW$}@|cEV6DeZ6mV#;}L63S$sb4UpDr^p~}^A`=FiH&?R_RY)$KQ!Zn}K8Pa=M zbAv;KKGfgfBw5RmPnukq94OW+f15n{0SR(L`yk##;4AXv+LY2=B*Pr$a*v%8!WN{; zlmO^NL~b``-CV%J@ZSM@2;f${SnvZNgw+F0^}ms@C}+J;QsU-MS{e})R)ypqGyUdV zFi?2jW4#lk0rs8uK~)(V2ECRZER}6$dPe2FQBFHT%$Q|3$~4kZe)vu(LaW{tlPY-%#Gh$R3$v~lkZmeYqPLSwVe=R+DGF{0NrPv-w~`zPY|{B)*( z)W7!3ZacEgYH>|>(QNv=#~gRF#$Qn9LiUQ@sa#rQ+3DY6l8@L!Su#|JbdXrDXFM!| zSU@I`CmpAtWcJ5U9}geud>?Jy=+%YG#XsoiB~@A%e-%+fO%>|B`CG;7x6+dj8v-GV zBZ-T3TDy}Gi9WsJ>91#UuNs62eMrCkk$(tGaJ`=pGRd##LU#F?XeMIa^sHVE1Svx2 zB&Y0jf2~xf$lwbDbBcW~)o}_t)yJmHekzs)MZq>q`sQ6{2+ra7Zpq1?RDe(!kiCor zA_;y>J0sblQc*}53-J^qQ`2~c1AoOGev74s6dl@6xKTr>LCo0~O78%)Z!~#3a*9Rwq=Aqtd@oyOXObm~N&ir0>*gh3U6Ej4O_xM}P8a_Qs z%Fkp7tC6{Yq^v(^t9qL}`1btM`MfF-kj)Iy^)j1ETB5u`zvaI;qFr%m1|z!@7n}Yu`RhTGx1B3y;ab44`KX8O!DL(m$prp>mc7a z2-&ZRIf8IalAvlb+461X;n=BULca>u;}QE(K?~nH@Rd}Y4g2}Bmj=m`i@RHra|Q5b zyJQBa?_PPkplzMZ>=2AZnx@yQ))g06T_1SC?fv2d&T)<^V0G{QU$;`1De5dq# z(!xf6vsQ519VMk{U64fJ?>z8zt;2_ItAJ^l`L4~@SgyJ245Iq|{bcVG&$_W)o@(gu z^d8c5rQ1y`uh;HQ%2Z35C6>iUvF| zEo&@;H;Nqi2n`#tJlABYMqjV&r~#YB@CNR3*5+$b{tgZ?e>aM{#~wtV(z!fwTBRJH z`fv)hV*%up>FA5EP{-2u+YAg^@I@ah(j+!0GOjskxcj07IQ3AWl`K+U?bP1E)UHJB4wD$IBs2LQWylcN zfn|k)ne>r_jjVSj$3Tj!u&vqk^Z?^J4Yr`t$yN*c#UwV!?V&a5mg0vTQ?YenJz3;& zx9hOEz^nRL+0$X0v40HMtQKo`O6|fpC)7mb7&CU#d#;qac_cF2rYtJ@HiGl~!Nrw8 z;M)3$-LK3bW|`8q%2R;S1SQg#=Vm?Q8l(TsR9)5RgVTpkn%*+yjWDuDm57P6YO(ZU z^;etS_M09VX`HhR=h+MR+>29Xft0U&WFA&S!jC!zjl5xVajtdD;aQ5t5$s6fsmsko7C77NL&J z{Z)0q^K=a{c!>0EBI6nI^)36C<}NOe4BoH_%@00b>=rwA49ll;40zJiYql!816tIN z4-fgT2tD^$!nhr80Ya|HqnuihBJUm>^rU_jIm2I9P<8(-uzHjq9q1Q3*ejj`4Jk-D z5L?gWrK=*WQwRNK+|QNP+^$)rQ|cH?6-fO8XW&8RMA3DQtaX5s8#jDHfdV%eVSDc`J1xaYuDmingRbp5`S<| z=hl`V@jyRG{pWp|PlF+|2YW)2e7(51h)5K~;@Q>Q?pa#06nUfkmz)_$Xgp?*A@=ZC zB*IQqVbeHJbSCpr#zqvD5eqXSRD*<{NOCI%-uouc!_zY-ls&$??iTLDHnJH)~pF)i+wDJIOc1=T3RFp zr>TcwBx5V30 zYP&PHJ)2#4hM+$hwM_uGKAbuL$p#duVvJd6^$xm$$i^uJTr8aXnq|mXdo6WBs z(K^FTkAGmK&kxZjsm~~E4y##BEUz=~+wFE*h{1Oj8L5vP+`|}3gjU=BrMZ1|#;O;J zMU)Do(u};9)oK*6Vmn!Chl@p(le?*xtgs)tbs7 zcFAQVSm@;R{=#Gv6&)FrB6);xu${RK$?Y(Ce#V>!ND@)M;G?Bkt=F9592LA^{V%TX zR>K`;&=S?}>B@`biL}o#e{HK%d8$V%@PghEfJ_oNt@d1muD^(+$Fc3l1>38Uv} zL9Dm)R*v}F7QF}JohCC13I;Of-ZBcDF*n8LuwJw{n6{%Lo#XgGgcuh0UbER!EBL?N z*Z;M4vfb`?A3QjI$q- zFW5iK9Hst-J_T&1@EFEq`gI(8*dch{m$pKJ;XaH;7DsVur+d5Tc1y-SQi6@AEwGp6 zzN%j2(PKA0E)E8#@H_aBxWx>jLc5os5AN;d83U953_PpMImS}{BN>3VGiRx5YBDoJ zol9$|1vA9A262VwlGgTi9}eh}gq@V~e{iutaS*B>nL3-h&vcM9_y;QIhLZ+hv&@n5 z`yJc@p>;CxL+#Tpw#f{OEH|uSZWiO3kvf7~9VR!L=Rm!3h8~?)IhPBlm<(!(mJnsBu9m73G z3_h{LhNtKi@b(#X2NPBk-(dvLjCAe_jRLuZ(N9n3;Gov<^XK%SIJby7(U5TE!Q=0* z#lt_u$t>^Z*~9F*K6S=@6v@HWTd-^X0^f>wt^7D=FmCPGOu&RQcCZw&ZR?tGlNOKi zy^X4Fd?KX+DsNKhcx*{`Z;;lZogY2+vUcrq9HGhF))6 z76AFQqJ3r?#MMFB;vkYDxWctznCN7Sb6&B67XSb+y@_u^s+-*Ypf zq!k!{;s?5zbao*p$+x4-PHP^+k}J4_O{&Dg&lcBs$%sD7>vA^ZVK02{EBx5v*+`sl z0^a4`{^|{y=j`1Fls$&`kwx7(Y7CxS=nPc?yoyHNCm?XV{YD=$?Y>hqVjiuP+K1TT z*4e;ojNV8Firu_%!7zm)i+&m~oRZuYmGz-JqO6?A47bt5JxbD8v8@L^)j{Gz< z#LkqPq-OxS3}Ew6+yXT3!DP}qr^)?yNhw(4wH#fQC1aG67i3HiTw!B=mHuY4xDxwx zE!YdmY(H*07$N;4sp+I-P>Gy^UBKcd`6n3lP7#_I>(ydph7PrR%+9aUo5YH9Ry|5T ze3cc#xO06*B!cd+y^$M64?5v70|$E>T2Vak8i?a_7OiTv530wfsjsu%&V41{`6ffQ ziiwGV|DIQIN*seP!nhdUoopZQ+K#h|9PX{1Sj=3L<+@gGT`Cq}Wj$gaydX_IKE6wh z&L_<)W3xug?ra*3|8|FT66Xtj_0 zB(pZi2G~jrJUxKy&6MBgSpIP$AgmBao=o+yh`V)9_PvzCXtApxXZ;?m9XV5KKu6*z zLoDAavy|s`XwCLs@U}=SEKFd~q*?k@!=fypneQg6Y=Bqp!^ks>LYvN%88Y)!EN$mf zVv!47T)Yamqd)u0)H|TgN=yxqeU)cy!5$(uU|N1Pea5~}gEQE=c-L5}Mvjs1)fuHB zH)wPzzK?QEnRncLfBS?Jq%kgcc4wkXqUKO2dYgmq_C7JP`_tW)@Gnk@>sWs9zUOyC zY#9(eEEh#$B1vBO=(!K)aD50~P*wLi$Ep?r2u zp4k#UWMR!ZvF&wbkThi)9(>kRA+!8woY+7~k-T^@(Xsgx^ui}(0}Hm>L0KE8?J~vC z6YPt&!4e)Xp+)G=W8`}d+DnX&g_hesXSYZsDwK@*G5^U>4LQB_Xr=CUaXY79CciKF zt&|bLO=QX6s1$>WW*1HDwL|{5;PED~j-PaG`PF;b)+l>@Ld++=)w^8xyFhXSx(Cw? z3F#NbEHke_mk+}K3Kgq1vfQM0|F=l^Zat_>$1N-RB^@-Vm*4utVW#9eD`{V(#1jep*lB9N5NGME7^$UQlCa=E41wV(R z5w#nxPV8N_-8$?fFGF4#1}agH4jyl^Dk=;hWyS|(3A36Q7?d($892jS#(fe3&bcAy zhS!5Lvcr76ORT|Xz~>(#mKkym$UQC@P4MvED!LNw*$62`-YKi5)Y_h~hMn(vNiq7> z9>#fg#@w@)Mu|C>O_FMlr2&-DrDDEdebhZ?<%O|)h005^=9q3qg5sP1SNPqD)mJD= zoKAHkKLFMbDGAos9yB3-x7jO`WyHvS)i zFm1m#zGCVu`MMV*^^A=CE{UrB<+c}FddpZy%z~24HjrrnzWh>qYrpNlPV>riE)0G3 z{k-_Ms_S|wdvO7wu&o=6NMTm_Vlr^wC;A)WRso6+?Do?Paw`|qWC&|_ccfA1a^{*& zfXyeLS@7LT!q{}4tK~%f;|fuq^%r3sW%@q8-T(dJ0&RcCA`Pl<<<`2n>@oGWOpO&g zw)5)uo&PTaF529w&y0VUw|tJ+fr{<@^IFb*|BLp%|IJe8dTK+k8~E9-a#C(ezilwH zL)H2r(@)0n^0@bT#yp_UXA7W_P6e7wtf7R`sc~Tq)7r6gZAP5)2BSLY;B;oU7x((W zxI6yhGV1rIjLO7e$Amhzi^)Qv=DipAhvifI?%~k)4y2H|2~;zz_AjVWw{|_0RFZzz0QQ+)p)AW9|2;K z%zbgivB!SW#}?(^kW0}DRomQz(0iR0U$zQgxEXt}KRT_SvVs;Ga951HqMskud}`7a zQqFdsvK@>ju{wF`Qw3SrOV#ZeNMe(Hs2ql|%&*pYW!dNEbC(h#AtzIikPXo~cKJZ6 zJ~-uNYtk-dpS1?Vh|f2eRK{DF&6FuzxSLozIkn+AOBejbP%EBVBf@K1IhF4 zn`t0sZiLOYRU4mlW?4Y>eCyEiR1g?B{+XuwJ!U_yzJyV8Xg8aU_Y*h91xk~_Vj!2? zWId6+^9{WWbcUq2f#z$md#WHIw`=#=0tCUKTy9ER9~&_c$Ej(j1WCJRuOd?5#=ruhe5|- zKqra)$t6W5AU(K403|4W#tzuf8o0XdGmNPLu2ewR(KjsLaJum}fAo2|DWbH$sBov( z@{@5oxpS#8QymUj!`{4LJSJ{Ybn#Em*fsq8Qn$OI#=aEYt)fILt*n5mM{L8)C7FeM zZh!rA_db}$QTSS00vHCHdC8lRf>vF66H__h2jHBNS17SnEExYt#F&7`8mc%`1qma{4<6Tov1^;xo=-TeZ_r`g!?jn zbIp|LH;hTj^C$UpAfR>O|4@$o8-{0ynsVVweHI0P@ZgWkz4ARK0_r|@?%)qd4?~AU z5@LWn+e2TMvX)Uzbpol_h@ALsNaHPry8u-$_$pt*ztoIp8>m?8jV`C}dEE2ufO{qV z^h66C{7sRd<(8*QJZhALMe$9jtonh{640hlmexM=LKgEE9i3|S9XP2(y@S-%KtA;h zO&j-IM(|o3g?0c)vvA6qF15bgE*pag1o)g(NG5&$z&q|-LLXZXpA|6la!L`52xp}Q ze49zSd##d%I5X-!l5^j~7*LW)SqS6#9!$!@?YwT)EQH|<-fHIo`07R`YAY>Zd(`qq zj!!oC%}vP59VP_0L=_7DC9;q*8#ANdvm`sgH4l$bL_aiOGx{P%@89)7-DL+6?9Nqb;+!r4bv1=nW9Sy0HwcHyyc^8~IhEqQdAdxD zdSdJ-mY&iP#JJOJxLvAJeS>Up&bN+HhI!fUbU)=r1x_Y$YmLL3#0^iLY(Z7h%brX< z_>P}v*gw~iudf8RfpTh3KiG3+Xpb#jrz3nQVL!Wz5I3}y9sAJj@Q76FEl%iiasGlq}xOeYu$-zn)?FwZu5Pp%wF} zsg7@4UUDFB6MP)1Bo$LHl`>NI-sVqkrM^ zTacFk^Fl^%640^AM+W43UFCCE>p4!kb;Homvzua9imtY7`pPv!hE|iLLx%TOb7vOu!T!^g+HZ4?LnKV7z07RNC~F#AoJh%xGmh`WC)x#)=Waq zpeA+B8e0GV1%eScpq(@GWzhX^nKyJC^M7w1$+t5&+~NBiEh6IheQu03p#mP+?GZ11 z5S~O3h>to;7>jO+I*|eSz&2%P{6D^zwN=Gkj8D3b;BX64tw@>v*{e05_LgoTEe}Qo zEzC1k$uo-GPZ$|un%r#%h~SvklH(>Hf_1$wyyXhc=J$Qle^X@04gG-k4vt9^m#T?P z^;5lB1d>q3WSNucj@4TjboB1x&zY=dI$mZu4FrX)D8l#vsGYrV7?$BfwX zFJ3YKTP`wg1s*I_!QZ-oieoW2NR{5q!OJqDs^-^2;=*pymA&ha^#5hY%@Z)sJMF zk2#59fI)u-z`h#eQI1bApqR9oYDaOU43dQVtffBaxDl?QEKb_0c^U31A4d04Pbr$L zX$A+6%SC@nX@opkTKSgL@t?dfubDNa_GLjavOV!aM^L509w=N7uo6o9qq9Van>mUN zqOpzbD)h&{YzbT&?)<$;cPa$_N%*K*c3~)-T5QKdNLNkt96t1=ZuR%2l|k6(9@bK$ z!KM~ed(}U5UDZaLH${AXu8d(d>)4YdV>JEoVn1&hW!+RLV)RM7vw>E5bK>`V3p=bB zNX!s>`)J|)d-`ApV>v4H_=Rk}H+iS@gPDd+MH8%xPkWAv*9=N_>strJ>G{4gN>< zE!)MO7V52dry5q*%|8-SPOA77MjqeMtCS6GDR+t0uPPm-NQls%?(0Px0$o3TGj@vC z>+ayXo?jo@IPTP{>ciKN;F^fE0Orj-v9g%O1xm{jPt8Tx!mk#`!;fT5QO|l$b8@ayu#@9JSFVRm`>eK6epL1pQ${xev~oSe?)d(aTMTDt*)|{?%0lg zX5aUsZcQ1a&V4U9XzkQ1{(As5(deg|gcH=&fV7?{z1$oW9DU)}9X=J8tSXP}!8_JS zLwnQ>!=m?W0dg6^6AFFEK{!iwQLXdqStn%<%fosnOXC@j7mCuMJaEk)+ecc`5xGlE1<4x)|Ojt~vAn4B-=~IwV6qmW7(w)g67__xEImlC8 zIwo=DtNg~1>L4pATXwTL*YapcHh$7e3ea_Zy~NJ#WRPmol|VMmJ$A2qPKlrjsCyvLs_=Ah>5}F^k*4I zJ%3KOEL2{Ldw)*+mAb~eO5*JJZOf9Usj!b9@$2BhpdnI4GPtYD<3nz?=Zjdj9K{DVaB8n>BHLYV2ymAhphYZ zY*U|;JgGz#QMqJ5HIhE0@LLP>am2GJc+y){wi)gIKZ}^Y{u$}KMNG58- z5xJ*CsI4pQj74Y%A9p8Jvk1;mzXzP`Q?N74a*`;TAY3T*hrMx~ai$;_Ihc}pIgHS5 zo0Doht1Grojs)=v&jplCC-_}1alY7Ttz9a8jR?+`eUKzXr<8txYtF{$Z9Ta%6gTQD z^n9QzBk7ODDCEA7>T5+DG(kyfXk^5b1+-o&C4-Z59t6G{e}P9ojV-cqQJsMw-!^Y< zd6v2F(@0BtP^rG{$w}q&<<0y3(1{}8Y283{%PcBq1T|Y>>%cV(GIZ}X$qIW*Nq$Ln z5DFzZQ$&Wwpkxmc#v3OSgK5BF;9<*BXHKmCoP-E_&A z<=dHRT3?G#{|@HxQpYW`4~lG%^63kG6=FE&Tc>h|XfI)=WIQDm?wHGRLnF9B>We=J zq#`EUQDB{sLfXPBS;w0$vD-4Xl8s6`@cqrauCRZi>j~;)U4g5&rMq9N zDmv*hztiWHu{PqisK~|e=ow#zx=!hPkXT4|ra<=gPlTsgMmNlN;?+>>0dI`*YU3Lf z(g!(|Y4lxb%TTz4htj9a^AzUfm}oELf^7NhQ9^RbJjqM*xIk^8CyYiBe$Jqq6CJ1( zW8(ag=#*5l`iL@TUo88^Em~rsc_>`3yRf8}VOMq5$0G@C92Vp1bcko5mpy}J6p6c! z`!;1$15{t9&P9Rk{1~bniwJPkMPdWEr7<*>w@}K zd?88l#rIAAc%mwpy2;zWrVWQ>a)KTsj*D8I4alr+-g+L5v1ezu;eE*1Q|a=7l}DF6 zDD_9Mw}Q8HJLn!Z?O}Nk{d_L%sAp(Sc=0Y!F)Nm8VcA}x9$~q#AQ|<9rx$xFK`WMw z%IYxM6Xu!q#3?N&9Kj+ICOVqRgxIm&&#SAkV!}pKC#gLCrg=O`N-b^lhsv|0Q~Mx0 zr6)q4oQ!HpqH(g2z-=P|-sm&n#78LmZClZfk4n=mM#}|Cw=a!%%2$+SE#D8DCNM)B zIpF^UFC-_R4Go&`y>>tMlJP>i2M_jimU9ZLrIsC4tM%%IgY}NhA(a+BcdR-5y4A(+ zXLesOve0i|HEvOX*OK8Q|G?ivQK7W3!?v!gGk;mM9e%9ci`vr>V;Nb)n24`NtVRV~(R=Gk1ORMtPjY5?hq5a1OZ%dyVQZg> zCd`3)cFLenWT`7=j@(mRt+;BOHGrhIXDFzLFJAn)A0pMYb*nB+4^M39(E53?L)DT7 z*2ru}Tm@tXrvWvt-?~zBIXzyo9(!t5u_i>{E$`SGkK=LB6N$8kgc?3ME0l;jn^hCGcN=XIfU6M_3s;qu;($YhP8;A~PHA z)ZKQHy(!$lbna7`YnbXF9GknEaKkE9jrn@CkUuD0*Gf3}1EG3AWnKFea#-ais56T3rTk!5zT=4}MQ?*a}PCpzyZ z-;*<1EH5aM2dP6gP2=|L;J`?Xf86>h^J1h=jO_0RX@ohhJ?w-bGhGZInKq<%%&yza zev6V4^9*90cf|=>{MXRk=vZj8v_Om^QY>1zj#}NM2W}1|clK>!YN8(SMaxENS^>Myxwb(a4W2Lo#9+-I~d3oW*u@jor%>gIZwjd2@%ZyN(RM$b`o%38~F6D&}Op zT*%Yy#4%ImGE*)P21uGR6;@dHurswm`0>GBx*L)bu=GIOp$2s8?)9nGK-=qN!5g-W z`4atK+P)aA<_Jl$+h%(pJ*xk9!Yo~%<5@Gar3Q(*OwL=Klz|JE>u?othC8UMIO{mg z#duYUZ3&>_zzgSm0B+dGW~eD*(G_@w9C%!Hl%26y*Y?*C#O=lSY`vJdA+w|E7i`eO zQwKj<5~>M@_sBzY>HN zss(&|v&H3Lwv^SjZyTa_K8T41b-rPV21mX&&}^SY{~J0Cq>ZT|Psj$!)i-8hRLi4N z|6_;Vm7I6#`|>ZF!7E7W0UD7S`Tqmwn6?KZ5KHcniTp^4E|-rC9U1GXl5Ac8@A|aF z9%)<`&Abp_P)Vs$rCIrGL3cpp+E0_1V_Da@g{-wjd*Q@Jvgd&R1myegb+aZ(ou4%f68;& zNgTpL{$3d7GfQkv1{eM`0Q10y`SOz(geb1TGr|*C)gWrTvU<(XKAZNN-nKYF5|tiX zR|ckhEg0)Xg7f&me>}RXZ+*CS|b)Ph9dQ=GV0s6tsgs2X(RYsV{z z;$U?7run)ho<<___!h%{A{VS&9Ze3V0UAk{=u*;hmH0UGGRw(qYmh5Kd%U+2-6 z!QTm1gb=M}{&FTa_7dE%3~~WnH_HLNC8Wl98zpu1ppvou^^aY2Wrd=rgQSMA+p^Jl zUjXX??YE_n4tPPNt?_yVD(c4&hEYvc){KGZ^xRFzv?2D);K$LIDmsE;WyvcCG=!$w ziJAy1Bco}=MvH%NYbDFougDv_X>=(3+1V1m?x`87+FcKt?pkD9ud2r77zhxQWH^Uk z8|lnuA=`Mibp&c&&V=S={>S>uZJgaYWDc|jb_Y&PLiOA^BBiyK)?Mjsl?YOxfJq3+F7mT&s|CaBi4R0NqFiK|f7j#yJ7yu(YGtd%~KTc<_O>hyR$YI-FM5`x^-t<0}y z@g-)EbT?@c$*!a2g;1@AdseV`_OaEn_Z^h`yP~!at3bs^z(@!AP@>gKYGp0nckroEQQcUVgYi%)m zBKz7t3zHF)FvzN-j}wCohj1Er@*St3cb0^>CZVVsEfy7jbGm(f)63|ddXwG<4u9RU z{u1bg0PR(e+juC;A{fzn4JROhZ88TH=5EoIo09KSFYz3>?qQ@Lp_l|`GZ&)yqFI)N~#+wHJ5l31s8 z{7;nnplrmJQll}eGA&-E+Sy1m_+EOs)!htf)Q6!t=1D)pSP#3sRcPIKx8aRI&cisc zlV;%w1veGYs`)0dk@9OevLiF;9o}E_!fvbOjV-?_tm@*$-z=|m%L%5w3!FAcyW`?Q z0OQL>FnY<5mDl^Y4(4OZgiwn*B-YO-{~px`-vqe}{N@e@Rp6cI`)kkpMt-`3o~UH- zV^_*PN@HnWfy&!PjuF<8eN|*9>aoJxHmp>2Vz#rnb>2cag=m0)UODuCS-(q)TSvq9T%clik)DDgHcUHib&gWS!s>BOm z)S*bnPl(VUEuYK#8)74YUbovPH%zDa`ByE*tlV2NIf&TKpobPe$8I^Ayq2{Ud#CN& zDhc7e9L-2Sb_{RSYn{36Q4|BsM5!JCdncctRVm$NBnJF?D6ftq#({OO9R=N%*Q0cpR`pq(8to-S`}s&&=lZrs?&lI(hG8{0$+;9s;6-4oQ~Iunn| zD+noI72t+kqtb=}~~1E!VeUF<5U7gZ=gml$~F&nj>_*FA8!>pzNe_lrB?_v-dck#RKP?97@#E& z9Go%Sf0^F9g7Om?R%_y9qVBxVj6FF>Qf0NaIpUZwZAyJ2(tGJP`QfCIG-r7pMg^U5 zurE*}&dGMJm>swoIOp>0Z1E@n{A)T{^IWw^-E!{do-7LHnVuG>s3$#S*Ta5=cFDDF zr?Bp%K)ehRtawezeyCpUqV<0iTa6_~K6l-l-PiZj$RCcq;BvSao7P-dot>KfZfVbGP_L*Sdr0$hoYD&HNfrKq?__M=R{x`ZB`J5^2Yl z)o=uvkI^ktBK_0x1;WR7Rj65`NToy>N){))M_beFC@irRe3}{Ps#wu8T^&jK$EFUd zjgg`2etb!YQJlJOH>$Sv?tYwW=@Hvdwzr8dEe#6d@yCf~Wo*W9LS=;O2T)vW&1WSH!SPx2Vx|a476%J~`&Q$kjCY9FQrt(kX)KD*E((ZR3Q>YSWm zFK?DN9Q^trD+t6YOZ%?e0M%j%Gd&-iD{$cGvsv}kCyTs&OsPeN6tkK6W$1ceoy}QN zTye!*)n!uZ3uyCJw%76S{EvDsBU79Jwu%t*~I{O;7PBhcaf}0RQd2u}l!A z=d+LQV-DuJct=DskkKfuzMHk|ojSDjDYF3;@{zpdF6eVs)6;nV+<1;h|6ElnxXxFc z1AqMUXM|~$Kl*IIzME5c#{8y!I3l8NqUu&gPZUk+@K7oF8ih2UFZA{z0vL@9?`S^R zAuyaI_w4USfZc?{&j*t+4zGK@V2FtRJ_~(f?7syLz82g%5d5r{#0s~!K!hC|_yh`- zK7a9I^N_UX8p91OJQcNEJX#W8R|9_j@N*FO=bF2)WP0bTX-9_=9$k@RPJ2#>`m8gh zCDx-NM1R89*kL=)W-d-PF69mt_?-*QMQ=9{bCc1^n(rN3Gv?w#7+K0%<2``DNEk}< zYcRP=?RcLFv8C?>*5kMgIE!AD>yB|pP`kqyWUbJXEY>_oyHbxP=B#8Zu&;kY0(Y5- z>iw?@U=yaW#QR$0Y5nHU`kAwBe*>U9fF(38bM5%=26Ge)^~N7lxG(KssM?^GtpAg- zl$e@d_e0b-7=9j?7BHA&A591#3p6Ug`M9*h_E75L|6}Pq@covv96#SyFVeaEnEyh6Hn-a zcYs*q{oNV6GFx=hJ^C}zbPo?UBi+ov5joZVf_#I^U3UhBSh5Ewc#ZJ1mI;AqnyaeN zA~)H!CAy#!>?aFM zkw$yq$*4o|Q(UTtFw&Fp)e^1Q1|FiS(-?|A@2d0S51(5Um;j)#eW1gy%E-cfxc1;GfF9d_->XIBGymO~Ha6c}~ zGe2p$G@R!ap&N=slu^-_YNRu9d`S-xa@_%@Olyo+vZ3{1If(ypISJpY6j*m@cY0me zmf@cTm4?%v8#+9X^A_ZJt~%V~6b%oj<`#=GkDe$x1n8 znn~1wNTgZbm*ZDB(1co-n#S(#x4TU<&pFzrj>LrM%il4WMM~Y6cT9g8DGXcd`QEXo^WTj0x$rF_h;d|4qfS88qP$do806_YXP*1|gZG!AxT>cKawZ8fuk`QU z7-XKiSjzKBbn}qw))m6!i-^EXcr0eli@f*?!s)+@AD@I`QV+U+an*>&%;zwKe4vhX zr+LXmRJiM}`S~SQA{jS-8b_NkGY{|83C!rqn3fTudNA}4!(~AX3ZM<&;XK=L0O(*8 zh!T&p554Lj+ElkKv=9kqqFNhK@i8p1V0O6)K%WkGqDHjXx;ONe_zuaZv|8M+CQ$!| zkH1h-Ga)A+o6!07yTtHIvv0usAP~f^5r;m@h}t6=w2?xzJ*mSStGU36XFL{>_z8Vt z4g40%{QXC=Vgqrb&o8eENu(LjJSP1rY&IA%AeQ7hJx05!d4gDKG}l@%=!3tmzZ>*Eb!dRq8eGG3uKiaW?;iS~n^2IlHf!lH8A zcuu#ZA?bK8>84=*+(9ARub)504nH{Rwd4YB+fW$4ZK9bPaq-iyI1_EQOV`ZPIeCg? zG=&ve+P_n&2F}At?>L4G87>*lVK3MGd2JAmsNmIX^CHt>b$V1fluJSd#Y9UH7-_26 zrsyuJt6zTsac6#wu?B1eM_v#jLMjPp zS-F9pHZpnQ>4GwOX>-ydk&!W6@v!GZ42;;-!h-G5Cu|%W%A*RjBN$bolfz^pAp5pA zLw@Rg8Kd)R?L}sm2bBSv{ML0@KtDT@VnF`Ox;v#1RonI4`HzdK^0TTZY_nFX%gkUi znW411&c=4ebBAa$RTYl%oYkSy?3s#1r3}V5goG$?)VfqM(XBs!?^XnJpG2%w7Id?9DUb81ageWq!O41 zOH7a3ms(upe(Pv)(MHYl9AD;~AT{3epO$9&h~JZUB@$@$;qbTG)oP{H<6t;=61|+L zN^GD>7)T$WGNV>2!?pjT>u5fp)_>gv3_2C6s-HzijtxQ_>yIRRtc1RepLc}%2q05q z6c%TLnXa%@o5?KfBCKBh&G;4UhRLdrxyw8Kk`U$E26Zx=Z)WX7( z8(n{qR4x!sKih2H`?QL|V@qGjI)@oG44P~g*^O9qng`$QPkQN5&3E*q%gI!9?Imb^ z-;Itx8G_p9I!jch=rBA{uO0LtQj_jDJdx7f9O)V!Y6-bi)7vzNCji<6C_xjo-+j$T zH!H90;s%RgX#H$hYJ@f2?2=H$MM<3}yP>3$DI?fI0HYqAhh95TiN6+cpm++dYm8cB zBLttOY$^;0?zcENr=7>GBgBr%FuV__BEQiE@NMx}-N6HaViV~n*kvb%g${Fl@Nm^t zo}+pXpSw0~dEixO#>7x;19(;+Df4Z`SQo-Edi%M_AVV+kBz$9f_rWO}{ocgMCYQST zVVnLp2B+n@dEYs)(iq-6F2u&QxAj4S!3(QB@*|Hk2u#6ww6pocNDUvaD!vmK{KTO1 z@10m`T|;czJj3@5z3j)4$<@FUR(zUA(o*somuP1x?*~2~?h?dbwZVr{bk3?i#a^%_ zGomwxs@j&v1X$e!O=ZL>(6^s;;Pk{YokE)Pw2+|RXPk#UxKFE6fDo`x@1i`+ zKv1N1V2+KojmNccwz)n1Vh5z~dq_m^$!+a{DS3gJIpsn`VDD24Kr{Bm!N(b$>=MBrhXf@svNFjR*6MN9W-p_@`d)n6FQhbS?1a14Y20?iE zu(XfIX5;#8{RE!6^Q&bns@gr-3wcbhXyUo38E=G?DkSJjKUjIeD{6l3{1I_Weqm~X zwl$sqzs$=+sZw~ORz+R9R|p0H+KxWM30Ix~a60_KFJ?|~cxFgvg(PjTt8qimZ#o4f zvW+u+DNA?_-!yOJd}tV9hdfkOB`#Y>NAhf77y{fwL(Mj6rCOi*9AZXINa;{z)ASgEKDQ?kL1Gnf8xqc& zvc%debHgMASo*a3dFb&B9iE!+o~72eQ`ad$Eo|CCBN^rjzO_eOQtS1h&V&-%&Tk$F zf)R%tCT%O`-eBYL=u1P_S_E2(Q}YPs)Yx#i=z+jbb;##77>Ii;UXqKp6rrychZG6j zMts$11hRTIW-F^*nuim)eEh17usD%vVRKWkevzidf~7k7@{#eU1OWw!Ag3PGV*k0^ zW770J8*v2JJ)sT57J)Ak(*^SkL3jIk{GKg1Q{``gQGI`ga|K`nF>Jr2(gcG9e_wM| zyu8Ldm;Z@$87FzHv%oSV2)TSD@1XCm*lXtsazzO)ur^Cr6vRq{Kci#Vs}J1dKdXvt7gbG1_ zMxUL7?2uo(vFnFUfLKHILU8Oeuqq+u%cpO3YVG4?eVl%Gd??ekJxrTQ>m1wc9Gev# z84KD%+s*Gld(@eZm*gweyH%u8R>M4Am4aM*=A~jt(C%oeNl{XnGfhYxSCPbXVj7^n zVk276cR+@Q)6yYN3Dt9y`5W?o07;C=r&VpR+q;QYa9W!I|Dr1<)*;JCpOfouCZERJ z^WwI%kIR|8^_7=w{N{x8@ZeH=!*3=x9=}d_a3XX!vkI-2Ts0i_gZ}o}Uh)@Ik-r(Y zP>-|-Tx9zC%h?#uz;!02O1Q}dQzhTrGU#mMnipZ6e3AwW;ZB#GuA-$^xA>|5Dy+t` z$BrIrHO4j!aX&Oayo81bf75t8Px~bF-`yE!*53wvEYy6PDH(_4?kw`;K9P?kc&+Ze z2bYg@8g)+Mv&<=Pt_;p%mwwoxY9p(XLUIKpTv46bi>n4vIbi&*=8zQJi~nX?*7cTO z$b6vRmBg}@A5Als^e0x2qN0xcM7)`CZdJ6=;kifMPe(5PPu}rDu?p1q`Cr<#u2qF% ziNtc`5j2p#o2IIP{jx_ndOS7}6iLa?tWOOBX>c4BsNWIS2PJ+ZlQbqE{;INw=h%(l^=#zrs7e2uv8emhN=zEa$s9a|jOD z)X;W$zctU-ofi?{vQJ0Qza+d5YFGOUjLnpB_?r`W05K$Ab|(MO^uwYh!kIs%Rk$KOWS-R;f4AZG+>^$FWyAyBnK#2mLmhYO`~JUB4dc?onSNtm)o?tC+Zacm8xtAV#t38O5_Dgtun#vn?I_ zThO`@{Ttq;#Zh_f*jkiMFsKE^lEL)e;3KH^BdsXSf6&3{s2d?)N1t_QzPYo$|KLd= zb=W-L<5NGEpR*Un_7CG6wB`}?9d|wa{O2l{hga<>Y-HrCLV+Sqg$CxPYuM!a0_wV! zD?1Ec%OI9jf^c%jaY^rktZdPNZpH_pg1|jr=?KaQw_7v8Cs{^U>@JyLVR_IR_T3(^%kB(6({;%IQ{03J`-xTaJDpke)8E zE$h|(X&g&D=v@oM0k?7Y4%OB+as0GIe$NB3umHsU3+R=QdhTiyn*Zso2%g!vQgcYh z1ccIkL&v#(;z6u<8hS&>7YdlNu)T2{fMM7**#_`P#E{MN%WR|RDk{{>IV*WpamiEK z!YiVpWeio(a33Mr<5*+^2q|R6`SuQ3cXr1h3&2{mQ7#Etu$H8qw~42=!8>o|ozgZC ze$89;mNM>iez<8T7tfRY?mpMXOmlzLEwNJl1t)i9?<7qG)Uzp1C*U+r^8ek{emUhzqoZ>Y!{nVV{j2IpF$&K4lY7M zKcviocK{=b7|-l2hs1lq%repbYnd9#^o^P52EU0{+K>W z_~@7<$Ps}}!$%MFkq=D@icsxYhtLdXeTYGX)eC`@i3|=) zi?7k4EQHixh(^M9k^EKM0YW4K>Mkerp*_U#rid{)6jZqGM?&tSDyOwQuOv;NX@BT- zF3EStih7c{8itSJt`f*Z6THFEG0Yz>gaX1{FTPbdpF77VcG^^Vi_P%4>&(!e!mlDa z2N`(l4QyX9yrPGg(F?@A{P%Ok2C`aR&$VRnyhL@|Kqdo4O3XRb`3%{JckEP28kUI6 zkce?|&rK4tph0h(={QPaGag|d%RCp%?|rtHSn{RK2ql8zb`)VTLM{H0zXP$7fs;-i z35kEOu_40qE?DOUC72rUi?Y^*M}G5nKSHnNV{%~-Gpsk)gSIrByC4L!ip>0y2=f}+`;*Y?5*NA6kZ&*tr}#_fx)U!REpVk2 zAN+>)_Kqd6Xd{A_{9?Iqx7U0~`J|qgu)bmOj~ff$N3m z_a3aU+tCniMO&!rANdo3IKhe@1GwTMbl$+K>ZTM1-h>F&;+f!kxxB|pPCW-(aOoIL z-{UbxTEe1rLL5&$NG%Uv{x3+b%P{ODfC3r7IumbiTol2dq=cnrK1?MWZo6;fL2a6! zzSp7>IDpA~b;@iljpyujoM?Y8UxRTgKEG}u&O27O``#gK{#!S)6y=;WHLtsy(b}1v zuqLd$Hv%B=E`282clK^$AD$*K+|Vqt(3*dBsaxeQBlo+bEvCSx#QYbvLRQWIOm-eC z+l-q^cxYD<{f{q&=$%S-BXUv|&QS5ngVw1oR^yjNfR!MpvJ`A$yEjGo=XP?teQ2zC z_3?53=?^`J#^WNIPsXDFm4f zc1rZQ(Ny-KYy<+a;*%L?IR8zV4l-Q~-H{x|hQ32Q#%cjPzTW$nK-zHBt&ZR0hS?=! zOw6b~AMyebk~Ip%2KeqYY5C_|E-$2f`kouZSU~+W_dxtGF*DbvQP5?kVjz~Y>HP#Y z+#^zS0wQUb+fns5P6IX$^O5DJ1XEE`b7%Y+0&X=X@Fykbr>~pMksjg;VH)XtA>uW#gh5SrodOy|md3NO8Kk<`d@Bl%Lm< zTizvbAZH~iBXOKIvhoKg#u7vqqQPJfC+T(SOB5vCAQP3k&r&IN1}i`kC`<-*+uscK zKTe3P?$tr!MCIkLe!qV+KuTiLZ}+T`Oc=LBk+lj>o1ln$B5Udvhp8CN=!McMDnXBS z>vUAygt`!Clc!Huh$oLR6>pKALbiGU6C61T|)KFK_}JNCjJ6ZgNmKT}NSzHlhZO zv;JcC$e1n0ho#vZ>JwfJv0 zwYMy6NU4HgJ|oEY)Q7jPnle{#OqyG0_7oJM7?jykBGn%6b79bONnZW^27L$I^vwA=^jo!wKO}(sC{cLQ^8u*ja0RYL>Wob+xpO%k)Ts z_kp|=17eJ={{Q+2e5f>q1_o0XWQJwm(ZwkN=lN&HRu7B|NX`pwJ7zTCid4CVvm2bx zrRx5}StWw9z@+3MrfPYA%M&;C9&-%`)L zGsg`l++?F z{H^WyzWxbgZVs_F>A9BEd-Rfbq)uS?O(iB{M$O%KmvrvR4rpU9TrGBQKGWF~OKwte zr4{s%K=xif;V^@sAhka}|Hl~6u=Ck>7I8=BRnllieMlX?6U}s&@`(L;1d7-g0sNhU zgufcY$$7Zy;JGrD;Tr?P-&CkQ+A9`M?;nga7+ zNmhcHDh!(G@Rm+jlSpZMlc~KD>HZyMU%X#Ya<udyib5eS7Tg{4*ofh|zj+tt35Ay_&u+aub|4g3bC z`vqOZ9ebhdfAuo8h(}0I1y9~?y9abyg9+=>l$4tmE%;Eh0_kfQCW?B3&GdUUx$`-A zIl3pHP^4{9Gl}vSI>~3`e-tMx=j5!@%KD#?L}@NbPwdMdL`T894^mfT#q|B<2b`!2 z=1(^T&RtT0T(6t^5YQbMr>c(lx60i{r+Nksx)3H0uEAgpCB%z$+8@AX3Sj;xLR6NA z)BY0pz9sc%F2R&b1W+aerShIst6vE$qH&*Y%4`^jwThfs4LIA^bNtFyC+|U!w8#*< z^~g)tmfyuFt(S7?zyZ>*Bnpo8zGN!GqcG*0&|w4^y`)TR03z3xmqbvEvW?Q$QiW8P z7N>UuIFzi;mFSD3B&W^l`;G|FmPj{*C)EVk>HKBqgt`XgLpvJVF#LO7A@}cDl*P@y zSEmLOY}n}C$<~;W#!#l{51dtl)h~ay^YwP-3F91E1^*QtCtW+{))IoPZz2O-9;AUK zqFY;{; zMk^-_o_R(!Sp=MEN;}(wNHx;8_%A$1T0s=X$e;uKK)Fqdja1r#n}YkgUuu? z0)orQM3gaBt;?L;Xgs-_k(acnxVbtMF4l6Vw3Emu!$Vw~Jn48&2{$VwmC#DiQd{`v6xj!BeOe)X%`j`Se|Y!RGUh z0a~-IVv7}LQ~}o;{^y2H1kq)9vb(!Gj9A~riKz-}b(u;jHa&YJpT}Y?a=V^oFy`lG zCuSs)`du|;gX8`e4i(vW+A!=MUNtk0?lCd@W55~nB`wo}xL#C(YgZToSj`N`kS}{) zlq-4m4Sns|;&_lnX{k|!U39!*7ba+OVF-d1q@ByPft>dgBpuR^h++3z-8fr3ovF%m zlwCl24u;g=iVmh#AEl2#JEf|c>?3~MsW4EpyJSdv)p zeJx?Q55J%8<;6#~x*Ti@_na)Q*qG4+@G?5mQn0K8}}_H$Dh>mk%mOD>n z5m&p40FJ~k6|jVn$$FyWIK#cBqhDZW9B9oP!;kI+Zj%SbP*zH!w&3!P`_#dWi<2X0 zjLlqi!i%{4d2)&jq%q|Ipus7x#QQC}Z$?`b40{?q0j^522v2bOQl80){U?dvEhkprtI_y(R0nw6o>)3M;pF4ARWru6UAt( z7n->Eqt^uU2fRZB9b*u6I9ej2@}vT@P(kwMr<_xtZ1Wy&-jfKkXMHy5Qm?Z|w@|^N z3+5&YwxM(gA_M6_YkJ*pFL{erQ9$~{b9oxTO7{zpO4$AFKM=e>^ZF3qJXkk_ zc|22+GF@qZMAp?x?*iU8RbcG4O(XSzF4_`N^4ZoY%6v(IWp|s!XHl**9>6)cxccuV zx%jx;tO7agW{zmZTqLQX;1g#zd~#{WqIvq{H63yE0(3U$NRcuUWYQPdOA%}Oz0sWJ>{0VkxC7_yE17Dzi;78V z{==EoRR!pAL(he0tzh3zat$-x2PzWrRI{#Cd_FszSw^G{LM>ay4}ni17uI4Ipvlg; zxVKY@bsif{$ze|oTgDlc*-QbQsw<-Im|q-HT%E5I-%>A4eKq84O}6-g8h&!b^Kt9^ z1_mU1?7aQj#mzmvb$A>nsapl4Q_^O1)!97;Pq97y z!gH+sJ=GD-ukT0?D0S1r>sQ!a8z%^sf5@0KP8)5o>L1#lV4r{OFISwUKR7uPO(uYN zQnsJOgR!;Ll338%C6V-e1nL>UKEHIol~Ic;r9_*;`lgp$#TXPP>eWp9L@yFp7=%Ig z)cni@3A^n^VHf}{tff1{H1+c*WWTgllEsQ)4LUK+J4F&viasy)iQ|@P^xqCvtP1{_ zj*=UBwG7}-J`q5<%dcK0Pztwy@$KK92eRnK#~ZjLLBtdLbhujI zNvA)O@<jOKhI0uENqfOFPNMq z@Ztg^FtRHTO1kSPKZmO?rPU^c@UhzRwJB(Q%1zwagYh)cO}UjJ@w!r86H`uh)b^S} zM_ZHMrBGa_4mI)QiaZ`R`ZVJgU@RAWf|uefxP>~skN-w3^hjIe+c z(@uYCi#{x3Ag+qVt5~K}w8&0h>yAJ}H0hqWuvz-PZv)hS7SzeC?;J|VP^zM@fdN(= z-ZIdKQ;FJ|!q`jnuUOrk@w=a8ZXa#0>K97J$A@23Ccs?5n$ZnM`x1mN$}Fc|y!Cu} z`n=&rk|}2x>#5g<+H)<_|pfl_gw8unT0$Gaxi0e&H+GIG}i51ifvajaTl)K{wZQrozh zKb;(dl+){ydH!9rk}2qbUU%VK14%pdd|LFy2j4QaJHGHhpl7rKUe~Z67Lx0NpYNZ~ zH{4{O%x{+rwG`1nD9h0lo*J=dJ-_6Pp(|jmbNgkU7doN%v80X(V^m%&Z!0bysRI|Q zfKg7qv~u;K04#5eX7Ziaul-TU${XvoZqwAbxcayjAAO&5C!v6~g&~1~5Q(pU(?#P&i@MT@eP(_< z2~5jlzT|B_VvJ5Q)c;;wGz)TP!?B|0scz3T^d3j0fsJ1y)+OPBOArOLKd+qYXGJ{EPRU363#ajfGEXt>u{OB4RQm2pJs$ZqA5@ zygW_)oPQI2mV%rsujs$F&%iH6$j&re)F&VnSn05w%? zG;$)}iU`xlMpTW04>>Ni4V2r3CJ1>dw%=kE0L)v8^G{yS#(gLRO^U$^iDGYN8Ee5m zThUsh^dXGw@PZ@^g!eaLivEi>VhQD{gpOQ_II0$lCX1r#>f`?sJ};+l7RF8&{_?2M zy%oRkTkjHVDzePhp(V19%8NwOcM5&yq?B#jBe!V#B6-xDmq6$=tthhC70#U%_z>^J z2N<(G6Xctem~Zv<#$BcCuAc=$EEj$q;-W~rV{+FhRyDmLI5_f`O9Jb~ob5xF+(Ux` z8i+fjDU$>%p}IsJv&GwQB56VFFZp*c!lrGN5K4_twC6ZXMHv**K&BTNzX;3=REKs@ zt)iX(7+z3GJTn=mU0a^h3DWHh0XnN{G6nWZ1Aa1mL_{GRV~%OjuGVE5PwLo*`}F9- zOZcYw?s9K$#)`UIGrKKZGU|Z-+0G{7ocI^g$^?T3T3k16~d{WXFF%4ML)}F z<9d21C~$HWY2$6{^0au>JRM}Wo>>M}(|P(R@*uS>b+tBrdeZoJtbBY4_BSc*M>pG@ zUjI~pkmtjpfQp*Wd=u>pzeAh=za`jX{o9XWP6g6J zI0Nr8+tzM{dTGWM3(OA6Tn7Ta=*+4={i|a75BQ?5+w|%E00ctko%E)!7UMx<@dp*~ zr#1imO$DAn`#$y-RR`^ zPLU-`?P&^OKv09Q%59 zz@=+8yg=Jef_btwyKhIu|L3OZ%K5nJv9TV+2~yN|Ju;Z{SYJdTGaad-57bbc)G?Jr z0|@6cxY?R+pt72ZPd(6+J?Lx3Lp27r_U;Z#C}c>eJI!~Px=x#>T(y=Mm0q2shbX9U zewc5Bb43kvmm6*4Q_~E`7TqNKs9v4Y%2LfifG0%DK*5DeLgbI+==$yY%`bu88b%=w zJ)bAn-K@FCe=A}dRc|=(k2d`oVvF?keYSqZC&iUY*7Ejez|7kmm@uz%t@MNZGyWm$ zX4wN>4q=Nj7uaVV+In@H<(K>8Sa@~zFB#V+y_@WTi_oF~*4bEg&+YL)n=!yNc1p0( z68DS0$}DPcCL*32)p~ls(hGT_#vBK{d-=*OBn$NM^;TSnzH*ho+O}eFg7aOEpQ(HWV}Ru%WLi2 zjmVBQV^xATkPi>21af%XSnOfoM<>o3JG7O64$Hy_0Dhkx=i}ze#q@U>{9Z6r-DIgM zNW|97(1&-hdCDaK7(vN~xpx=CoZ;0}jT@UQRlb9q{YB z%BX_eyS04 zAVSDj)ZXs%%wD5D|ChFfg-acQuTiNzU(U!^X*0^hLyp3YQHA-Glj5AJOEZEBkIkts z&h;>Vq@{p!sa(mgQod)%Z+qCNQ(qRDN5M)5#+(&J8trBY#2^kegq~_{`I7-I08EdD zHG_Y9{dwFGyIU1+)))iDV8Fjc)NF0OI_()c!mDfTcHmtIG=BPj9Hu6J(j!?vT|~=A znn?u}a;6|)cilR{4fE-l9^pSc!uNr`30>MmWS-jmeo@uUIU!6HxldY3ysE|Px#1Wu zpl>wvaooZ06Ws^2ITOz8PMfF>UkKu4J8;CC<<=5-?l|;iTk01B`#lRFxM{A>yEII% za92#CdA?B<{Bxt@^No0lh?vtOz1Dx6XIjQ~zuUOSmyd@xm1dM5K(8YuZwNswqjl24 zsYel2E?G-t^U-_wkTcM6_4VZ*!NOOLeOrt06$MWgOk+X@#5#;dAAt|B;$)WfGAHr4 z0sW2K1C#du_$T?Aml=V9vG6lvBaaKiU^UP0S=??MJMFy!G#nNS&k`E+?iLh+zB7Bc z)E{$vkC0Hu&~e{tQ%a=O7DtpB8eOtLB~K}`mrseVIyjd7DcAa&EFIt^LD#mFG|qR! zRTnqQ2fNLZ%NoCl7gud7YRtfDT?_8bSV=K0Th{~92|ChdOC^HSd5G}l&xIud-{?(p z1sr0!l{xFHbah}u&WxV6UH@^qPgt~XoPA4~xbq8cSfPG?#1*j8+465FXIT>DqS+!@5XqSdCpUqxbc8 z4#(EZcPaR$R11O1Z2{f8kJ>hlz&XDE0fUF>7q^5qe)Rm}_X6Zx6NvimGR%UY3S}eD zaGxfOjpt=wK;*;XhrLIeUk!m!VQ&_ms_M11OBHe*Y+tI9*eJ{z>53F;Q=fw|0q?+e zWM8e1nw1;m_>o%iX8Y2DGw}-L%jHq^VBXNEcY>;8By))`;Z3aXZceH9IxZQmx&HVp zkiBRPU@(@$nP0wbs4C_2S^TeeMUrb#mswP|kpX>nCk1YvsNTlX6t=>`prmU2OY!u& zLbje0Jlb==ed5_+$VGb!@%M(~(iXwu{8kz{s!#rM7*b=oNb!L92DKh~$BKCpuoGRz;lp{?>g909A zzs0FLYyuwT2b(d}xh+5?5tkRxP!ze3ty6Bypw*p9H6HAJ_p z=vj4)O;Ki?xSaCPU&cpcDgJ3b zsAq{)W*dm=iq({)dPew9Pot5y4_$vJI3_ANs8%^Zx9jFIe&azGJ!dIMa>;}x4=yO! zn106cMUVZ#m_mz4r%8hmr{k%?xD?TtaHv0v0{t-g8l|f9srLX>(#RBb8>RpZw3L)Z zHMkyWUZkp(3tQ~Y(GCtBf9he*wPNuDXDWA+aR#Y!^R&N94T^hALwwQt>O2T zP9@SUfbnG$`DQ)Zhf;|ludKvW1qjp~(n;w!9jH7DvJf%WP6c)zR{3%0GVqmNRH@UQ z#i?$=e&2SA)J2)-=_lS7q(EmC={I=yUvR zqRv$e0}M@%o!1E6hC2Bs}VOAspxXIds===qk-bM%VAjW|D$pAhx}pSO2}q?3+Af{be_WIzQFrOME^dfi-#?7jd6nIKA`F7;Wdk zw1=3y0;!QZMhN1BHlx>|v|q6TPG*K>j^RvFJmR&kS~YxOUoTTKx|d)JmJvpb zeQnh1daPF;;PdpEU$Mqdum>!rhPwUD@(4S?`vnAHL7JzLC} zOHG9dr;mer*q+bPm>oOi!d!_|BylVAkb06C+BX6}`OD_FvqdPnn>%B2o#UYd{TGO; z(5Z|nAu_A*Y8MIP-LJz|pQPLu2Q*=>mp7Hi#|V31oudTX#+al& z?YR)B+J3k&g+{Tcr0_!L^94X~5}8bko)+}6W(NQo)(L=%9MId@og22WWLr{ zSWR(|t?@bC-zW6e1DAhyXwMAcg4V%1yv)b>9lfDZ9j7(tBTA5^zrL2q|FnUnRr~Li z)>CY)l@q*;#WBi7kYg%ppW&_bQrwZCL2smG#OgV8VdJL5UH7ChjozJQBelgJ^o^;E zm5{65;8*E}ju^e`*}WyQG?1egUAK)OJ{Ie>Zm?2n^7bI?7R@pff(=Dqk9yFZ?rKwEhSyz=UDSF zJgE4BSL*&&iv#RU=GW2||BXm6~agRjQZ?l}lE`3uFPK4>GcR|3gaWFMQ2 zKjTeIHNxC=^a+>fK2qOJxq$G4s8NjEg)@7e2Rp^@nxoIIK4GnSOy+B;AAn3BBo~GL zGr#o9=q?A=f*H$_2+!6BTXbgB_<_=F1AwFMjPZ)mwwZ4G$jur(=-oqhO$hhUhO(jX z2H|)I9-PJYRTRl=)VA?JG|WiER9hyR95P>Qao+wO{GW*W-&EPb;UAY%gK(OCrlw88 zjmc%FNginGx?Rt5h{oX2a)X3qcZWEBdz>LqyY40rx!;Q%)dIT(>E!2R_{cHV98;fX z@Z@o%SGj+uDD>$@pwT|+v;~7f>09ODBeXD~jPp6CVqV`lLwb<>ftAgN-COH?OZ5(h z!mA!W+e}|BI7JH<-+4jO9aNyWT>F(VSP*vcBB%pckc6zJ`03;p#4mwHhK#W~ySRYxX&0 zzLqmbc`py6Zcl7HOyZ`;#ruYeu3Wx#d)3!jeX$$fiDBBY8tP?C$~kS`r&qv~iqUB_ zfM)f1in{)mnxC7)?utnN!cRI<%$lYM; zTh<{!MH8=^^b=!Y|MQ7pL~2XeTtY=B@|)}1sayrhC2}w~EmlMoTlSfJ@SBTSg)pLt zu5;*Tp#;8a)SvV{%>6tD?H4eU`J^jQb(Wv0Vj*vlCgb?;eU3r>fS5^wEqM-_IP0mCTSCZ9(0j&H@IRv(GLA?O}hU9u6Brj!^`>hVS4G3yFA{kz479eleYM;G0tB zkfluH-sYFov!9%hYOIPpO_G-=KZRZk{4Z1On}(v2$X9WIveD}VdL_WVWGFLfDBq9S zyVepSs741JwdUY~I`i^O;)CW4Vqi;omhD4Nuewtyo~(v;YPLC+Dz0t{Ou76$`OxBS z?5AV*6zR0e2ia{NDm6V9rsMSy&bGxRHA!>KZrsz|e<9cKq^J~SnCt9;59QZe{38-ZCHRJo>Z@ODsz>(=sbM8WRr!Ti%LaFn?S$sP0I-#p4{Ml5j?BXX zSfi7aTdu#L57gP{t_x%yzc>_+sE+$9g%QGPGQb$Y&H(-_pXR|e2Gao`H#ZHiFr$iZ zGeGEu4{X{^g`ERZvPFXYHBv@U=0iagrR-b0qNoY<<>S_vP9{t2h=LWe*YtgD!xGXJ zvs>A$Z7yO#(}_e>ICO5Ys;e{S(!2?o0erI;VmmW#@gRtiZ;K1nCV$s&<}2&B-gd{z z_lAR2=5HXMP>eq;Fs##SJ@`K)op(Id|Ns6EhjSc`dBm}|qau6HWAD{K*0EK{rU=I| zvyMo%L*7wINK)3Za*XOIm6>&t%tQA4zCOR--)?TVW4s=(=kt18*ZsnDW8!EU8HIFU z@Gy9`Yc~PLq93JL)t3sY4tW^zNAYpwcLjX($feI_zAj6`Hr|NbCutXPqpRK)7ib_% z+JH;HX2ZjMH%%sR;nJHx=iHo~#P9_F2#Tb9KT}JK=#e*leYa)dfjhN|`y?i~=y|xT zoR03PQC^Y&Ju@PutR1}gk0DJV_7F7lJNeuM(|M$MUBSdQX(a7cx; zy&-^Y+}%17hW{}<^t^t&d9DlbU8ZczcGWTsViu%$bB6^8+T7)|4qtRTXdJ34U(oq3 zPP(2hOnB98Bv>7pn-0tOy_fQ+?S8w;Jr-o#b%Q<*dI_4H9#$<-Oc>O9R+0AjuUw3D zX7gN7>(+tT4OJX!(zH}K1=#vVJXtSjgA>{U9yGpo^&v7PY#iAb3(&av@8oP>zJxRd zk=l5-m}vpK!RyZ|qW%W^du?zEs1Ah^;n@)if5j>ncq%3bVqBrTQ8@2kr6WH^OTA~& zs2uKwcD!RlrmktFVeMFU7QbK@M+h_gNs*@JJ6#`}C| zO>QRcyuLzX9q<4Zhm{M}Fo~2S@l#G{hE-EvYl~?ViP=DUA@%7+bLbY(J-tVTFW;x} z5c`xR>6q@4UE}J=-EM5jv2bxxAaDuekpe9Tb*u8Q@X8tA^*WIV^-MydL~R(w-o=o1 z1(&ZO$c2hh8$}a^z#)s&7T;JzUovNS_sLm*q{M}SJ>7sBxuyv^RPy`f=5H+SbL2(mfezEMk|R(uRIh&7wxqQ18~V&vZD|N1Pyw3p$+#nW zL43e?UJXJDAk)gZoNn7xGz#^=IVzeDuNaiSRsgpQ&UT5fo%{!2OspVJfo#npBw#>R z4EPP+1u?9MjyjN!GRpGuR=R2Ubiwa)f)K>2SZVmU0((7#=DDVk8~DrJ0c8m#ZDS@0 zHZ!;X=(6CRpZ}y(@O?ISOX>}0k7$R;ml;W4hLK%W078s(_5-6EJqAT|kYeKJ!EQZZ zGaTNW(D96+*Os2Zh?uogTs}**qP4L!1O(a#BU0pst}Y!#;nxfj z1rqRic*lNmnDuK_Iw@Ua{0gQHcUkQcYb;ovQY~TsY3hBP$c;NYySsLMQNPrCgH<25 ziWU4vr^ZtrcS0i4@srMXfe7OVCppz7Hu>jS^-r+#Lg3{>e)38H%MC8hH=~<*!kk>B zD49g9JHEb_~qNw|AN$kr_hmm?t)^E|;;w=i0oVE6ool6vTP#H;Vp2 z1?*p~G*OaAbe=+m+k#Dj{D=&Aen5|X`Pxl?s$6O7R%e9pY9ds+=wth6R zx^g>(cgYVjCHybXjS7H^If1k`LMp~~sMXz_hom!@kfy-Wu81Y4Ga42e)VgrlOs8@1 z&!o3LWelH^J&=kQkCE*<8pcSbs2rx}KdH92gAQ$SE!Z%&Mmlwei)@m5d^tX79ch0M z)=uJL;81iLe)!wpIv|qW{2(biO0rt$$JVihF^iYsa4!?zBKxzs@qXc+VHW;z+Do{h zVRNe738tTa`Pv*<*_J))THDEl)D^9_%?0xVetmX}jLQR$&?tgnY|n!iq<&~c?Tvb( zWL(~iaE&jOAzkt0Bwg)MR#{mI!L>m}*x%Oej`E|G$OYdnA?|ohN7)!oqTOb)h6MuZ$YPUc z3+f%IX*AxRlfr;npUBTRbi6kH58}V@1bY*7iz+Zhlm&80y~4EB8{s%jfr&4~#qx9> zEeT2>@PLv}yQ=9B+w~F@m>~JH?G4&~G5I#{+6z7e>KS!i2n^U8n*XKJv_kt$fv-KR z=!#Qpc!TCIcOUB^n)mbNnDWfhsx!V90DsF^eJB{dD`!(_BPv#s{;JGy#8VAFA)T27 z9m++SF<2#GROsMsH0a1wkVFY9fOj0nlu@$oUdpCBo|0ScRC&3 zf_$(qt9T~j*uJP`m_3Rq;jf`E+_H~UNQ}&V`X_{ZI-;Lw*!(KNN2Dd$t*`WcLg2n^ z>s`2ZBdha!TwH}rXA>;89krZqz%^3Pk#ll6#rEYk7q6 zMmp+!Hk6Z!rT)eBs~VxYyFXri-pB@%Nkebo29`cVtj>LP*st@L^EL_OIX~FVKo6^@ zp`DzHXu{u#UyQO#giG%Jg1W2#B$n1kj7NsDHzEke^z4_L>~=iO{vo*y#qJ1;G|dS( z3!czltbA;RSxs+<`ZvKE{G>ddinv=Z7F{aUOQxZVqIqMhVr$~h(Tci}fx!UdOsaV_ zC+aJ=^T6CshxR?MaVtRACx!D1a0IkTe*yet$bvO=2m;Xp#8NHK9yL9GQtC?len{?) zlmwa;?wq?c9FIl?t-EM)i`5Ow3i&RN^|#yjSMaWk-nE|i4re*Ff;&`n`C_`ine=eo zI8Sr&`S`J?hx#OGMw25ktqJDazhYH8ppwCak?nHpG|^5mrh8xl zsE1s==BSmhPV#nq4~e>*dn@bFH!cQxEr0HYA|Rst+@TApr(~)vReFUMb?l*;%md-k z6Y3NHbHy0{gkfEnb`TM!&G3F-u?l*5#V(7oUWF~YqQAl3k%Qfzh&`mHcW2)W$&N%x zd5iMgRtvXhP=Sdjgtw2yHzPEYqJ{T!7Bpy&WQBr7kGVZDKfc)UzGejyhyU}XM{=B? z7D?Ceg8FT2c!AnV@jlQm8b(g7!yQ(zu`{m{jm5{$tg-v!K|up90*UQyZ^zsP+OHPY zRfEDWU*}Q~k!7p$tSMMaSGcs^N%PjOUN^P5G2&Vh6)GPPp$e}4f(`VLUlw%XG|)o~ zHBf1PD~^jx)9fP{(BQk`jQ> zqM&`f|4q_?|~Z|u#WFM+r;vjh8t5!5m)@H z5I?hdcCgn1ObosFxM_=Eg0;zeLfthe`9*7>Ol7X=p>>05{5f%L|LVU!1b)ht=eQ^G zk8ERJPs1K-rwWUF#vcqIS<@JwRR?PQ2?|m6RBSk>{$4`xVd3(9~}rX z&&f6Jd=iZb1%qop;X)~YH#aHo>Bg*&&N7xdkqT|`R^lS-ag-L(f*t*gLHFAL^04CM zQ&|*Du&a*va`=p`@eTLA5l*EW=0mxCLY-$mL{(Vk<;F_)p9!(7z#`1LF)Mwp=_-5c za>;lf>m6szohV{o!&_bQ<|zGys>g6(+FN4e_-fAV^GE0SO)29pXwfw$$3lh*UdCcF zeLs6=D~;81kL2WNFY5!SivObvN$7bafSf%`i;dQFf(Y2LP`{^<&OWxLB5mG7H6}|+ z5E1q?t7{O|@TskLLaiurSEyYz$A z>mV!;0bbL=+^DvmY;@j4){P}0{b6%?#A`wMm2K~J?JDMF)7yF*1Z5xIU7!_*76%La zhJtIeFGYDjVpkuD-guO)l812&U7_#QqxJQrJzNl?l9(iq%Jbt14J9>-U=U>`bTK_&^2ao1ygv);<5pu*@ZJt37WCz z-wu(MRl}a5l1Lrdo1clu4TDgQ#otSQt-kA@2@#y~xvcJwv&Ie+ncaFeO#6J;e|Y_B zkV>&BZJLi%_+g~f5RP6ml)EM%KY+`-f1+KzVq903dC zxhIvk$1HF(cR(`5n69H!x(^sP7e@@v6v3v<}ZhkMM&*qLmSKCPFRYo%KfeikMML*(KPr$Aae@-U!rSV^Dr){^nF{ddz&B^2V2AUd2 z_VgsPf59*l)7?D33WEz`kN*wFw3c;sb`BI<9wf7CX2$7s^d>N!_@?AL(4i8s5dL-x zigmp0`I98Gc+aC@Qr@4h*u1%4_ulaSlgc=f*|%-ij1XA}XLe~*(;F~cd<3?#Oj`5#TWkQp7@15&SWl59IOkU(^;S7F+w;r>6CI&Dh3>kYXk4I+6&(YY-p3;?b z+Dx;j@z+tZxCy{*0w9S*zUTNb$+Sf89dRIO7h=`$be1C@|CmmNSLHB6aUG0Gey;rg z1c=I+1p?O5UNX1wZF=0*_Z9k<=edP@DW zlT7N3Hm>k{#v!?f9Fs^dkQ87z;8$0q;l*pSr6@38!S$ zjLk@o60muwiuto&5f5LENhR<15bhR={L#4ycpOMULB1-G+s&-_%_^gPL<`I`0MRI? zNR{C*cw$h#)~`Cq6o!z$jnTyE#+`nmRzM~)aar5RO7UkN8;U7eK5yPs4Y5y7Ffm?r zL3|*YgyaG8*E6mMqaZ06X)QV)S#+l#k9y%-AA%P=`pDs%Jr?zuc6faHciPKV$CIza z-Aik(N-(j>R<&^+JPP}I-E|;1P}b1t)0hOtn2^KQKWeq+Evu4|_Un6M#80*rQ-#my z`0Dgz#21*u{l0LQ+)W!|TS;LW`F~|4NO6!BtgesMsS#902T{*58fMjjxqRS?0MRPJ z>MnI#T^Bkz%(&;Pttb|8EV}z*CO3|1_=@Ssv|n%!dLLdIy!||QnPjbn@ZnqZgWhL zcWJ}APKq5;0L5RB+s0J5f}mHMh8B4NE?DF38 zr@j)Ue+)e*wR1DX1@QUXa;uCoRpoNG%&V`kQ2rbX#bKd?oQCOIOGp)|1f^(D(awL? zw290*>@m~)wVy@|SDvdoYM3nJEJ?ACBys63;xA-yHyd3ZY|{$@rJgMqCRg%kKuvk9 z1V5ExJ@@FnX3^Jty*D%2q^+}6v0I<%l1086Dy!#>B|$Q}Sr#z=-Q2aXs+DyX-a%S;^+%DiiVL!}ER4&v6z1=}z7`WAd!wma>co+eCrsWtKnR-+|5D zc_*0g;1ow=p}WBs;UsjL05gH+qL$1H7CE>IXzF6xn^|}O>b&O1{kZBD>f;)B zIb7mLKC3jw7=J!|ZSu-ESJr})sri_`G9w4W#8U6%LPO+i)Z`ju!z#gL_eT4iXfFXu zdO$PY0}9CN(#t8Vlw~#^HJQ|XXM@H}(r2s7Izw*PQeQxkR>vS7it+sk* zlYPnw3BKSYqI`@Q^@d>Mix9vYB9b#+Z08i5MB22CPVa6wI5?@i=*+(7HKSZ=P z9grHh!*@ZZvRg9vVn-^E3ItNZV4OXr9wUq@tZtQh8V$S0Pa}zSf%e$^M_Z7dm$ySS z*E>wZTu;-1WeVa~->rEHM{*QCN_VS5aI)vo=36#9)mDAZXIJ#kJhe9K3n?*V#^7i{ z1E0n3Se;acEyKNcK`k-zX)uRJIf*GZqzULtiad}5pwoI^)}I!s0-I)@?r{A;;eCh* z>N+srvj#4*F@c5P%hKL!%WKRxJcyBSsrv_&N-sjHjXXCN|GRO2AR>V6<7tB*Oeh8t z_OA2FioiSglb^)0skXmdIM%NVG5UF3@=DY6BR!VCE=A(~ZlbP;Bk3Ews%CI`TQ7`M zUS6=0_zc^uvEgz1<1nYheVE2<7q{ThWKP|ZZ$H>crHYqo^LQI5!-jCZ2+v-OhRL#E0XxC)qEFhT#_IN(VJ*HBi z@_C)Dkz67+*1eJsa<6jw+X^bdP7Zdt+YhbHlb|(PwJ&ln7(9+YVe}A`XDSiJb=Z#V zE3u(mScC;;xZHEvKHqfY>m?@m=&f|$F+DTX6`cfHPSI_j@YgI~42pM*=<{ZRXNpn+ zKrP?TmzgATqo#T!aa-jCoRXZOe-zF570RA?%j36wESYmokC|@1XPV4ny_Avd5|3j~ zA(+|e=Vj0E-CcmkWD2};yteQyr;h&`*L+hNZ`5PalB_riUyG|QyqQidl0nSI-fLH} z-YkkA*FRTg5d9Tu=9V-`^P)R<^PkUxVZc<)kG@Upln@WHNUEgYus&mMm(#vn-+d0- z?q57s>mJ5_-Y2^p=e+ZQ#TRmSc9@jjabhdGFmBE6nGNsrQIp>| zPxW)S66y|DX)qlWNTe9@G!E#Bm1N!did-$^E6_m>QKajbbDq9V36lI_=IhA?dkSUA z-qSRlxLTx$L|;7ZOQOut%ko1uERFWSAG3Yuc9rAf9~jH?ts*&9bUlkIgd-D69lsDI z_jA85mT-Q2cg*b#iQSj2Wg*(3IBr8r6R!mL=uMt73U(O|-vN>}YMX;TPk%kXo2wE! z*I&>O6RG?k;gl{m5)Zt@d1(%;lWLtq9^bwWul>TH01xM2xoCp#5lDF1fvXWn@?a&& z>95~))X-Ptc6P?u&Lvp$&QplL&T&?Bmo2s*34A1#DCqs($Z_wwm@Rv-;U4f84nR0s zq@HywZ_&aX9H+Q{R$1NWKZRT4OkcL^Wqc=E+0(vUO;hhkw6%a~!A3G4a3Fu*gh>wN z(1NT$96qfVmblm=Ld3EVrGzbwk^H5FoIxrr6b>q=7Kt<^sG z!@Ys{jtT1H);Wlz727;85@fE-C!g|$ z)qNgra?|Rh{3Td$H1Rby)rYNc+CaC{AWC(?LfSoe`Zu;Nb!^bh{5H+bREa3dGp8fEO#_Z4`-KSk6dv?KP*b@62PxeSv znL1|b3V3BB_M*qih9pWQfs9HroBR$hJuqq+_{ z-swa7iNB!By09ygqD|A{@!ect@U%=C={7UAHFM*D2QlLX)iXlkr z^CBTV7$l!JpMOL@!2=8wq5^-UcQcT6`P)q=AnnVIhW`pV(VN0DuGfeNA+mzlFEe>p z6&lzguQLY99rb~yO>}VC@m~T96Th=YT)olVKO1n-!CANDbks7Hase787ZZ+&#B>SaA8>6uF=H99@)yh<1On!o9$w=w~3xD$E7pIhT%#v=8<8CG|xig3Ms zR9%o*F*!Z|J}W(P<&v?#P(p0(I7mexj}2@_ru&VtKrBzH(!rCciA1KlH2{)036J9 z2e`kFV67mo;1=mYOq2CQk0Ltebb`Cj(*ko3_TfIu9nhQtF00caTOJQ<*h67!w%OW0 zvLWA*98~cg-?-hKg_clS889UN8v?th?T?n~r1u9L)U zQ{m3W8~%a;Ob?pP?UVEJ$ZH$tD(LP@lLzYLQ7y{tqUaZK?gKtx`Gdt!$-Xpw#&}qM-$Q59s>t#{1oJW+Ike3>=d@Rmm zJsa~`4wKN6uGrd!W#*@bw3E?p;}11~vKa_PQ@vJY!a^cyQTqqvd6jq+$ARvUHgBs} z(fAA<8{!30KL&~96hE+q8v_2PaYja^N{cmd>WbHwxjpUGDA7{y$`Hd^1a7qTW0PLm zGCj!9TRixWIp}=jqGyg~kDmY(3hiaBrjc*~XamPn;WT0Fy-@|#NR{r|61yhM(p;EB`Wya+>^HGn3xLTYmtOuB>y$vIwDF5$ z;=Y&g9wm^~oAYZ^~Zy0RQ(6g!_3 zyCdnZhnNz$-?~BH=XXWrU6m~H@cdlJ>W%pJ&SE{2EYCE6^cj(hCZ5m6BO3s$E-L<9 ze}xxiUPtfgxTP~P~{6u9LZg*T(h^XxH(DjobrBO3wsGogs+d`jw1 zyn?eyHfz^j1+l53EbW^#K=ZgY_?_{s757Bn;L z8THuAVst&-9b9Sp(<^>?1;y&k`iO~MN|~40>2LTS>0bEHvYx$-arciKiB^m_>to3! za$Q$+)D?r2Nc2{M7EfB>{BOXYul9yzDCoM%iVOvk^~XbCK%`*`NwKBU+DeybrG2R3 z{(Imz4s^>Ek>>Tc#nnTXb2ZG)n4-pUS^d61jg^N|qildX54jgyz=B65jz)o>uATKi zzLc;o6!7Y9EYt6X^|SAf3OM7!E+ zO!xP*kE729B6wNt5WR+$3k$dJF0RL8(gpD`!S5eWe=|!Hct@uWy|&S`;Iy2vyF)Mi zm(E9?|Enk+&^{T@V@lU>K>P+3TT&7N@RkAfdR<IvTUNgSBio{kcsk2;QEIsyzIluRIK?ljZm^(c zP}qy5TK)IM8RZW2^1>U;{)hSp*w0cg*Qs?neJyKM(kg+G z!HV|V>MyfG=SIMlQcTy<7cp}A@epfWUYFssi**CcmG7BKuXN%^$sZSVJtOPwyqdTj z$bf6mBh+>EHLhscgtn(I_ml8SEryUHq$}48Qvt*^YLEM+&FXxvWH`TgU(!1Kc~E3|*Rgfvkcp7g+#gSH5Z!rig4Q4|K&|CK zuK>DUpK{%s0GoXxgool=(?U_wRsbpfG1{DAd@!}8Gnl!+W9lCGwiJgZY`W|Bl^)lw z+L#fAU-V3-k*75V1I!%;7PVr>w|?0}I;;KLLsC}#mseFb;Ke3vn&ez)zlT8B&h@If znJMCDf^z7g^(%T8VRzvurI2Za`74+^J|f@xh~u%7e{1hQ#}WkY`gffaEbVezv_~u@ z9TU4R(*uzU5$G_Ji66bc{p8m?>m}~A2_BR5HcVSw*^V5vI~VFp#L3U5Px&yF7yA6J z)@r4WL#HZ1PeWLY=Zi{>qJ+omW{LMXZauwl)EFB5dPGm~8upiu^GbR+H(S96`g@5; zfELOVVT;WX?G2{Oe-=O1?YEX^Ok4F84(|$)ZuUx+K0KfvT{NcZXRqs9P8OBi!hL5r zp|ghfMxJgn^z1%}#kGL=EVRU?z>(ZzrL3>Z^+r4fTx{=iMAk`S=|DG6umC3N!wvG* zm(|d$trF7_eU|3_3vys|Ue}oQ>&;(JH}ISs-abf%|Jl+erYbplY@@;iz`dYNq*uyD zOSdw+WtP`}x(|$RzecE=A6F!&uZ)HrE`cEw;6G68Rr*8+Jd|@=U`Wlzxa#TxtrcVZ z!CnrHlIh6D5!04eqzA#0bN*V}(R4pv)~1zu_eClx{JQLh|J1K=mKdRM#5zCog|NjR zu&C1)0O@A9hAB6C9YdbkIyv$LTR%eZegSgCOze4-k-9NwQ`m}o;>!F} zRX6ztg*OTbQRlR`2q?C07G36y1J{l5NyuEMQs+$9>&~ZcZ)w-w*{$Zw=DQAyXGa-L zh;Y>>NIq>`H&2mOfb1$)=KTcZ{4)mSq*A5CJ2kTYp2$_orESkEm=U%QDfHqw5u?iW zku)qJc+Ezu8&56ai1%SdWr&zA@Y0h42A`DT3sKMALJ^9cuo8Y2g@nDg49!gVfy4CT zlT+)mtN386jfE2A702jg8YL0v9gDfL6Z#aLXe|~)v3|O@AJbsgXB=s#y3y8NBEF%8 zg|6)lF!vpp3+1XYCLosS3xfa?^Y*0?7P7cxz1TDQd%{dNfs9APZsGxpx7gmYAEia2 zGg2~iQbaP${y3knu#7UTX}NrG*ZW*ri{>wwOSR->wm?dqTu0S9-Y!?gOY!FExkFX)XUs##;Gp!4Os9;-?UYFVCa)VI=wZ!ZUS~hqDFWt zXBs2v6R5sM^3#90o({aO8C@AW!Vhn!ER$?gXy|q071~vzgePE0H&S~6EC4=afvuK5 z_1avf5^HhY#2=n#|M7~h(LDBOXo62JLxFd^M&b_$M{tA`qI0=kJoJf-Q(MB8)fI$u z9LHZB{JYw>7CiSJaW@ZhPgTnTpq``+oJT_c1?gXe5bQrkfBUPP<=L?9+dfs24?GYS z(Ia#M7t_}aZ(3JXh7WBe4S#pS;?R^MyF!987&Oo7VMEv}Ms zG7SQqef%>gC21|95_z33RS1GHLRsNZ*=09OzS>8-k<-KD9GXbD(so&wa0fvX``$4` zh&wxOe^{(pGY#EVPB99RefHcnl1D;{3Vnud04JD&ZiE*%_-@6!9xD;X0a5SZn{y6DPg z{LDQ_=YZkI;f|uXwfCW|W{$27dJ~^wwQ$zgoQC86+Xt;y`!i?2uY0!0+$;o9`ZK58 zH}n2Hcf%RM#^sYxwzEAyb0_7ToIGz;)E#UA027kmpuYPl)=lKxbaTCzRX9y%H~Mgt zk~dQJo2U`9`>K+2`b7jm6(SQl81yEHuNvXjSh)V)G~%aERrjr|&LH6^lci zl74LTC_{|=|G}hV$uqdu6{CEwp|G~iu?}Bc;Y?RG7t7pzfvG;;`^T{7f$*ZtqhV0j zF?Y^?eLKG|7TKokq5!33F_gEdjBw|2IMwAk%|=+5{hx4T=GACDmc9aO>I5_&46Hdc z?xm&!ARUNwBw$=v&;ITqu^CMksC?j+jb5&+7uVcryA1 zv!Aj~8SCTW2le3z^t{_@a;o6<>?f(o%=L`|c<1-yBBvCGO_9KO+t{iB=8GODCAqD8 z0?_h)w&j5rZ@vb

N!vSN4ftoCvU3R;v2`M+Eh4?4HM!>H1&6Pp~Bdk60X$*a6t- z>1iI86YwQ#$qLTU8bR_3^3<|=TeQmnOV^JybdVCdA0M?Vs><0t$R5r=#NB-C;Bgd9 z&aUXb`Wnlp?Z0hkHS*vP9m~MxPxcIK6|pJMn*h?Q1RBYv#PTFF%t1YvU^Iv26n}R@ zCn$l!aP+bjj56d0dV{Rqyyug$&F3{OqAM_;`A7|D;ePSJu#eshoK5NDzR6&#VVV;# zon(+N^sWA-6e;-dEC%v|7DFT8CDz+;Ko;ZlLO)h$bd4TQlB@@;rdDvV&0j{ovNzw- z*X$SnQI&V36W$;uGmC!@s`K=(h`La>`Q>9)@F`WGBbpZOq@ALG8L<1k=GGuLa>bUP zIL00`EBWC)@X>|3&>F5GmE~{}^ViKTVX(}(f3QiQA;_D|*!+*X--?iCd?)$zG?n+5 zkTS39&qF&E$hgqUn;DIIz~c|L)$r~*lOyvBEBmGu#ftmN@isFRs$St(3m+GkO*=c; z6$7`3RiXFKdrt24PE?@1HjN?U<^j>|v8SIwp14K00|BJT^}lweui`U*;FoK1H6%x- z^=n%Q>%I$~i(Y_G{r1(rKda7=*a1@oy-y}UYF9P;iNO7YstXT%RIJ0$U`B5xOCSY} z_7$t3fEF(M3DG&tp8D0NRGp5UgPz&f31{;=T{kpe{8=*pt8Gasq(BQ0ts# zHks!}8WV4zf*#kDOU{;uIFxy=)E>`2 zb%lm<{Xi{8)9_9kLJ|8=0ckmsAX{)ob26@9eHe*HZoidn@CPwZCPpdIyq+bh`@`RY z$GV8h1gqss%qcW<4e9PF9t{2=ufQ!B{rZygZ*woQ1}fs@gBA5A`5tMJu>z4RYv$S@ z?JLNiWxwRk&!E}YPR>mZ#rXmhkQ}~U$YvkYE+!tOL(TEL%l=K#-;MjyFXj@BOtPKu zi1@Fi-{wERb`H7lS#mc?Bol$r`>8sAOS6HQc)FF8U3zv5eJe&i`llKl&G0V-WB5adh#JTI0CjC0&lC)=MtaO_{HPI57c{&M;4|%Oz&NfK3$P0&5}N&T)bVu zH?_e<@v1rpy*7`=d2^9$S(?pUDCipj;QFNcQ9VI5Upng-xJjKlQ_W|M>jkvCtm!jG z^lsDXoEBpm>rkydT3)YS6>FSMN@{_5nv-MByAz^^j@=@<9lxg(fR=C3NXs`1O>uXJ zaYq1RM#J0Ov|Fk)fpkKZr}K*Fw#MYaGssoQK+3nm`yLO}#>a)hw?Jb9TCwZu;8l0y zlv#M1K<8Y)3psggToT7a0;x@n=*86QqM5ikhOfV9vA};632Mjg+_S4^*Z-%fqD}!$ zg}UgE=@j}2q#*5UiTej!F+vu0bhkvr*RrFHw%s0uop>vA@z}CNVY5C=rf=l~uQM0w??7!;pC3!whYJ(XE4{USDV^ z3u_%C*r*VBpEkh4*@UjS#Gax@yd?{qocUQyDyZ~A$M9>%tcPw^{9fru;KLjd5Si4+ zxam^3uL2xS2u-Oq6%ON;>qnrf3(BIm;W9ZP^uYPKhg}7hxr+4n?BR`5QmTE!YVP8w zacqM9ovB=}kUW0>k)8=Yi|4KKNamuH6GcoM)~_lNlJNSf^=fr{}m8Y=9nmX%TIx)3Fl)}%P~Z7(s8tfzc1=|kF|5Md?vps=I8{265= zT%~ZAox&F1WLP3iEUON-RnpgkO+{=Dhwn=Na+f;jY2A&kFf!xy_7RJJt96w785zOw zH7LLn%p7U?uOuf;>v$3B-LNea+`a$PhOoz5{pp#od27w~yqIUtL!3b4x08>4f)Lm; zi;!{kNtRZ^M_H*J&?1ie5M-kty|u$`{W>=KxR@sL1;~ZHoZ4|jVS4C9LiDT-NwbHN zT~RMtwMEs}2h&5DqwnuZ!=HZOe=)E=4ut-20!-nXaBxq=C%^I7I5;;)+U!CXBYn}$S2_DbrWcvlUcd1y0xT|^ zXQzKqU?B9U8Ti@_v)~PEc9_BvOLk?;XG$GU*!)Dg8T00(A74wfqWc%3 zuP>;?4lkx#@)r9QbldvbLWXSY;p6;vGmHJI*_xcV>&&EhdW*Z*j=@h^YPl?wxMt6te*D7nVA1lhg!9^<$W7yj)&nb4=7@DD-zeZ`*1YP~!wszL z0-9W67GMSq$#Co6)Ww}~|0tlx;a%}%Get6@bn2d;NH}=0)WuEpq!(xe^pYr0K-{oXBn5+E`ueR^87)TzyeaQLa)|_isKpk8+jy*o= z$GZx=LK0bCIjP52%IfIs4A(JjSTQZ()3o3F#2tR>9Hhv3RLfy)Ox~u|THeLoH~D+( zVTh--FcH!UcwNhI+?+Ni`T|7A8sCYi9Bf4V&Jguqw_T}qN*P19+!#oE@}-<6$Bi<$KGlNl~9yKa*3q!NOtctu!7X2WyFCu37!wy@z*LXC3bsBhwKL2}N z9-~~dQB{7k*;{6TF#%YiwSR^%H%ZSnGuJ`F8FQLJ-l^N}%`kQSm`Z>~X>c-)HQ7f) zJWb0$ZsFcE;AO|fDPZg zmewY|l?5!*-BFe2MyoY?s6>wf|3PZ*dW=idlSH@{J^#;q_LL9o&#j?v2lQ%WIJ_<* zRL=(0V)vdF<|sL_+=R=@Fu3f%LlLS=5lYlET1%GauC&h5P>a`uPS7Ye^+!ri#DCQ+ z%afv>sD1V4VRcHCPYLL_lQUfFpj2HHrx?Ax37*lQ|AQvH8B&|q#=4cvr`OnBG#_|ufghy?>g%g;cLa*U%f24%;aZi{NylVpSykG8S68MvsdoOpxgKy z+h?zJOu0x^rRi91l-|E!tGxwt5Y-H0>%&w+mvZTuKT3{AeVKDoT&{^daYzL|NX#e( z#BMR0JsEaR1BNzCST#}A!l+)X$o+p z4>9LkA0$ePL?){$Hp~Ob4&;*mIJTG}lAh@Lx0ruR%lKoK4aLI8bbR~10; zuNEVWE<0LV87EJlK7Y@2F#P2Uyj{9)op7+TivY`N$_{R^l+>mQ{Qi`1LkJ58Iy!NY zjHX@_|KaR?y>uV0Y_|b8Tfy?ooApi991(08>?T_K%CsBw(ydz z2;J_U8_*=#BZE6v6W7*e!ZUy?c{39-+|~Sfjl#6)3qc{%B!h_yb?MtIYjM$dPknG{ zAJR1NAAX(AD*8=RqdZxF@bk2ysr4kDOgRy`c(IA zJur1Sg0uc9K6kU~3Bt(ga#v;4%Gp`Qq+9>ne~_O<-4?G>J1tz~JHBoC@%TBDY()h* z1-+E$bMP%P{`BLgw8gjD2s_lShl!bJNpftvc#~RVTX>g<0QbXy9}fHrq&QACLl-C7 ztLLo6U7aUH%e!^b1g)c-dDVLQe0Z7}ljj~u#Qi^-o5YVFM>18lNAHKoMcX3-71C~+ znBcTh{*AFPGR3}^%{D9nmC#8>+Otg=s*@D%NS}&Up@w*BnWW04P+^{|u`f7py6OEo z%~-PtyDkFx0IL2_I@TXe3gq*C_h>BW$a-?YCjSh4Qx_SRq;iw^{Z*S;sO^GAaUzJah&M=MB^Ad<2=Xv}O@Z+0^aCmwDq~KV8XI_M&c% z1EC({sVq?SozU7$$kYH7wXXN{tYBkm)nHVy&o-zD) zc?Bk84xX?89yleHPnljdaz~QMql4~ag;*fi5j5Zt@JUPwrX>b(lw*@$rhUT;SdW?& zk&>x*9K^fRuQhX~D%@gh=L1Jlc+*lgF9}Cfu?|r9?1Cgi_3?#+ZX=5eZXNpVUCUnmW!l=Obb=HNqUMkL-pZfU)4q!K;+@kfa zvGd%Ppm#{sg0-J8?1}X>`~qiwkrZ7lppohDC^?bXyW-)J*HQh02N)irQ_zxY)1iA8 zaqn8BQm%d&&DkI>I8u%)NB?UC#@I_V;DaV097}bQ=LcKBY*QN`hg}{Xk9UXD>W~z< zzR{p<6OsFl>Sy-f|06ssvi*Kxg zSnJ~%5LGOBRG-rU#dw#<+Q$+Rih4L`if$-#sT&y+n)dY;iTl~F+w3~&xCwzULxdwd zb9DMU7|TmXlHzQHD+p3n=Byt!k*IInr)`2g5fGj<`MNeLW3RYvZ}E++TX-LX!)QPK zZkC&RxJ@@c@)dV|-;;qiPq`o1)2k2}6!HpVzEG`)h(ksSTvuG~G4g9+SD>%AP4>kL zB00A~lC^=B*N)TDBDDhsWGjO|zSYZFrm-%h*Xyd>M?5@bV#f?@Vj>Zjp0HLR1v>{a!Q*zH zNr?B$CeX8kEHYH%7jRAg3dfp>+aF~oJ>qS7nuXT9v23^BBbju*;P`HUWLh#)dw%|C zw#B$SQ{qo8It9%roYz%2&)l`irsfgrt9^EP@Ql56p!hLQm`$f*QPG96Ji2TUSvC6o-^(A@a9S`v* z5xg34JKtt`zyvq_P{GL>{je`;1*V(H&^k7tkKW(B1A*|bOWb~&WBc&} zgO#J$`{eQTxY+rJVV1ZAP22jO9{FFOyHTR4LefH_>A8SUGT$&!>eqJ_BER3~GqB?1WUH=p z#0uF#Ei!@;zpY%DR`AM;3QQf^dkfn0Mu~kNGRD;OE0TzY^YwYN+5$X?ebv-(<*Yf}=k_jS#z zi^|BjMx~NaNmsLwyr+v?x)DAWHtaA`^n2qEXpP;S)Z>f+466vSmYeoq@5*G$&$~1bWmIh ztl9(>yzNb4qS%Oe=~B(;>9!523>Uq!C!i6`h8VXQ?pDI5{uDG6XKTCVL|sa?Ja4oq ze){)ZW$A!n$KIzQ3k&&az6|6YjA0r-(__sAUX)OiER}%&Sw9W*5{`<#!?G*+QWR;T z@vORSJ2Td(1o4|~7biUgi$#AXeFr)S5JnH~`Yvj1m!%DoXu>X-z%N~bM5wIZp3P!{ zhFx5A4C%fGtOk$7PjYyPOcWu%=>BT~Sd8yd%|?;AY4@ocE5(52OyCT4#_Mk#Mm_EW z^&yRQh1r$YjVwvR+qykh@Qj~ca^ZsR`AZ{IGi9M2wva7Z$-mP zvR$saM!_<%%g~TqkmsPgp8D|twxGkKC9gwdOy7giKiB3fYx89OqB!>P2)Q~W2Armm zrt2wDZCPBmq&>BE#39PIR~FNIqb?V#*zm%(2W?)ED=%oiruBzRXP$*Y#ufIzn#6_0 zT04I543$nv(byz;Hxc;PW!gLt)L=Lzet>`SOg#(aZ^Tvd1@wg73n0zX#lP`!7ikhp z91&*t0YS}pXWYrnPa`&i(j2XgTn7Y~j(pr|C^P5EvtdHnYC-erF;rfv65Q07y8?=$ zl;;S&14LGm<&LRqT`bY}iigEx{d2<~9%{AU9O?|HIwUcv=E(L!vZ8=2R<~9W6+*wd z4EkLgL-F#xO6Ypc{@q^Ge#_BL`5_w@)Grs(|#KI+V&SQWh;!bMtwbt%3qBsfL7?* z&F0zpxo#8cAr$nsNnK=$i>oeq=H(?q*6Wu7&v@ivp7vt8^%fUw_n8qy&}v?5G1Q)G z&S2}L2O+{naQe@5#6b4(a8+Lnnk2;9#(;>J<*jCk<=??>Ll>unjXq;~tLXZnf9RJL z7C98;%(u$AbX9b{)O**p{k+Pb8sC13;myCrddZ;1Ab7ql=Aw`A#c*OreU;C_v76Ng zzLNlEw#m>Y&r*Y>{|SrP04y#q%#z-Xq;ZcoIqZ?)5$9qc73Iggw#3U;i)j&lykUAL z^-pO?^21Op^=x4@2AJ@*h3MK85l(F=IO*&}KW@hQz8>ddEafr=(!g1*+IxJwVcg>C zHSak@=*wKt79C!9TpgK8q~r^YQw00juzn>wsx@=GNjIpbdb_VYvB ze+@_Ksx1jZP(_te!2*D$79W=7Ubxs3azaHUEFoEpkFf`pKNB>oEzE@=jL|9f{Rxi} zIE>=;IwKq5J2F3;?cbl;elcb}Oxm+7QKyC*w@Ho+4M7dhr&r4AizJZ)J#tl`%q=A< zD~O^(hB*ZnA%dP$`n@hc)zjYpc{l4`N6YE8@`IyF}ML*0tRkNAGH z{Y-)*vUS$nN#uvA(vzc}dELd+-_?=%I*z=Q4MmG-M)uPN0^^-oU2oqu57jk74^sV# z4-e-M=DlH?!V55B;1_{7+EjXi^Fa>psetI-7kZF<;tBJR3!)7*39S$s{=}n7>OI*2 zcblV~|DM2DvCcP&D8Pq;IbuzwjC{HZGu zT|ESMZIM0kg7!cMjO{mY%oJkQSV#DK8GicJlMjMfBtQ2OubqXPE3XuLhz@X4gBmB6L2HE(kiRf1eXuo<^Ary~(Hd(%@Fl?;o z^H3vB+xOkwO|*-v5F|AxZoTh$uL^BEJ?z7}LucK~>Z$nNa}2Vn{|99+<5(|-B4yfj zf2NsdPPZF8r?bC^UxAH%Hf%?Q34@ zsuKkvlC_=RJF>CQMw_639}lzL0$m@~Ji=xZLwSiTp|+b>uK~+mfueNgz>~$9?Skj3 zHIi>Vs_i2gdn`Vb3iUeRHjcXk?y-mbvGecQfbVR%gea+0@SdBS9_y_M>AC$*wz%jV zdzFe(o^^`*TjaMwMwZJm1I{Cd#1?MEwA((Nt6AqIr#B7IO{SpeE#%V@Xc^B%TI2wY z4ztEjl)+H_@FEuzK)_y08X*l~ESQ)d_q*V@1D%ck9I7l!T&XK*ZxS2sxIP1<*@+$s zViN%t1*{|1LXj2uL=79x)Ve$pin9V4m2(}+bm|MVxb@4Rffy3;+yuN01pg$-a>+n4 zK39t_qcknm!6rM}eE%fkF7#XF1E7hRko`g1jdsw7ire>*zid zP&JbE4mIT)FE3z)Qit3$TC{Wx8l^nxR=Jpr-9HBio+_HGQLA(dh@1o2t!WoY^bHuKAuw;JawxX3~g}g|y zAk7yw0WL`MCg-TcrZ)%?Cdcy6=4gSeVM+?8N7B1tAjM%uf$ftXKzt1DOXm!zXREFe z9!H^=LIzBvE{tij49`A?3VKSbGXx{|sGy*O!V z9wj5-nd$keBZN$x1E8yn8N$p|1V|K)Cc>6KYJh;;PZwLuF6ehjMnQ*Z`c~&|4D)sZ z4}1Z-n?j-*^C|k9GW$l?*))yRA`bb{u4X3dJ8$_Q z{IG;-zMuB%H^WBQnNYx@a8{_!-n^~fIg?*Zh8~RxH{4waF(@J?AE>uA(kmBJ6+HRz z(QgEz&E=WdEhCu?Iz|?lr{Fbby}x+5YVA|w4thz21r`8D83PXD*kFSyR)HjJw5!tK zRi@W>66GI$J>d?iM+{jIJ&{BnX-@3~TX$YR8s^(zt3ACtuxN-O&1m2w;@`Uv-jzNG zFH6!(wSygCZ0UadTh8KWEU)1f(aDr+B~2e1Oyx%f;Ulx{j6KP&;xDlTt`WV96sv~3 zP$uG?s;K-Nnh9UtDZo!LEU=w^IFs67=3tpC9@5RjDlx#|n+?RE$?l1pr_>)Afp>Nz?UEh(eODK$-U*=ARstoH<5?>^))W-DQnaevQL{nY9UVb37eUoW(-M3zV zcg^QuFk4%$POjYY@;Ro_*&cuMqJyCn6BESgT4ky)wWT+smD$z=_T(ulO8+&YpLOGH z9N7~f{Ex^S@6gwiAWH~Qdee1rA_?QZ$9 z#Qys+^Wj%2zl3;cGHX_*kz=2j8c*R`Ot>(xA`2ZZjIr_##`%7d(>>ww=K=@B^qt`) z+-L0j!Qt%UXMb~s#~ekDcNw#q70LdKidx|zw7Y_~Hb(5blXHgVZTzX{) zuY}TQ?ALRtx)PPam1lCZ#Z>-x-0el_w8R)%Sq+9>s`@b^r5H}CLssD8lxZcKJ&`Js z;0Q^D)z(+}o2F>AXXN_dD2Vj}Ef3iwkASaxyO)iOVk;Ph(yP-u5=0=HbQxc3;P*H= z11u=rztOZYAMyWvt%(+I&W6y?e{quKTlj>4lV|Y?`zRMj~nTx$tKS*~> zdruG6*0e>U_zyupKLxG(Zq*ceEO^R1zWaqZ-wkz)A9~2r-4DrwX%?$H!_LKwGd{h?*hztZKKY(o59i!!|@2Z!*kIL@eK{tt()TNl)S`^n&MY~@Kd zb*8RP0I9s+WuNxS=zI@XADmB5#YW&ewuqjx=?}A?LZ0IS4V9QNS>U-~Rhk+OOa}lp zpRo|GJWErF^;HYiBWy~B{VI=S;EGkR;Av`2_vWE|CFZoiOE@##5|Jx!0GT0|@s@rDzq-4+`nz|QG}hclSCMZC zEeyAY4WB}|TE!Gx^SVf(Z|LbNN`Liyf&82^TQiWW&uhmAJpDfM4XOkIQf>*w6l!N& z>Y%1*2M+y3Fz1Avza{WBPENl^=d$>+5SC_1FIWYc)* zw50)UT~WPoiDEx<)u$up=4K20lQL-FJ(5gLQW|QHCU+6~zo4FoWGay;i>Pc1zv(w> zHO*g&NXW;{H4Pp8h26izu~+qHBbzpY$<~BVa4D9`@ew?Oa4DvnZ;tJsUqG1-8p>R! zsrZey92eJ|fyPT#z3LRq=^jf<7xP#e<>lc3_&}KbuIqx#~L%zD9{st#4_fDrry1o1 z=nHZxv+AFcc~o*6$ti!!36#Z0Pro~3--T)!apw+oaM~9d_6KIq_M_1sEdq?`>0%i7 zcl1k}s7nkCHaoBHUr#4Qx*8k69BHpUi^}N&O$KIxAGMpd9_HRow^8*Cd&5_Lx@*dK zrzVd;OxA^~V-jh36-{4G6Z6^#HbIc&8LCiO*vk*-10*XpvYmY9hOpM{ONtQBYd3Me zO0r~6MnQDJ`s9mq{u{M=+Wwr!2rm!g1Y}$}_DS8sqxy&ng?jqys%^RWI87Za1UG_yH85pqetr6`spB^<1DU4#5DZO!X$FxAkAT^cTq)Ga;q!@)b$px<|i4 zl2pR645f7fUT`_)d#f!QOy|htXW(1sc<1Aea>`&oWo0)HN zXBBC{>E5$q_Evq}7hbGDYotSQY5a=zchk_`ok~7oHHpb~JI*N0_eZ{zE$75W2mjHGApq30JbE?Gn*o@#SM+ z55eN8eab&?+h6nX=&@@Zc!%@cp5fM6GfhMXYUff=81*~BgFC0u5Rip&vZQe+E}C8G zWY^5<7hBdH4=t6_7|+xdH}9s%KYZYsa{V3jA>DyDsUcF>ObPdip@1up)J}cZQ;ieL zhzE`Gs{CSI;<<*5s^=W|`nB`l0>-N|pH98wEIWhuExr=3pDBW<*1{OBiu(YjB+U4z$sgIAKDU%-LN(yuozz=n=Zr1x)WE(gBIwf0h(O)ZQzK2`Q{Kr$*@m;zH-Poh z1!810^lU79hRg{d2B7*Z@!7b=Wsi8qmu$dP@*}6JfA>LnXP$MbtNRif4}AO#PiN`y z^N1qewqLmY;5{ARrrGFVbt}Kjv9cqKvt;f6Nzj;+6+V!8%>g%1 z=bhF1yB{CDs7Pehi9N%MPuE#TeAwpK1pi^yVcMyprxQ$a%F20PKxq$&53NF%01vCs zqZDG#E#0@OsORT|tcc!n=E;yN#j9c9uBjw{$ffB!&!xZY1hwg?igm+O6rfb-a=Fh(}HY6Pxr^N$fC&N)N+ zBsWcbhE-MfYzktNAE2K{pC+|xg)&4&Up`@d)XhT%dYbRwe<(9GNSqI!q+LA+?eBJP zQ%x9pNFmf?xdVfxYRo$)I6yxRvTwO&Ep)d{(EVM>Ls}v1J>!>Ts#mH1N=pZ)HRs!p zJug{QIuG&$fx(5%ai;aqm``;SZ8*QmX02LaMj(8Xh2!X!CGS;i9a`4RZ~1W zKL@v+j(-T!wmBiV8YG$l8UIxhpHC3{iE=coYi;W?!cliTc1qr#u%3|gz5rPhFLry$ zP~J*k-vMp9xaG1hT#m}Z_W~BEH|3}=r?V8gVL<8J#*gW4+9#$T{Sj{bw{&{Al7UQ< zD*O{&s-SXXd2xbX_oBjHx12DnqGjYUs?{B_^vlIBg7tL`C16-L%lg+9nw=wD#>7?z z|BCmoNp^##zt9GUvmMF)-P3IQ2WAcARpgy%p~_d}#4Qng3sRMZPDs7=-29vd$4vg372h`0uiaYn;vgN=X z?BAUsE}SO2cU;EvF}qAvbCgf0Zb>mXln0To_&ibf2!ZU0Y(Bba((FeHe2qKm*X7XF zxLTG5JI%bI6UWMT=6OD7@DRpC!5ypb3GXA%*o(a&B8nr<*WlO|f#CnNR6EYxj?S5V z{yzB))!a*ly71j10GZoY-+#qKjmy`BrpNbjSIauzx=tMaIhxIuFTzj#IkDARsx*pq z0pXL;e+#k)0zk53rBnu?(!dcyj7Q@EYQBoeZ6}~1Av=NT{lgw^`-hgb^$m4$P7!;_ zsGHZ~t4)qC{?Lpx$NwyJKmemf+-X(;`&%ca%(-wUj?P%LF(j5 z&N_aWMYuG7BVemvzKrpjJI)_~7=Q;Wip)k<5pgvij&U}ns zz}`_H@yT8*<^j776X)bX6CE z0T|Y5CUD_FCa8XAV*~jPBj{Hmh>khVq#lXY{Q*{F7~74s$Z*i55eOS4MAnhg+H~o= z{Cw~%w^PoLo^a+yXD}hybjUgU$kw)#>swvre442naCX5b>->rHg6x~lu0NB3C@YUS z$F|3^mY$7`8#~QWJXyV>sHh*vrtWgBfcsV6E~80;BXhUqgRAL65Zc%?18Eg9uAV{i zrvvNOt^E_&I|^&QHEmfvq(95cxQ@d;!6c@}Gc)t(u1!Htp@K~fjA_A9&wA)$zoW=o zTy|z}!I7Z~ZG=z($+=y1Gl?_vccL)KK+eSCYch9$9qzu0=IW}G-wFBv!XT*uro~Dh z8%LjKZxpx;oAN?EC>LSc)|RKbD$IS|6emImAmX~{p6F^+^n%_kMEWFAbWcRa!I($? zF6v&_tcEl=LXLgqOVmEf(nA~2+y3=_X^YL@NY|knr4EYJ3O*18H9kjw1;dW;sPyP6_>CZJTeA@jM*fN2l zz`J7z7t4i^8Sd%vGa0vQwf$~HS3xGYde=8s=XJJ^Y;YN!t62HG^bD z3i!oaK}Ks-7fWmcb3omt^DUR#Po0a;DR^M@5qV+qXrOs$y>v$8@pX|cDF8d}6qE3A z1R8S<(Nki-XJ_?EOTT{z>p>$6y!Q+V>;PNU`_N!&_FJx^!rg;Ai__i-mjBXy?3i^6 z>(hjSZ??J?)P7H#P3ZXDkQkH~8`ogU-GP&1#=|3It$Y-zTW&AQ6<0zuHp|mEzWO!I zJO~;0@gpm@N?Pj=)+(m_nY#BjDFdzTO{21sIT5TaV8p-R@!n&Kc`K4CT6y>VKI$Hs9jds{954J6x5B28#^l_i{(*&i!6lK;of<2$(L$1-i(9ize6ipIP z>EAWl)(8~mQR@1^bc_vE04WM@!OXq*VtaA^>FaVE{r=$uP*4+@0b!sN<<9*zim zZ5qZR{m_Rt%eRk&^7soFl4#$LsS8(2G&U7S}$VJO!56gX23jmOR4%H307VWC)ypN+qV0_Awb^cNQ;} z_+fgXlRKt{@Qr}bUC<|ZefoGgGaJ;`IGZ+*w^TKzwF+Ct$Lp0Ud3z>j@RCz*Vfs_u zv%g4sj+we@`O^WKEG`1y{K$b5@uDbcIE<{oqGn2a`xRzg5qOhrsHAeQ3VCvtw03M|aM9OjX>OZA^X6({J-cK(`NEyT`4Mv9tL1Qh zx8EiRa0){^LkxxY7Uk;guFOwdIs2nBXOl4pp#EzmclOt75 z19#HoiUDdM;nrKS0ydp*&fVTe9{1stGB6C%?32!R=~+~5o0u7|`~@|q(&4Od#e%|^ z*#q(Scwy1aEEZ*W43f=9qI69R$3M4~R_<3r2HV5S=QBX7n15KB)ySG-sFaNu`^ z&Z=q4)?=ylM3KFbcH&m$($=l$xgD@?1?$YBEO!w5K$mE91M&-ZX{4wF}}3blGy^#Q0yR&0QUn zL0_J6!2-dL+nakmm*nwjE@o`-Xt`3tZW(bdP14VGerLK(E>u+Un!2kFi{q0$Wg{Dc~cdAs44B_}~^xUkj zIb~;7sFC&v#Z7~@@Dx=c)=7W#?Je2)B{%n@v&@VW>SfyfdFC-MOz7-fmc8kwJRcnA|`0|&}H7r1Y{vq;q;M$+j_;r z9kE5xLc0vVfT_+hSnW(5r{4)eC|mnW^jq3kUwf<7*OB}Qe@+7;ckyK1)nioJO~32C z;u6H+ADd!%OFLW+-Ou#n3^LMW$1(#)NZl)zH6T}HuN>26M9Z`_fY&L z{HQWA$ZZx71>=7zhiMr2$avxA)Yo%I3Flb$4{zZz?$&k>U5{v{KxS|HUA#Ctr8#i) zVway+NHKRWUOK5Y$f$IA;iJ;#Tx^d_B9BBM6&n}+_V184q#r@a!&6yPS;$@!`|#Of zsptCrltt{f_PI|e`F1f_I!N?*|wuPrW8CQSPnj zg-Eh!w2WBsx)JJ|xhH{*_n|QV?~EGABJD%>G884DWes zh@_aa_3<|!pwfh<(sr^S7+6lH&HY07OH|(mr#rXD^2)${IH|#>vHn2SVaa1PG;A9k*cBWsomcXmg5f%y3|-%mUE>}9>wtvYgs~- zd8JD%E^7HTT7YVJBiJT(C@@-v>HjLgurzaAeBP%FlUG)@HIqiewRIFkw@|>F&|SJk z3qT@2Ab@j_GUq>9)F+3{8qzl)HWMyxeo7f$%@XUmC+xcie`sVMo>+w- z{glt{JpIdezmx5uJPH<&kq8m3zcdA0p=nd7jIav0#8dv3IOKM__xAmGHP|qKD$s56WPq zT%-W{rZ@!~7MMF7O(+y;#uH`toC~U`G#gc?g4aOU$|7jj&pz2XVEs}Oi%)YZ_}R2| zv+sR8?Wu^I8(dDl?_>OCEcsI44fCFcJ5XL5N9bxF2554RKG`y!cwE75ew5n)NJ+4^ z#8A+E$w~P$5>3k=o{7iW4f6;iQi*D80xH3ZO(r&Wg}R{=KB>#v(cx^Z0rnMw`tS13 zHUvp&1e{-&*U%^SF;<2J%iLE*P5LT{ArPv2jowwYV5z8a1x$huC2#o<`G zLPTI2>+5nuAKo?(QfTPGoE4_b9=k5p_n}>fbyfFfk6u5ojxa$LKfzA|TZiY1w&?GF zF3zJMmX-!9jNRnFzqwI=j*kSIG4l%xoVY<<>yNh6q_qFYok^+9xR+e&buUrcj$F42eY$m+N(`dEndiYx2&bre4(ykTO~Z$NzrC5 z``+kdVw&TA39o9Hbe{TddJnknblGbwqDObATkD0!P1Jg!hlQ!tr*N@Y*XDa8G$ry` z{uh>0owRP*cdL}huDqM4S)oPLUBfiv{LzGUx&&-V+;A4Io0XlI*M7tiq`48MS3oh8 z-*{k5IP1zJoC?Xd5F#H@{R-uI#4+8mu1P|}PITGkBYDQOmt2Ih#Ke}4yo)6ml?A0F zuO9rRZ5#V+((z0~Ps6`oOW_0_kdOFw$E10&Oq`4-7RO=UIzHsnFlEm6`;(P?bD=Jl z^}m`#>Gcm^32oN=5hFS$2GAi8Kog)W+`Pd+c`dZ=S`fe5>XEm56nAoaww0o_J7z#f z3N|jQQeKKf@@a!ai&I;-IjYhe^Olr8HuLq{P54nlfzKKyYRP1L19d>*=hhd{o$FEY zzioluG9MiBGinaIb?fMWrS7ldJ3i3+)_`en2G1(ucL%e5)?4cL)UJ1}G}D<-dA+1i zrsp3ocf3w?ekD-a#Olq50TP{!U?!<#^<r~uHn)tUHj7l%OHm*}&NybnR8JMzW^geS-`505gPuP+%eXWYun(Ekpu!8{}^(l~0 zW?(yIu6=Im!a>c2y#yn~ov_!tpONOlpCG)vdz=WTOQ!-F zrHuBs_RxM@2k$-oz9>rsHHoFu+_saG(1>#d5fkq29qI)9n4iht-pPVT&i{=2 z%_u~fsu@NewDZfmZr?r35X+PFKEGU5|MX;%3PuTY6aqR|R7^ejuW;><$t>-AJ6$U4 zUh3D*uln{-a4XRi>TjCe^w6q9VI}**6lf(7g2i35QuvF78EPQ#W)!AVPB&x1t;Q}* zY>rPW*)de6nDLOQb&ndcqi4NIfW2b+8Pg;dw+qxisX_|%{bIvUk5$0T8j4_P3SjJU z+nh_bl!`t@O|>o-`wbC3S9;WPK`g&?(J$W9Ak&wJ?46__F}^KC}4F# z;-T6Y7Tl&x4%-{f5_o3&>Fo1aHm0c0Wd1&Uz+VJ1K>=jBwDVv$*$|1x0?4>{K(4xN zXX#`b(kH-glddhFRj+|irIV5!=-*l1&`Cytbz$8~Z5qF~$?ediEQ}aZ%EWmsW01-3 zP|{6e4(sp5BNew_3B-Z8N8_Zgv#S^^bOq3 z`n6CUOK0OL^g-l5;e$n!Gx`tjg@9+}Z<*jl5OCfQuYOxjCfxiP@D=B;9+gtt!!AQF^`5d1P!0Aqvow<1O^0sS^a^%_~JBSapI|e z1!$c939Z=o8o9XcE0?-INf5^wUtJN{4S5nKFVbf`9|CFJCQ~2mUYz$$-`511&*pE9 z__jj9)IJUz3q>^|p*gIZM=QsZ*?20eisy_4%)iR%wU!I!O|R@zUt2|5v)JnU{i2fG6^O7=28m!Otps4m>-1O?R&=mwBRtWzpYQdsN zl#Gs4B$PSzE(h`oS_J(x*NE0Nu< z=P}H9D%>k9K&gB>=AATsB}NAJ6nFb5NMaoTw2^l(?RQGzwVD9(;v- z)nxPwL#ZgxR-GpPwrK^MBR78{iY6VJnQ9SAV<(Z5jOp zeOxODU4;!`O#efi*ncT;r~SM~o&I*ViCR(Sc3qBXFcdJL;4=9OSwJK^jXCo??= zj?zhR)`LfRb_yQ zg~ijT6{(qwZy&)i(0yG|y8EKO6E_*xhY~p08gPx(4=Mn>7>x2~9@$iNfIVU!u7wZa z%T7TWbmX;ASNrcSnTK0z0@YudV*Yhj;X0}uolG0p) zw%#SJ2}^t%nZqrK-%a!Lo#tDJxmW`d0H&h(H zU@b1(e8d9x;LbXG9&#pI_OFEXx1Ze%@WeN=HEL7UFeXKN@T{&=x@F^pZF#GILvMF= zZdG9!YdDDyAao_RR|YfKcZmNKFGQ0G@0 znf>{d&S=txXo0Haeo!ZTyFG9725I-JfaA4-6x0v1^ts|T?yj=O9MHG+w{H{N-n@OV zJCV00VEk<{Q(G{7;|ASrHA-#y49$ztX1dx2ux;14@4SM@#vduZd$f@atjM>~`sVs|%8u8j1NZSfmj zdn^!pyae=AuNL@ve0^m`oA9xw2G=HavgJZrl$G%0ifm1DnsIO5h666CpGgf(IhUPW_W#OZOrT3#*VO}pDunE{H4S=zTS zrR1)J*ktnfJsjNx5T#)>2X0dGa};L*=>glP>jf#?xySVuJW++;Tm>>Qk+V9OFR)E} zJzS>Pg9HSJ`;$$>AK=lQHQ0PAt%sUNpr1D7B#q|c#Srh` zzS54@0CF|_O0KF&$6|k88vW*X)giDim`Hf!BR}sYyB^$ECf^2FxdJ-+*ui z9`%T!n(gRl3Hi&J@WwYFMYevcZEVHp;kAs8yYgen6n@_9f+2E)GL*l+%T7>#xLHtU z7PbM>*hYkbxNdCecLU@M`Ed|-<&6vuC@+7S=0JmTcjiYCgv z@K?aPH1T&e_u;Yz+hRa(Xn5|EH<>fxp_yxONLOe0bqXt6bt z3Drjod(OipqJI>}^s~50S=y!w%1Rwu-9DvKXU(|E&kz8_8-e{cIyFm)+4Yc3jq{ZE zE0aTk=ni1ByD8D6Q&3>)g8T2G`B?=Gi;qw^a262hQQUA5gADt!cl%H>-p*-hqHSa= z>!d>uzqkx#Pne0@v2wJTC`Wo|%YPyN$(~TTE9Cb*cdjdd@>fR$&)w3m{Bg6I75il7 zsw6R=nCL~6jfuKj-vr0;F@vv_T9)&{R-Qof!zL3=Y2wp07EP#bjDU)kYw<|K+`c4K zZ4p!0eq;5`c~?-Hs3b#D9<74HL$6D-DCX|xU2!+oKL`OZXH9~6f8mI|9)5kIxfN##JA zx0ZV%hRPmEp_tGc82KV#%vww|kd+-dnyj7wGLBy;J1#5(StYqq=fD0(HYXzOa4_-J zJ`Hz8aIlq}a-gHrllVcc?xws^0}!yc_Mu%Rc^5d0slTW7D!sQ94e|KH36UTu%bQoX zPQa=Y=bq4|lr9|1O(@(+zGKC*Fibq=o#CA!_O)ZT7?l+ju_Wxhh4D8Stxygv=?<}A z-}hJqAm43%aj{?A|Gednrm$T(lodFE5Emd?gP#ayD2tp?1d(+Ye;PTmy_q!qIbC)% z=X znn6*;f6~GxE79Vj)~Oxb#WQ>k0QNQo2BU`!>I77lDeo@Q-8aih>|GKkg=@C~uYyIH z#=y8mIy6Z{-Vf;DvUGRScwl&B^ED^oJqED88I_$SC82sgO^Wo4=w<*-j2H9w<*J$W z269HLPH2>l)BSY-EA`71N-n2(-(OKnFtDGBtmwz#tITUM8a%u=#JnbW1h2kqCX=5p zyS{=3gEFM{88wO}+c{UETT`y~&SPI$ChTZG9F3L8LTh;9I3bep)2C*uwa#uxZ@L#) z3!dvy4e*;svB$?{D2E66b6an}Qen%AO@Xo|-}Y;Hxs`bSHY{Fs$3E|fi3wLMB?UiTcCBNI%Q>w0_oeNdhFb^M)w!Qu!xGE{EyR0 zMTEbme$B*ZAJo*bawR12jQ_;o%Ic9<0T^I#cG=o1EO6d~gz)gUCQq%T-wQzby|6qLC`g}CoI!Y=P^R~?*s$R_F9;bysO#> z)lF@Ihd4Br=biue1c*hg<~d~;(}0KEC1ebWgODAa{93T{KW0{6+3(0$*K&&caHcSv z`tDUTSK}YLYwf5|X7(;|ye%!um1@&&%6obYBLd@Q0wwGai_@*UeY=s=AJ0?n+DHeT z-WwO~*7LrnZegCJzAgI8ShqsN}$^9rqG5RMjKrkewPS z4rW*BPV$PE^m6q`R?vuxEe&v+Iz#ZHyf%#>f4zC8QpTZ3y!Tg#1xh|_E-1km^{uNO z-zZ+K)!o^tS;b(pzd#;2uCk=f<3hM#&ae7wGNd^a%D)NhR9-V5)cE~E-bTBCjc$?T ztpx9=l`bDH|5sdQ)PanPV~n1pi5U?te`T=)ke+*8>ZET-)#dT<*f6#xU`f1P#KW`E zPB3wcuq3vq%>Ft%Hns)*JH8uMqj`D`KYStg=D+vyQxG<=1$5!QQZ*AYG@8C@OE&4g zJSp^|qM2EV4yrb?qyv7D*RkDx;R(PMFEW?D+_E+as)vQGF$GP+Ckw>=Dmcb_WePMK z^K|N^PfkHjw5j(LI31X#E%()+q^Uyj(&pU2%p|KUq3vIHuEB%nuUVP4$BzM%M+8-j zTfq%75VubHnW7d&IsFK%{sZ=;lGJpBAgM;oUGr-X*ls#KU~ITeysD4G6mlORirZbv z!4HR%+3WLKB@bu3>mED{R6BzAF*EFiL**Dj?MAS3aivqoeFTg=6hXp~7|fk{xQA>l#?Aw2UYm+0e*WCUT@En#1gQD> zirvtZ2RViDjGJ+(1FI@KZSljraDo?c8_RPq@ByX`=%4s_wpx2+u?U#O0I&8X`lF$~ z&|*c=^5gUIxa78CljI7CL0>+Jj3Gbh7>PQ=fsge=JjJBV@K^emoDZLc$j8&~g>A`HdHW)?wm&AX?Xr6tK;nwElMT!6wnV!7`~46 zgzarTKeC$JqPe|IDJIsi^PAGk)$q2{HCGmwRk}qVxRLUh`p%a}8qm=JT%HEtjMba~ zdY@*XcBLCc*MR&uc^805VCr$Q8SJK6R`sig_QX!{m-B`^ z4Jkp035}oE30DCgLAf5{-K^fro3B#JS`D?_=p!i9$Cy7UaQ+_X$@l3K?wrt-i*mgy zDBTPy!=ilQOaLmaC{h01+ihdBvbHxzWUT3P# z^Slh#s-OHY5?sX*VST3Id1xS?L0KcHyXLQuoA8LRC<~M$1p|qcdNuHXI|Cw-}vhihwF92Us70oiBLwzogUuX z6Z4^r5y;!F3Gcm+{=2}SyYEgNcsE$AS1Qtgy?TjhBck+MNF`}NeHO5AF{-Hwa~n!D zI(HH2b$@dWGwJP9hv27Ev1&F?J~qjneX8f*>?UJp5p%<(F!2t<%?f=|mYe-4Xvb`)CTqf(I=QKtW_??FsC#NGg zbJdB%Bz$yk>qbuSW5*kf%2$Y6?&u4Lp66R)n4L6o(WVDhVcG;Ch zmplB$9(V>wn`15NmOqmQ4G=Y0$aAq4jeQvOC#A{%yjkD>REIv2howzQ4? zGRpUFC)~A6rJg!^oZJ!mJC`e-#L>v2;68WNKl!67d&j!Vzy9;eGMBhBhzcq-AG;V% zX1uFk*ML)w>oQpG7X>g6^=e$f&LYZz`)RJ$lkk6FxL_L`my?}F?)_E~Z7m{#@eC5$y*T-yAdEtjitjnyH(K@B zpuU$8glV-h>!DHHygRYhk2>8|5p3s6n{G#v|B81;3A|U45iQIykc0pvb@aThtj$dcl`R8Ezx0=>Usy@+U4R8OS=yVZ`Dvd4%KRRM7nh z&Br5dhqCXH(P>w*higr)brnzKwKi>*)yFb)6@N~E`hPk?3ej0qm2YP}gdg|p>@dO~ zyst8+>{4QLjHh(mJ$;mbvas%8e2FM3qxp^0)zsA>+dNdFo*L zo4V=^8Xv|8WZHc-A2hi2Kh5?eYhkASSaog!YhX zrW>mk-CMzTLdKHHq2ZRec*Yu_cYuyDvSZqCiMM?x%|(jOxD+oIs!%Yz8x`IKAEZz; zJEd#HCSfx}MJYx_fFQ{_6jGxi7}_!VZPh^Tdlz4f3g`QwC`+2=2M-A?t1Zg5dnWrykFo(@Y`<%_;% zF#HA6)C)KKN!GCMbtslyj@6-$!5_5s*v+kbjlq_F5=+{8sGl9_w9r>UiIbQ0^AebG zPTkN(8|dEGA0D8`_g<6o`cd znaq5vC_0rNZNq30X-={47OaEOZoz3Mgy^{55kq%IT9W$#cC)!LbP2bmf z7lJTjmPJH;)rvQNaI!-wopY3xY{=oyD)&2b$ypQQ1;A*725)1;NtY?XtZyqj0RQ7d|S$` zo4pSw=85Cb+|JNC9x{A_F1?NLD}nAUCl(s~G$s|IVJ;^?xit-q-0jY_wC#h(Pf1=dU~Nc&awNHblaUK%+$EE94eU z`)5f&lgR~t2 z3yVvrj7aDlbVSXwlG`c~F(GfKtan4)qpIm#E1(HTdh_?5j0G1QMWzC0=dj!G# z1@!WCx@xYZThs%Q8WV#NBMTGFhe3|6!oxV1lI+Uvi4vIkbl$HQcO?J4dGQCfF!Czi zTdhtvK3XKkB1u>CB_yt(o=uhcQ(_WN_sR;tZAe6;OY_&hCb-D2Mro1*bM{JEeu7Ds z!QcF`N0ofeHw=FIgrCT`Ci(&K*1LBNW;;M?%qKmAMXW#|!_;mfc-wBFSh2;>-l&I( zWQ_wFx4ys&o|62-i1zM)=t7={aDXp7FhHn;T0oA5t~M*1#k4J**!Gt&poY2yjG&0K zt6{fYDz4{Kx+}c5>HHX8Zk;lytH*i2W$<_6`6OK?(%V~%XzwJp#WjqOD-7K--U1^3 z7D^Xa7r0VbiYIe0;#SMX9$WRl>e=SVVmglu+jbIKFQr-(pq`dN|6qj|-GbV(jJ4Lw#cSzc^BY z_oT-FT+3Q4Rs@&Y1pzR4Hq?tbN;-4*b^5j*df<-pqT3ll+Sz9%NDgA5rsP0>{l)ES z`{08Git$gluzc>dU~8j2=~Kyt$Y97JI%|#v2%RV7**9TvPq7@?SF-8hta3FhEuCA( zFS~*4l{ddLGkp5SWXD*ySUR!O^t643Y??AjjRuwm-fxX?vB%QCh`Q@~`!PGRfdz3q z%yKGeuhnx?#+){rT9GQM49pR6b>30!HsA~i1zRS|T%4?{+7{^d?+!+DN2~2}<>eca zE;=hf9OUkJEYK(9qIUoOXRzD-uqJcX-bd@6O!4DF(%mksT3g~~ud9bculVEp*_X2C zCvj8Z&!`WaP@3eNfg7?FbkT2lgoL9TOZ~cHH(|X;7o|;CQqS4{ncRxWHzUub9?xLI z)bFjxdkf2y)6ukbWCE&5Z$b17IWDoE)GJ$(Q}{ryma-QRLu*N4$2uI8I_ zMhA}d3H|%UxH}GP*39oZvZaI6Jf=P+fZ})Dg`G>pH8o4aqck{--MN@n;VXUi1h_Oy zyImw>;f(aXn2eL+byotAOoUkyVKyjA&J4##x;)e9LfBnMq2A%H_)6zBHW86n_H7H% z+RE@Ask-7c_G?anlT;@4a(!Df)&dnqT@g8dcXh;I2si z9)pgN8x^0=*yk@=VWb*MS>f|#w~WFml!2zL$hU+FYXQ3ody`w3ZxxT$va*DXt%e@^ z79<_e6~4Rphpz|pSaDHPbrVxxdegrk16*G@7{lE+fexSB&y{keMp{Im#FFT z9C^^2JU=+U78yf3jkwPm_jNyOiX($ET(LLLdX4?IV?zaJrNjB|$xZJahO;+xD+v!l z{1)}ol+j8Y8ej2uD3XX{eCJ{DjteM#Rl%ow(~A9LwFr6gb_efAe7M9rC-<5D5~$dQ zw(9_A7FeBZ7_t1^h2U6-R!y+Kix+W1_sB<{Qlxe$@+WRu^{uB!iw>h%z9RSMnxDok z-g0X4Qadp~vZ7YQFVAyuS?mE%Pdi+y4C&G4B`DWg_N?V145KQhR{Y12aO!x}5z`#YDPrs3^Ee}3{ z)~(5(upVmTRp*PcDIsfevATahr?B}a>sM`{G#ryU&i1~xJ4=I3=mzVd>bJZ2w z7Jz)Cbp$E1PTu6j5I9%XMNsFttCFnm-v|8CIRQ6}FmRy|tMP6tJd0kZ6Dc2~hG2f2b&^tam9W zJ!G;gnxZ%i$gCiZgmu9QC*)95_#_re*TSec@iUUlS5rm#XgBSvATA!k-*5?dDa%-h zuuo*Y;KMrwFcAk3wY*4V+iLdO*=MwB@h-vu9_)&F-M`txEN?~OuK_9ULLwZ?{U16n*UIx&?o9AZ`eJ+quQ%D_9>$tG#|{U|1QXdh#!uvd+X{{C zTf(+51dK($rRwQwe~#EUjPDKR_($X(IyTM4*9CugU(l?)5d!d*Cv)>bMUhDRx3>sY zrew-mTGYdLkM$Rqyev~9yRTK-m3X2_Iy>8Z6DcvTy8g?oPO#P5=SGGQLc@-Z0mR&p zXn>E&UYf7U^%kAJ@02;H*G>Z288o&JOfTEJ6A39{-M@mgRAZi~>lS-!^Fe{ zGC};k|9jBl04tJ@NxwqKrvA&xS=6*-1Gcp?NfYf%ca$U^JipM;Bs3!xyJJF`uNkia z5h*%r-=HPtr~E1!L4a=!q;gec71VMW-?$Ss^YnRzJfMpEY*bv9B3%9m{!m7YIZ2^b z1ZS5XG|vOL0NT=l#(_$Ptv zjX$UF1p?!_oYBr9+wt=in12&qs()jO0AO zVX~i;l&QM_W1OwDbf=aK;rQ*nD(Y?-*FE+NSC19J-3oCP_YU=K&9(gpT(vxH{4t9IM?e0~2KkbeFRB)BDi?7vy0J<|FMR z-xtxgZNO*?4KR)E_*p1T0xvX+XR}fPeTG{bhH$Zee7*%S&I}&ISu@q8U7b>WUKoK( zS5j3Fpw^Y^ta$)Z`H^VV6nWLwDwCZ4yjJ!36>0Gp$riX5Bq}gJW-?Y_JgAPvC03jVl}9 z9ent79Et4Jno@A#WAPd(-adZ>cS2$F($NH{O!Ys$sg~e{rRQUr3ulqL^+h?UbwAxL z9y_p)7G0Sv3MsDnvpBDjEwn~zKkbn#sU@W8y2zPrxr)jX{ETS(pO;H4fK4?TP0s}h}j6?sH!ho2dTf=fue%A{j%Ini4B?Z3K z*VA8~;Bz`{SpIEwsg_2OPfBE;AfF=}_*(flMM$MP+mYA+#!tKskmOAwTce=$;h$+U zh#NmBHm+)3wzw#nQieqiqSfouTB2`#sn3~+`gz2)!scpC_UT|#3jDX8(v=_Hcowm& zB$GbD))m*P$)V(ZP#ICo6Gd#-Yd$?alUjiDTc|$BfnP3cMDjQNW&lGiRxcjew++pm zYIpa!6gLR@eh|h`*0n{Vs_fBbS67#qZeHV?pA)U_vMo&)0+*>yQ-d<#R6WBm2(~hP z*Cp1bqjknXkbQQr{0NTm-cxYM>Wd3{QWI<8GcA$UPXAMACv)~zf&$eqC07T39A`HL zL_9UcEtbP@b5<7VSELb6+hWZ)?R3+aPRuVfx_Itwz27D|U~{vQkrAH0to+69&eIIb zv(e&nMXZ=QK$NO&kLe%8;I{&SxVJ|jUL|qGlsuhf^$Pdp{3E06dZKgi)tmRQ7)%S% z(B3&$)Y@DS50td(MQ}&;anb0kGVuaqpNAmsFgY<=PT8 zXpBcqtrxKWf)thlg^MTXRF!s@fl&mUggr}Ym1jN+Tp zgejv9{%vo%MQ0ds$Au=$aTq(RN2@XF50mkH(#Wgc z)X)t|XUadO~x-CJKWF{65E0U zppmVE8|i`nl~X_TDz{CR60S_66fzb38~7w5q&}wz*K?1r^@_ENeqxK(hOMmo+LkI# zdD3D!I5OeSgWm6spAW+^lwiD^P(DSXA4g&LOC;8o&RCI+>xB%~tSe2oNuTMPi(}jT zxR8)pFcs1X!TR%9SoVd6G`}kFVQ#?C*kUK-kwG@Vga6P+_WVAOQvxW*ajg9HkdOrR z%aHnOqZCtu(;sS)(Uy~g6C&@ft8?axiE5cefhu1nhT|pPGk!KF)8~RtTS4z`Gc~+r zllwrO?h)ZQycrXJDChP6dp&`2jDe0WNdxaoU)bnqfktye^~rMwsEt@xVY(!(vg zsEDtAE+h)@w*>p*IzFaw1`V&?F-^V}lv$9l&*FHb16wIr+{fddVaXSey=aYmUEpo* zS3J+JWjmj@<-^bS6BBT`K+Lj1&_To#?Y>$?oDt^biVAh-u32sS-o&bNJ$U>l+C7`aroDEx(=YaCk$DiO0N-!p0p{4$m~$Hbt0a|t zQ?zC-nJzz5I&tNgDMPs;VCJAmGqU0#;r2-X_o{8#gF5t<v9O%(LnzIuCu#`lF>3RD1u2ZD2>b0t*FG(vanf@&6VI^fY^-*&h;SDf{1hP$}Gk z*4yt-C9tsmV!w`l7^~~-+BAgIFJh6WfvFVseus`l$Tf>jaeFs1j4s3lP{cRiV|0So z0~;!=;)5OvIpgTh%e#rF`$=E%*%P?H>?#`nWYWFSt@mGCyuH+ViF)>;lpbUZ3a&rv z|M6-!e_;muin1#hlD9r(sQ*Ybj>UoG+|aH9Y!}(LeOWm6zKzd}Yb4zAZxyjvI%eJ(U1eNq^1-KZDem11jo7(N1CZdN`P_{!1Aw@xiPTI3vlT))~ zo!3&d;!0Q;V>S2(*^9dC4)~qSMwk9(wT%{Uhem&<^SOzL?t&R;mfUvHp=1n7Z@q{Q z(dVe^vs<1*Ea=Qsfd%|e}x{OVv!WQ(5PvQozr68rc7)dnRXEI@sH=Ea{ zDPt1rIj3Lc6DRw>^wCN6Z3|Smzj>%8Q!cie(+wEWDqOM!Uf7gdi=Lb$KzT!F2cK=_ zq60f+z&Tiw0H3?rM5$S9R6pOSY9)sl)$5}0p2yT*c_1d=ds#AzZ`;!HAge;rc31|^ z4unz;t$QT1YgMTPD*AaJqijQx2_2KCqeoLt(ZHcYu-_kH9}t6Q(fRpB0a}HzrkDLr zsG4mNm4fzvh3Sij+6LT+`6g&?KN-(i@_<0t>r5pllO9r(*N-1GeQ%c2t(_>Ek5|uFR7*$wa)4{$Txu-fR5N)7NnO0EhZpLScfK5N&arfsQx^ zi;Wlh56B>S+rrO_~O_CkW*@ns#{1(6O2tFU=sw)UVYkq+viO-Gm327`-fG zi=Zu~eHd5a?J|4cTjO4i@id1H#q3zmcG+7G{5Rp?+=)Z|+SneV^Fc>|zrsHvP~j*V#Y$ok?5~rP_d5ZNH)7B%8YZr6cG!vi}FL zG=*R=owISp$?B&}KlyM$a7Um`AMn-B$V(X9?^*0vnxF#VRH{d^2C`!BUSDo1=24cM zkGx3y=v#UZ7p*~){&~VBe(Z47L$foBkE#LkK7#_Y3>JuKGigY|1eZ)b zMV~NFu=p(ADemfx?2&~p%KI^!sUbNTF(2v%5?tEQ^eJBS@wpDUb_xLV~ zUXCP$jNhJ&sxQ0tlb*pmg!=J2Y;xhdeM<^6@+-Wl3|6(CluR2O$K}m@d^CR~H{hJX zt$&an?^xWH{CdpP?nZ9Y$_*;*Bn9LEqK7iH7cUa-BLM*iP*gTNegEbSZC9Y+BQ$GE zZ7Ni+k!)@i9_V6^iv^s?=$tr1XCcdFe_jJ5y$qKMb#K$9PO0>F z*9{HnLYA^9CrX@fl0+~^ZQ$kuU{+dYTyQE&pzO@|)!JCuo*ENh^ost6N1f?6Oib1^ zUMMCvfnOk==tJrzFyNzRjF3#3WV)VkRRUq z9%sk&;1h_+I3i##i<7>mDfae*+*OP=P`q*ox^nOn^YCDK(Vg8p^UJhZ@C^q?b)nVC zuHd6Z*xR?RKtwcTIPT4BKKp(3!rO+ZrpU?{$iAEky&LO&%BhrHn-m-RTU@d*epLU^ zV6|f@x~$szbj0wGr^V3VooA$jsC#6%@W9RbZX4>!I1z^2ViCD5a$mT#J4v1R<5@@} zs{u?-8fK|l9&}Zk_9dRlF^wJ0XegBLZFDyNzE~8xXGfo1zU9q0yg5V z0Uz7V7MO;MXTMg1<7;@ho-YM1*uc>8R%(gBLOmT)@Qv1C`GNfp)MK)I_$B^VyaSua zH<8MO+2&ilPpcK^D+cf_70lB@k{@P?YllRUXEY`hqFTR4Q2=<4=Oe6xnvqkgJocWO z49NKJ?%*14n+i?RoL}*3GT+3?O%}?a4w9?ruDQYB56BPLQ>l$d-sboXLL2ZwUuS3E z1j!aN`%sLASl%rW+@9!?_Xh2=*MVRp9r;rsWL@7w_ikArlZXkT8#)dZVto>o9QA`? z&pCJ?DiT;4VpGkn-0oW;i?_-33Ms}@S>p;^&EZq{r&*UX z_>_ge>6^ch2Mz@kkb)qp$1KIOd53(1&rDYY@6a+|a6o8{vs;7k|h}mA@{%j$3I)q7@!C&QQ9%Sx)k^4dID!;`SCxBG*e2P_P;g2 z>>`WVUP#TAeHhPTjFuQj&!0f8)sr?Oijk4M-$+-mShpUi$`Qdeb<8w2QHOy z``kkJ@`Te?cD#StP@Sjc+#ElKbZwq&UFQc2gYRFtRa-^7+rVGd6*tE2gJg>uq zC5HYL<{|js+lb{pXsg?&3hL&Y3G1{>*{W!~O{b0L!QuXs1q!6V(mO7GRVf;iO9jh6 z$1XO8tFo4}My`8VynUv1ugJP`dv3BAe7XDIwGt|&iJKZhv=3$18k$@XTQe~{nsf~v z^uu!&Ov^6E=LIUFhoiRE&#CPW4yg)5e-kMd43P$VK-JoF{1vt5J0Hl@WZYLnP`RsT zjy!nJ30W7>`PW16&OY_c7oZm%CASAL^&tO9Ndt3*Hr(QF6d0CJr~r3geWDp95bL1$ zob8YKQyK2Oc?-2iLCGLCHhUlLe{9AkE6{7zwVJnHklw-3TVLKc)y87TUmSP1G!)DR zKqf9)5CPSJ++jyjpTeKN4-Y!{K?Tu*(xW$noX*fqu09P^C!>mCUJ#yZ&yVgXt?UX} zPBo1t36uY9B8tR*#`zI|JQM%7)hq2V3uz$n1@@;ZwGR>p^RYW{KV5&a_UV;4_=3z| z;COIj(jajBwo@b;4H}ra+N3JqBL63Gz4_YFrf5H%I8buwqSgNOBFrPby_g#D$RRsp zwh8fZNHjRIKWAgI$pFtz)Ce>*c%UMIYX?EGO(x7HUQ7HWhGmL8J8LL`||T< zyAQC7HeA^Fb~hgb&g$xvR*g$8L#fscEMZjZisGgN5q$b%}}4j*MjY*gP}M z5?6f%mbyfm5Gp3%K`(iRTK(^{N%sx9B8t0;PGk?Uv852e%bu0vC-OxW8+h6ND?v@* zhZG_nGZGu1^YXs~8mqh9;v{q|(^DPU>v-lB)8oq?A5D;Sp$I^(Ig>hklid5*LpmR| zWkDKI^mIgN(&onG>^YLBisC36%&7)}2n{ni0p}2w-U`@2m9hFQ7mzKCy>3Bu#EtM= zoGWUjT&liiuzLXYA8I37R-Wp62`@45=ME6(ga2<(Fgq?io42;kz^wl_>bOo#_YDVG z*}FIAkPZLPO~m?-ik*AeFZh(-;qZUCxa*>`4Hy{ONFG$u?)UxvwDJxexk=Yz?6?6~ z*bByA&c|2KP$`~d+YWLYMp@E5AFuq`Z;Y(06b#Z4lKqr=!&ZSWvHgqMsu46NPITtY zw5n4E=8Uyv$F!q#kqKXU(F8tUJIThpCpJQ1Uz^pYnnPP7E*$E8XzIjbj%WFb3y3{l zf>R9K67{0yKAY#l0ly>^sh~iBqE3iTmVMkyi%(4GIv0waI(l~l?RuL<#FfHAHKHc- zrPVjgf#3@1W~=-p9(^;2>JFTfp&IlbvuIS?ueqPwI#f)1SizxRLdxks?qpZQno!`? zs0v}P+E8%UrK~iE7iplI$0*?!XlX$AMnf+MxGeh6++9uz_d472$0oJ+HJ-$_kr9HN zhFsgR1jU5=qp_Qzu#B@vv?tXX1#%DQ1bYFbp?H9FBrt*u;y-GjF4%~k89zJAI({3A zI;F0p`uE3v)$#T%Kyuk@m-kvKj_OQd!ZwU(GOgTdo)XBqdacCpMm{?w2f^e)ta7DM zKfoRgqGiRTq-?wwjRYPUyl+!eob~R;hRMk_qzYW`O!!aS zIR9GZlUrL(a*{`m56+7~pZuN`WIkUEyF+d&)s`IE9l$CFPVLden<+2ZmxWXseW8>w zcq9urswN$aX)sZ|!U12l$uh5mbm9GG^HhiMr;t#xa!P2mLS7Ec$ru8VhqfrvOiTEG zUSt%u#5zj>?#!HEC63E*{@Ov5(-i5&B0rpVr7jc0auUtvDlqSIzBtCxUZb^CNwo&V z5TF|2XLuPJ7&A)|DH(J0J<2Gyg!b+h?o(u8A*%Vwn5GPG*RAv^uHrBeh!+qtJeoHj znGpRHaii^5*H!O42Xur+W%idQQxD2f)soXX%%{2}+2!77P_bA?s3?*RFXmR%o9MG> zY;+t57EF0N6J~Ti!BpWH|6MDr2bJzXReMtW_#t}P22qn7OPeurxHC(WUzi-qOwqC~ zPuMJ5`OE0B$gKF1T2~1p6V;0N0#udBLSVkAWUSsH%(eDNb67ocXSoPnpvujHzN{RB z;n@%-E3zz9t8s zI1%R1nA5(ASZc?{y=UaydDT{6-^tr#46q`^U_{lB1gnI@za0#3L`;l;JOob^0GrBl zbW;bO6buepYl_|->_CU}OF#FW!Qng}a-wsTh;I#t>F^Ib`sg!*oSm3?u(ti)wP}j$ z$5zh3pI|tFNm2vhj` z$m_TKTY`YwP)~1k4e{9&r6^!7s-4ulJa-`i$>#baFjEN_Oh9{15|S>+h+?LMhS zbKBoHa$RDd#1tFa!y{Ks%b|B^HX+@$H~0dxxGRsEaU%Hl@|_&XbBIe*WLnD2@?n&i zt4wynA5r|v8=7vriL9EvoYxDEACZl-U-hXeq*oMl>uk}+(Y;~vn;Y6aI)c9g->iw9 zuXUQxvT}ypO>TviVcQw8btb6Kf^`7&VDco!cUxiDeyUQG;3!&SvLSFrE?23&6V2>8 z4U*f1PW^(aka5>d2ietd;BRkVhrl=+x!~%Zgfp*BQ%J|bf{HKu_`^=ckfga+P9ly> zH(X2jdo`;a^=!R`pCJt?O$;GVWG47?k~W$lyDZn1bYGG3gHCN?$pVuFDQ{Tl&AWH zbnhsw%Su@m#(BHUuMj#+Q!=4<{KJl5*b5cMK{?|KqIC*c>4k@M*8n&6^Mc|enni1y zXTNd*@!cO$s54i}1q02+Cdg_dmbuCRgc|QtzoWLtJ1v9^J-5$eg;a7Fv2+Zx<-)2B z?b*J*uDcXeI)Uz;X+qR~NnR6)#Q2~#gpeJKAk9ce2F1X;22z9v`dSQkya7l6Cg`LV zsZGBRv6ZFqHM0)qc=qwGSMhoM{;*1K)blNojYK)`&%czc_;0~it7eSum@6CB%P76q z<7TMd?((W`G07whyj{z?o1MBkf?6gZZ~cAsPOFB&KT0n=5DD(4Kvp4EpN&>swIIXJ zqMjZWB~nQfqax1zHp?@`*v#JaIU!Dy?bLwqkjSU)d46%D@k2Hl3ihM)OpThklf*$G zf#kH>2=U&&DCj-&_rJ`+Q*5#1t>q#^4j$hXmpZ50g8TZ$#-yXwSsXv>m)>UAy z<7A%w;8=Cc@vaj&?YmH~qNnsVQ#gdfmChamQMtUY1q>~(8Y>f3#K{@GL(IjTlRt&Q!7*KeUKiPlXb<^c0KR zQleCQ*#--K0PaeKaLEZcBiQ3|m%lLmDJbu=Un8^Dobvf2be0g+7?m6JGPO2u=^*R% zLW136$S1*L9M{(uT@HoVgEJ}zgtxy;_FgG%I0jPJ2e$M?D=Y*17>dub%#9tam2@=@ ze;~0Pn*_l^fF+A&!x)o;Q=(qUWsulU1^61Ed9d!WqL_pZ5!LI;&birjq7zkCA~9V5 z!uZ=5V^}#|ejrKY=1=$7^SFjYqa!hsFX@^zIWBk~X*GEfM5EE6eDY<_f2)OmLuPGM0;|{7|=jL^mVpN0~CD%=j^N#xoS$ zq3BOL>~{Y?Jz6 zwiW+=N~aKhNuxHKmXmw$Eq%4iBzFHA@LUR2iQ$BvJZM2F#1`9$L70C&zS+IWWA!wz zm-3wi49`<+LeB7aww0pY_W`@Z>%RV%dFFRqGUa6v-$!I0L|m3{L}Uj^@k&!0+Ru&k zl5LQ}PEMaYKWtMxxwY0G?4-~1_7Ln{dvt~9mpaa6T$#(mZfb=&e5F^RJ=NsEQK-g;%-TR(0 z2i;Rhxhds!)d9Ge(hbg^;R?qhVQBo!id?T|*vY_7RvL_EgAs@x3@=Ll2f#gtUh$4Jl~b z(&r1PQZ)q)bc2o0qqN9-R-}9p7LI#az@^_&Clb(#E6&9(A*e!CW5yo|xAoZxQ8}%D zb+*C{ph*hi9!FBfG_Er6qBELJK*%KQ|BVHh3JA)*s+?;>CuloMnzLJyIrSkdvLKKv1+Jh>FWOQ$s+z~@`POC=4nxuIE_sag!>Hr^T;ef!BLV_I?; zgkmG2rG-;X1|o*|J{gj+39x_p@4x?W&BVThdLwXM0?XtRPft&!X4>3A+yGq-TJilN zFxX5cNNwy)#=VmgQ=xpqN*v}qeP!Ss|K|^YWyjPLT1g)ux@!_+}dQ zXS>6?zre270Z1B73}8PPV?FmFo8BioY_*U7O)Ji%Cm|c&9u>(@0Jp5Kkqq}AnQT~) zfM*41OW?rq#cl)VCjjx~AuAoky(mLf&OSe@-x~@-XDYO5u&D~Rolq~hHZ<}Z)yyhchT}OgUhx^+i}HXm%(G}z;(*^|4@KlDPm_u% zlhf;eTU%b$56uPdeJ4G0@I!gh`yb(8VpbrUc`CNcv@+2b@`LZ zw~5B*T7MA^DZwHEz(gq$nF>y{k{$ZK!D{VRExi_$p8ByP`o<%~XNYgAsXI1~rFsK$ zk~q5jHnrnqEr#7&^3)00-6@r-FWv#8kXqpn`YDwu8e!PCT5a134<%4>-%kzAX=S=O zG-TTf^9T1rw8cyE$*qCF1a8Tu&G%VEC9 zx}>oP#i>;$ddk2jdDfiU4je|Pa$%Pzd9{6{NoAT^JAFiAG(8_q zI6fO5j;D7%0Q4{q{XY(kt(g6IWbfqcRNWFv@m9TBoM9o2=s(`f^?Cvhf|XpBD&L5X`=?30g7(Fe zkH#`0kTkFdgxL2Hu?e^}zSf!|jhC@<(&s=GA|h;qD`BLe(zDO%mxHG{JJU@K@`fea zjNd3u=gh%2Qr0+44h(-Y-y+cm1HX>tRE-?kJ}*!UkqK96C`MBI!2tdO;OIb}5jJ&`p`ow+oFy!_$<=Y2 zQh=96Dd1*oI!ct=A&EXR;tC>5-g54Q<=cnNgoAT;E)K6Twas6mCW@B}(7F2$UUdv$ z6EJzl!q*9?1g@S#|CO^Nlym7eGh~wlq8r`<`um`eN4U>#$U26mkME7QZ*_P5x*K-1 z)y~Wo50SSbqy*{NB{+C_(btjtUssnH8F<)2+4X=B>|V}b1q7h*0>y6fZbwTHls?7?S$L+qsq(>gD&!QsU$&7QOA)Oymu zKU<*9BWv(V3lX@`maOf2x62^uzgkbs%@r=L4VA%0$@vJ$ei3I0^-Wg@FOI06wL0@0!S7^32+ii5BE;@MyjW%iQvTt9{IS>wFN4^ZlI<@|4I+&vklPB-vYMfX34+0USJ4Hg!5v2RluHGLg?jG?GeO99+WlHCjY9VG@+| zcrU2Bp!oIhooFVTwIc}@Aebv=Y@hydttoIQh)hrwa?$IeK(6Y9Vd+JNud%dk5SQh4 zfh`al4S*tBU12@oX=%NppJ`qzrc>e^Zif}MFiR)nw#8i6%6(?v{|knyOwgDL+1*Di zMN2iCX%*{T=mE?0zVwH#0aO)i-H&=+QdPnISEAh>n&?N2mRjFNOmiQJ;L4^Hyn~1$ z_!NzEBJo?274_BG_7nTe7#BRbgbDqQm;XUmJ|bl?pY@g80q%k_tvkjQK3&fy2Yb_X zGBNdpl<;U}wl$4qn!|gHyq_dw0DN1wAgDe+)rinhKZz}Xo>{%$Sp8*Q=DaM&tWX2B z#ICP^o#g9br&mG9!W_eb&Zda(lC`jQ#Z=n7&aOJHEV}P~2H$^r_N>PuBZEq340^c< z{Jrk>s#dC;{C*16xAm#-L#8W^;@Z1ht0@`O2M9b{Yx}k^L2CQF^Y?izFDe-A(euyF zPg$0f7OqHsW13-?eLEM5P9LnYvmA+0U4)IE_thTB<(z!p3)SofgTVjn|jy+?^Tz55PS9! zlRi*=TML!eyDE_Qk;zBs#zr1rjz@***7Bf2VE4> z$5%8e!592s7Sy!OCdZVdVG-@Q2%W=r__1>SDBDT>b`Qb{cAtHzpDcS_rLkyAwa}o# zuQ%uT0_T`D%TP{7EnyrC36EET$L6HgqRZwZcg>7tncx|x`&ox9(?5&A+i5z<;sV1U zL8?Pr-s54u54z@N^A}D8HV1v7AnwDfQ@YA|X_3ewnQz;zNie{%RdKv1VqH(`ZhXo7 zahg(&nzoiTT#F@SFO4(3wMz4n!c@%ORDeDPfHd#X$#Ep*zo`e{zRyrAI~{?a_*%+x zBU4Fkz!DDT%i5@RN+IK_73}_o|Jm6`mm;eD)S&n)ZR=`CF5{*CqJV-&kLt*JuZt6d zBUgMtIOY8XiC5UbMqUq708O=awZ>^Q5#!U8X2UbQ>}4|HAZ3*N->cv9?7fL2uE4Ur zMRmDKEi{oi1>l=FLd9W`VNP&!tfvgE9LM>=&~1oY?0)tmPT5^gn9XNrX_J7+24v2Dk9hUt3FXKF$#Y3oOL&b?*ax~ zKTlXjB~ec-Wy(I|(Vnyx5u=SqdlyGyZBFG$k^EGenouyX*BN}01Phu+$cT72-V4iS z|FJMH>n8jx|1pLFT=!LX3n=;j-f4dH6q|T}4H~`b*?=KSKVMX7gmmptsW5a6&{tO9 zeK)T+R{N^t70in_G*5uOr@8Hu*ajhJ=knrKYuD$4dSh6_!jZfyuY-J~!!<3r(6g_KWt~2>=ZlY%79I#tHy$F$;aPV*`=hKTK2k=rm21CdrpojxM?C z(ZT{To8rY&%(oqbUowjoT{3RaTm#}bTttb)@EA7Y4P^eb5kZzRG{)Nn!{}=Fpw#$4FWBDi`J+%Py;){_Xi9Vt92d;q+cLFes|6oMl)a<9ai{M@gksfc8SU_lLmy_sOeA;KNCYo~IR(s62 zGB_Cgtz1)yO`<)yT0aHGtv@9gH@&S%h>?&`n$nYLk52it(o5~E)VQaF4=5IP_9cE< z&Z?J}1B6?8kO?w~s`#?&A0uOGf)a8sbCR*T$M2-ImiN=%x)?jiB1b)MaSm{uHoxyNd`B_m_? zMqDQB;xq?+y#pL%fx8>vnK9}>7Tch2^a(m_sMxi9x}#6YG&I#+KxGFZf_ zdUn$=Nw6aH26^UVsU#Y4Ef!0sLRL_%%j%*FY@G8eTmx0a= zNM?5V5M6Lixp_(1a4ke1`E0souRXN0U8<4<|7g-XJLIPHI=`|0AOJP~Otqxd##!>r8L>(d#@ay{OwX$A$ zk<-4y;&iK@Pv#OFJg_NT;AYTG(Xb(a9&pIDPd2d0)Z_@ir$+GoCE9@`m-w0ni`3Ah zI*U)BeM}Kw6iapUK2CwStsdIGvpmh7-}X#R>}X+EHZAI^L-EePBm=s~6Sg%-ux40? z#&MK}6}9Ej!Jpd;GYo&XejV`@^Jpx%C*J?AfPY?~p7$x?yObT{;ttCMPN&d{5~!A} zv-TzKA`yJ|@7Rp!-K{;p1TQ)3-oIWQakYSqWtV!0{2FnQ3kta=eoD6VJxj`B1N=U; zD`3=5M{KEXC9<_e28rGduB!{MM;-F@Kbdd6azZieo7uHUuQ&;THltZv!#v`vujq^# zNZ&}q;~ZNbj`$GiJ8N5^SG%%5s@v-X7XgjQ>5)AT|=JPeU5*S z*|${Y_Xf6FcJe`WdDpD#*Hraov23?-D{5+tVEL!hmeEl;NjvsONA z?71y`Twq$es@@@LeD{j5S9;G?U?TKj=YRe8^J0kvW!KLRi^i-jX1CUQyQ(L0`ZIvZABFaN6IU%~yg08%3U`Ej{^jN>uf&3{xBER4SZaMLu=Fps4y-2YK@ z9{y1OaU6G!v(7x+UG`4I*)w~VorH`#WRz^q=Ip(*<*cSeWM*%X3uSMW>{T|u@9!Vr z@!-DS`+VN-*X#MTB7%;J8i+t;J}lT(Lk!mJfCnls`B?^>@mc#o?a6OubVJXM2W zi?R9`JXx;)U(N)n)0uxBO7-@|gTAmc&u=HgsKbc&#?Et6fD2r`>``(XOHty@_?|AnF$MrSt z@!r&_^v+ZC6%jT^DE<(o7_qHGs=t74SuKw18ImNz9y8Q#Ca(p@Jj;lmuukw7erDy% zqFJw`$MkMvR@7+MzT80#Q9z0~2CFk&T6`o?m%FD2HQ-oQxXPQV?w31F>?NY|rLXKW zxqWHunL$5Yax=5bNTHG%5Hmum3!&P{Pu+ApITpreUgyTf`2sVccFxvn*ki!7ILw$- z!5~2a^%ey}03SJ2V(V+@J=27o+g6lQij?~uUA3sQA!GNMSv*DjodkF|PU zNf=R?K6p@K1*ZClJ$xGgT@2SYf54SoP%`TDMs=L&qk@Vf*P*(-3DQio^G?`_IA0D9 z$MP}FtvCT#Vybw*9Iy|$Y!4L^enIv5E_MtG{lH^LyxVkkLzCTaSF~nXb4JP4amGa#F6cNf|ke6p@bONj*6GUb^RE(>+@?PS|{&=+Xp!ig?D&^hHBB5Ye@z);1cm z`;)!yBw}kyG(#zN_EB{wqX__#f7v;)noHjIpcnv+t7-u+mg}>`+@JRL{Fsl~xELby z`Y!&Sfg-5-5A6fC=mDEDAW@ivK0BoK{{YVp5J;1yN*5>(=MPmii`?Ll(q|g8-cLL@ z0em$u9kbyiJ!lybJuzd&Lsn3{5?9h8IrfGI2~dY-%FQvipm?M*v_G;Y4_ACm*{pCP zvqSpoe}Z7g5A5}I@sRf4+tzmpEI?BoHPOKzb)M}8`d2_FB_~Aow@UvknOP}{f3Jq^ zQ__yd+CGC7Y+$O-l+Y`kwNB4;IUo=c&Ky!=NUm^Hs3}GUTy27RFWRpoj~5O2VRC!c>l+ly4yBMM_p6Q@WTp;nx0 zGUD^2@(g04_THBo*8&vpCTlXI`<_#YLQV^jh*Ua?s33QV3 zInN{JGTFsGfoza;K$7r2v42h~iLyfPH{t@x6l&GN_wJ6n6w>e?#uQ0+JF97cc6ht~9zA2Vr?WP^}l;$~wZCY_P%?3=agfj6aL1d{nmIF9F2m#*^ zNdUp*?knOqtNN*+vFmGRiRvgIOvINy?#v`E_V^>v`LuZqV2q!@gz}PiL z3@F*(8ua`buHJw2Q3vu7duc)#J&k;~tyVsYhPAH`*)FPBNN z=lVprVd$%WrFHJgMzg=HSWhO)cnl$t{5(xl`^WR?*uN_#iQ=6}l04J}TO|4y5hkR7 zm9T<}#`9&Js6PZ9;J?Rj1Z+c^BNmmNfz_Pz!LdyCpwH1iD3^qay+HM9OBn1Mv!{!E z4^cij&3Y5b%Ya6by%;#KzgX8u22=mI8OVAgrF1Wk&?l?{>l#pqad{AN!Pk7dZ-7%s zxMT0KUnXYtQxWuTsvk|Wn!bTS?((;%iVDr)A)>+BohJ6jd{X>rxiUo9&I&_($cbIS z5f8x$%yvDjf(MGF(5quM&!amq0ngQv$z3((5NVHmnq)_?vmVHtu?u_6;2A*;7~*>Z z5t~JyuG5&;2xW`<9W+3Ww#1n|>(-pM8LM(Zvd^UO!HOC0zuHiNxM@OLs_BL_#H4}s zy+{q`myq={wIBn0Zms-m+)7>YXaDu%;%jI-;!3<)rC;qDPyMpXZ&r!aMw4ftyDz+L z?`qa?t=CG$I}Wj>CJnAPx<3EVZaP|vFNI9{cV<^TMkM~`J@Fs(13SN3du4d?Tg|QA z|6bPVx4yXVGgy{AL`>Kq*Qll9PRm@8B~_GfqS35_kE0Td+*kz*h^jT z=+V=J{j=J-Dz%V; zm>CIw8j*tsb;xNFc&jVkEXM(xzgRy;NkQ*gU~i9ZDpjFxHTuLbg=H#n0I|M!1x|~+|0jfzbD(HK zb}TKw_kTYF1;v?ca$PpuLDn}l?tEDn5J85e=~aa&)D-f6Virpz0L_p1dRFQ5h|mxG zajExcp2$k2;v5luoU_*Pn2oPN(1|Vfm6`96p>sU-s~i}B;mPR~!GDXOfzrE^6tmrR z8R_T1^P|O1M{qWMqHCD{=T)BaR7x7JgEG>W_JsY+7Fd~k^z*lM?!I{NFwU@djlK7R z41258M_VMA8(|(pqrs+Sy2O=pk2f2+26Xi{_iy(p#ymOIy-=XCUDUdP0@=j#yj8vU zBZN1&(`uHr7=)ACE933d{$z5x{6*BEfbX{2oCV5oG5A%$?J>p@{bn}F&qEQ2eojO3 z)dFaYzQ{_!lBV)l9$~(IeFv;>5aG9q_Le!TV$02641>6Jnl8T8S8*aZ9V?1yV_^yI zCaKq2?fu9AHGqc(FN*nF>>u|>dF8b?K>K?3L<~*_pe@r=<6rhWpxUaR)6+Yg&?*kD zZW4)Xls{gEw0w+RYf*Dqx+(EY*q8Uf;WnSA3i_468L#YFQC(?pN11eWU1yzx*yd1} zt;eLcp5oM|oZ>g9-1FE%1myXL69ZZ9zehZf8St87%qp_WZ4FTWO?Z^qZ3$pdrKuy1Kspxp8^Sf$&*p zm0EWr+BdXrjHw|f;dLw*CdU>5vt{tQkE+k_2DUir+f>{h)g&zK)1p~Wt3%&a>1t1{osklsKGCpplYg&zC5OF0k1!y(6snz_! zWZ030Bx3^nqd-`?B9P3X5zn+U$8JoMzq^k>s>pfZcjY)8y8w;SCzdxrYApSf-d|c7 z+;%@taGDQnxu4obW!{s6IV~E2nzo2W55(LCeyL)dp#x=Kqx(6g8FBM#M5d4qNa1so!^Sx6O8JRskeK@K$Et*mKfV>e0p*lvhFYx#tpH&zN0jv zGL*t15kg%l*e}`!4NHg^y6^Q{u0HVh!6h7O>BRuOzJk3l@VVy$YDteQiUj#w9A18* zU2-#4`CvnOBGN2^ahlYl!N=3?EGfUG{?Q~LNq-UBQN`;hZjgJH=qD^xVh?a0a$Pd!rYz|C<1X2H zw0rITD&nLm0v|by%p`l*hw@Yen3c2bwqK{UXOT}j?76e{OLp`7TTrn6gnCJeWu^iH z2Gv){OZ65w?Zh>5V9?fIqnbOp|3a$>`tk?BVu@mVec2f$jkrkd(Pc6tK5mFy0}2$F zmQakOAo60jcu_-8c`Ql3Df*cj;_@pxP@g`9RBW=ispnnq&adxX`%%; z67SIoNCXPsqC=#nM3km_Zs@Rv2ylqKh|cr2p)~rO5m}vKkwElF~&L~yugQZt|Wutq%+6{*5_`L93SuQ($=p(V=5B3C}k+1!! zHE%~@WCjU$I@~69pT_;8c$cmCmfLw=YjnOnN-@cE2GI;SyD?t;VS^UoDqnOR*EFRg zfg!eS;j+9hk&lCv9>;6;rm4h$2YA&%H^|XDpX*DOrNihyreM4wWjB8m68T2q30pyG zhyf%(kF+3Xb#=8ShD7Y}?zi|ql2n>gC-huY5v5{=*}cBeH@k_z4~yv-;lo7=@NP|p z&1~b5=hZEdm_s+bLeT8YjL~qv?@tyzdgo)YGr>VrQ;w)@X|AU8LwTiCOrkp>m$bg< zH&7h=_pbVlY6De4KJ8+tM0Gf8@|Q>wdtw)_<6*X~M>~UT)PO3w9O-_0M(4{H5ZX&|nV z?wtA`7Q=X)LrXKcA4DSOZ*#O?IB@#W(J#)o4R~=%3}PjBD1BfvMeU(BZa05at6=vs zA5lbZxHevhlF|L#UBsmqf1kw|04-Xe|C^!OQHD=Vhf9@9x_&b&iu@rJ zavgoS21=r^^_k>)U)>|M{6$3oWz-TJUqo_s4j((wYHO#Kq)?Qj7&9gX=57Kw9LDiw zkKq;Yi@f!plw>JvDZ;gwx2RFbQ5n~o-%fq}t}=zSm01U*Qw zZ!$c1AE528zp%><;Z%}t>Fw#MKI1U`-MuqNDo8XxpIEskIJ2+(z+4YBFP2o5iiyKn zeLsX6A|ntn@|=D(|Eoy)vIYEGgYFvPI=3#t5JGGFz%kLa-Bmw|G7gGU4kHUO!nDHK z>f+$DrPg)5t(3P8pizKc2t)+*YUl6#eM%lRSZ%PVQ72(e!Fp)00dTf5+gLlA0qyOO zQvo`&6II(ZRdaj?ote3wnKh8vmjx`{?}?fgT#(l1dA!sn?pL;7x337D)(2`a(#pUA zz&o7(&ztHmG^Y!;Krj;}LkDpECY*RYHXwoR&8JRzc zhAREa*C)x!N@3u0NqjGbRmZ%rs4_i5RMn09n%$C*v#PAXB~;+1B?>ctc~8xVp`|6Q za0*1dB_6){Hw@ZPth#d>^SET|Z423l{c=I{o$j8L>8rd?n>16W5BwE78DQ#W#KO0< z3Q^=Uy3)QwTBhC~`ROGagpD#mpBtHGv}22e)&G1OjS}X+_1>-pUXV37-3jD0*>6q_ z&2mW#LjN()AK$QD$LUdWw3FuX=oZBUjw%AiBFmhClfYXhT~pXuQ)!=4*>|latkKt7 zw;cf)UP9nw(t4hl^zF!G?R!+*27-F9o?Y1AkFZ^=ePo@vGBAdQiJ$$?PXX2v8;RMdkKXE~R!*Z{=oxgIM?uSs(n*)V~KMi@#e!r&$ZNICuM0 z&B$gRxVpMRCnx7k2hlq~t??2kqM~g^G6VAdwI&8^wnN3DG&NQyY|UbtV3qHvyuK<1 z_U`~d0B8@<)O>%>>-kS165X2*)4EvYdX0qsy2>3#U>tUcW2_#ke6jAR{`6$v=?|46 z6993F93a{&!^`;t81ALaj)54pU64ZPIS=??L+SHB6VxAo;N*-3Nl&SGjKOseqn;fj z2d3X>zXwvRc}Epv8iKA}@H>^N?@)PZDJz3T*m&T40yUv}LGp`ahlIaE;%{PLGC9EE zRlemB*}DImf8*Al?N=#c{`nSS1cte$!z@)z&HP(t7mP7k7q+3HkC!mN9f9@?>=|mN zwH<1n@+i9EX=NrmRGlN7-~L;OnD4E%h5Kvqc4_&|@&g6{Q0o^BItW}p4%b+fptW^o zQ>ZQy!No7^fELHWbrxr04!y6VZ+R?3>sb3_4eqBuf;}Ravxv(pp6>l(ez1CY zRx1k4H&KLwspBm8sJwWpG~-NtmFq6-$~|f*MP%qVA9`IJQGF3>nDUdjxH^x;F}c_w z{akl!)mS*lw+egf$qxl))&^{eTZH!JUr~q`i@1c_Ac>pqMAUzQE1o9yvn|PIsbRf1 zD?Fd*K_Uwew*~A_6w=5fcdv{ro{w{hIA2o+#EPC>wpD5fi`ZC~cZaua!i#8|nSbw!4j5-P zZrBqB?=2B&e&|o%uyjrIs?jIscv_z0S#8MZzX#gvc%qb-+hucP@WM8Dj1cY7{$aes1q(+!2{VD{ze z9oprXE^4klIj zw(9I)(-QOfy!gd8SHbwY*Tj}#7mrUmi8jMlEQ2K#zT|>{ponGPzvJtr84A6T{S0MZ zk%KO2dbgLi20QwqCw8~)KUC_dI}>uwBTd9KxDk`7d%h;x9=r} zb!G1B;1MZ|1WP~{yB`*Hz^`f|?R_`Vqx(IuChRhJ%EOo1=6_wpB`1f}`~r}@kh~<-#v0W^O~}p8&F0n{9xi2VKXIn{1uhrDWrTG!*NL6#BC>>KsMD5WNNK&>U*rd8p zI-sqw^}FA4aiIRlgQI=bEtRQIy^g8@5O5JO?X^l(lg7*QT!yYx%jg&Wn=z$aTAb zw`YggQFHeBL1Z?ItGO7KI_5AyT)4d{y3^8{Ttep!aK*Nhov<=scZ>K&p1-I0P{VCC zxlk9q_PjRo&3f!EF{B=#UJ@_`B#=`wNqT5Lkt2~`vkIG!1RrFsCHz~eA+IAt?!e$P zX?HpQy|%Ul*~gKZ*4dyChTNI`rSpBIZpYA`LCOvGU(mvaxLM!IH*eyXS^dgaxvsrx zQ93v8qJl5}rQ@R0qj3eWj9KvdrTKYLnRJ|DDy5b0c-_mD zy~mpt^`1X$v2t;^gYJ#QdcsZfAh!XwWW_?tpmINoFUnh)**&c1slgW#f}N3y$cvo2 z$HH9#kzrR3OTSB8b69|sw^gWyt@+7I_ZyGjkk)@W{sPZ`B@d+MoF7V6v3*Brrv=)I zl39jPN^=c&CS3Y3n=u$>60;p|&xdAXY+KnP@2_&9sNa&M1L>&$^TYH?->8^KzJFi0 zyNOGwtECDs7O9T|%|?fk(pG=f%Ar32JReZ`r`HNq-Uvm|K}QYoHnLlVgyy1 zY)?5{z%iVyCn<%o)AVz`SzAY3KI?Q=yO!%VqEAGnv*6t!whN=map~5<57or%-lTrR zUYH1FhHqK6`LV=!@(nHnJLASa%H!=hs2@aZpOH~xVbJbg_*E*!ztVi{H~3&_YS3+5 zj0~S2gFLnGsr(!Zn4GO;7^N5f`Lm+>GDTfIh>UCsdpWlDtbFi|b1!*OG>iqM4h`^R ze=$EPJZF9bI}m9-_n8>o-5weP{Tym{(zo|lVuti*m`m8jba8vnc4b#RH}M*-S@0c- zn4$ooN8k3~XdU_F$Hx&~f$6%Nwv2abbKEf<^_wK~=wR&pUtes;b5X00teQef*TEMj z^qRL1@Um?WSny1g12>e31p++vqeWGP)*@StvGd_4AAp7)o}B1+j*A>c(yp_U1J)hb zn|0?IZ;=+t+r8`v4HeP*Rv@$MEeIqo!SFX_q8fyBq#54J{+u~5j(yuAH=X;&dlgk^O4K3 zH}v`}dUkjnErS)^3vKM~FL|Do^R2d2nm+rF4F?-FL{a^%Vxh4&ACenJpbon)KKOc=1tbL7__y20b3fw~3RSm)Wuc+e>f>R3ECYAR- zikgcEz5x^aCBb=&EcsVhC8J&wV+rd5BxH|?wvB$HodCT?O7kPfKkiI%MdlFJvPFA# ziz3&|yIyr@mPZlR0TG)ins&mfFNDGR1j0eC)BpKb4ly#PU9r^{I?7L7$&L+ff>P=8 zd${{jIi;rf7lFBI=j1Z3&*X|`dsE>?TX7%xAQpNCtaPIc`Y{M+l??|GpHBIYwSZj} z8cEVI7ok`~<$a@G7n6q2xm^<6jiS_{#I^H&o&Nv!eI&8m^d%=f{(#zcy(R1q%gD9% z{qN4?_$Z=-IgW!*Z&8}--jU~N(na#iEi0stWHS{OQeN$7FMw#9>vN)U*)8INI*I^c zcI;M2L`q*agX3c~{Uktg1?O7H7;SG|hk?hZ)Qk6erB2T;$uP$?CXGR{h3Aj8pG<3w zCqPLGveEL|?CQy!}MbH8*bV+x+e_r{Rru-nCP?-KWYDuqe@p~@%e zlRl*qPy2o|_y1|(h<&wnhm~vG^NQHiV*Bb(k`Y1z|Kc=3ZhkSewp`ljm$B@#gQLBp zdwZ6F@PIzoJG%O12fcczNTu{L}&)jzkz9|OM}MSo%d7x ztRL9tqAP4t6#v}Q3RDHs0iw-v zoLD;J4@N;_*e^%#5lRPxN07w4F#nFd>)#xZqmQREWvR02nA7-I2(OzkYyXXumz=)P z)^)!~M)W(DxFWjlmm*`t-h1!>dh%i8{)fkX&><(X&o8k@ZO#yR&{|OQH-Sh&FJfG;-$ed}CYDDm zv$I|Iv*8VC1K=7 z>%niyLe!>8ehbI=HZp4~h8#ZM@^H)pH+^*d^Hdiqk@1ExsJcw1Y{PiAv}sFpS^A>h zC8E~W?N;|w3Fk3bFgMJUNkNFr;IBCr#gMNffdv=*E?Mdge}9MNH7p6U7_+&Fs48q7 zLa#ZK=e#pd>E)0Xf%a+tL&e3a&s5hn+o??art6%#=acamMcL!C`g0_Wv_nklusWaq zVN3X0R{F}@s8a344|HE+liysa-)JG3hkflC{QAH9!L5W4nMls%X9j73_QX>~`ITe5 zKN~LVMT7>nR%GCB5WX547yB{#t_KIl(A_;RCsC}AH*vKCB0CPOJo;NZwkC5aPfcNK4%mNMDiHnso?{t#dJ7owhylFKt_g1s zIu?l;tCt=gL9As(AL;#yJ$5aL_r==-MqC?tEOWvgMt78kw=WhelR$oR?qQ`ljyon; zQ@isxMUJNIm(H?zkfqcv}ng13s6(uEtK=#$6 zC_cnf^a+{s_0LI!pX^4$m_(7dV$gYkszG6(+1SxXtdZ)lPEku7v#5<;)~ooYcKGC) zX#FsG3teb$;KcJ&dK|m#{2_~fCFyGhHPNZxU|+fxO4fj%vhNuX(h7w6*w5aGdA2rS zNTSVH4+caq}SVI{67cWP>s=FFaYtWd$t4;o#AGd#+X>;6Y$I=rC z;Bfpv_di4}4R8hzQ=j$hPVU;G0K2Hn51^(upEP338vpbFUPZ1=W;6#Md!w%^JrW^% z9Tx1tpoy`$l!QzPc2|+ALRqri&{NgHJnAat$`>b2X)#E)6NR5AHyV0qD#%DCse*cSwZlC>2qr`cyo>h%^1e)IDt1&ubc zJbF6vX*F}Ag2$&vgGE63X_x}4a^H6a9+&}Qp}J!77a*m}%=*PapP6gvbpZurT*`l` zk)fC8;Li>5aWDoQSZDdOh| zl=uZem(>rg$J2&zpY#T;V3QIkJ<_&6!FP?eOL~N3xJc6efB8ti=tWFkhY>COPHG9p z_ugrrNQuDi(jSj?@ki?3IY7=Oc8M?P?yrfazj&6m`q-bga+EYc_D_bI1@7l$1IKGB z#U|OkoXxel-&6-sXD89PUv~YiQ_K$a_r|#(ga~z`JJ2!=4m5)tRvC^GF7YF)*=F$C z?h;!L#`hrDKTPpQB4a?g7xxQ60Svk3K$hz&;s}2@eN6;shpwC(jS>ssS^-z<<@ssi zM%DTGv5c9YuXn!<{dSlb`1;PjaA@Gf2NJbV!|2jgJx+)?I#HJ=B#ug+v|;bWvzq1KpH=1Ph+EjPahC)58dvs*V$?%mWE9lL zyn*MT)QzVO&f(;t{fKPok4*l1c-ZX{ygKp8{O3k(q~`|4F$&sMI3u2luLXu9HXxB) z2(tVq1Fq6}wia|w@+Vm!7t`d&wYDRMNd7`!{iP_cDGE6N@#n{#H_yhSvOmXnYG~`m zoSq9Vz9&~|i|Hx*l-oIbQ5|%9KraC^|HcWh2|E-re;ZqfT#*buzE@v|m6$NiX86fu zBz$F$pWkN^#ldTN6f~^pyj6&2qePomsUPzpbc#s&fTenH7yMb$+i94uujzK*t!kJD zkbP^R1?G10l!2%BS&u<57!RICIlGhC71jnlf~j=dyNe0y$p)H-vT5(Tzx_ z*K!t}Ao={${nh@Pfu6o623~4@M8#2V(Ay^MT2lt-CJTVE<1Aff zTMyge#ZMLoV*1$`)j}+Vy|?I$28s{Xj?kVjd44#QT1C&)hmT*$yhsZg1R^%mpE+A< zDA?E3zNTM6kI3qPYi+S1aKv@Fb9!&H*R*mNh_Hnp(fOY(3q;ltDO^UTbPy{6r*Xj) zwHHwK%0EPa&qoalf9Rg@{CQsU0`JO|El`~sFbUKr;R&J(P|F1pJ~|w(cJQ7)siwqA zNM3R!Af9dkRIMOMP?ABUA8B{bwfF@mf@45i7Un8pglNIncLO74U1`z)aYXra-QTrp zL9>VV5aE{$D$h7DEwoGyWVrac!(VO=O>4*B$)M6Na^LB+U!L@#D7DnXOX)a)!vC0k zMvcCo$y1Z8Is4aSXX{Qr*X@P7sSNM^chh6vMEz4(oC{6O`k5oE$f$Cz3bfm$0J&ZFP_yepL_snV`IZu_O_tegvCC<5m7?BF2}mRVjXz1X8K%Syc9a;T3)=W|CJZDb{9h%%@koYs(dMWbN!It^8t|?8w9N}IhPXRJ+o-|4FkILXaDr@47umjXc zU}VsqNMH5O_DrYBlh`O8+EEc(V&Ecw2CJt+04t6!tZD}nm8$|$j$+|{phKcm2?wCv zjL==0xU&?s)Cyw^Le{CVOHvGz+;OA_{`>`7nlFw>+4e7Jr(X91Hvun_gKwjpN;>l; zwnwSyWipFm|C2y0_10<<@MY}nwU>|a-#JADfw*F3TOGNk<<<$`WKny#HeV8bbxoGiRit9` zS+HyfMTzk6`)dyIr~%giAw_Mc+R`E&m5rL2br&3AXKAtBSU{;pf2TANGqryx0NzTV zC-92uum><8Ub0IHLSH!d*0eCcq?xc$sRsiR+Kd?nS>}IT!%ocMP_xno9wYv!c<0UV zx!~9I*PpcUp_pQsI`)7BzrVyYm+fIDMqiIGXhESeYiTF0uj{Lp%+Tz~fu}r?05-N3 zA|DUgtTjFtnJ7?h6Gtm#rX_;CET^uO;S-_&F_Dk=?}%kKH2TeT%`5=~zw!mSiR|; z0b|=e-6=uZjCeac{=ofH*eq{#YbLC_X*HGtLMuat6pFeIL8F(S^D3{`2zUL~kT<+u zZJC4)RB>aeC7gjo2ZL-kkh|*p8pQZm$`M_185_sek(;^Q_(~XS6Fj2wsi-5;fu8>T zv3Z(2MJ4SWflHz4Jsu~9+zE{`5w0Fi>RTUxGogzl4m3*&^(q6>dKm(^^9D}+Ut@L$ z&vQF?dTpNU5K0fw%1uBn=9#J;B&TMchbI3bnslE}h87Z8Mur6J*S`kH`B{1V$2K+} zxg)Nwdu<7L4)Dlp?%wb=Dt{Ev$fBatGSd-+%v|1k|1YoVDP#A~`7gl9w>xF9d?O^D zgq8Zm5g#5>S8z;C@nY9d5`D8U3$BLc$Ta0pJdInr*BT5+=$X%q^js(3p7JCkxj!#YClE0Z>3s z<7cU&tt4T@(lM7%wj&QnoLzb9zyJ30dx%`8NZZ}6h;3bCeG{`ILRjfWHl>vnOUU0} z9^+*r)3+bhg4l^PK57eP=|&SB+XQpZA`ey+q3kgX{(tX#iz80!nEWlmfBPQ<9i%C& z#OK|@|0=(7F={43u zXTDPv%mHl`B@C27J)3MF`wJ=FXed8QG#fxVOZ~Zah@s^$jX&y}Kv2yS75B)rKr2c5 zXNa|bq+$x$-vlaZPQj1UW9uXzjF*lxvts|X;_7W|+Z+Zwo;#s?#0k!V=*Z>lbLbRY zHWKKDF#!pU|6fy+-s_nT_(5Sp>*oP@(zbtfvT6oM;zIga%$&^mp+IS}CG39UN*37t zxMYv5*V^dh+;#_ac>G}jsNxg<0rpC_xA?XrOR+3_B;u>JX$qmemquiN6EhN{d!1lL;O_j5)jhG`r4iDrP^320sEKOO!n3bmrYO~IsBloJcs0TB@ZaGVhdgO0C z=7e@+R_SC`PS`YdsBo!ZX-fv3p0pJIfVECVkj(-+H#XWFBCzwm=vfzc8tZ~CM%>RI zmVeR9^girLOuQPEuI#TrNMn;$0HCZ{$qGmuog%ZyltZt23cQSGQVHWmZ^TZ&-2D|p zD$RVWn5G-m2s%igT3LCW$Vb5LWURnk%Kt&n3b|dq@{^NBoEqowsoS}~fvpxIZc6ZW z@~dr9`7Rc}hFUzHGvP05*aD{LP#sHk7R;>-rvgi~QJ~lN7f{}^vPSTnYSUghyx!Fc zC8HVhz`p60Yavt}R80xkWe<;A&K(rkfY-BQTzbWAW56n5e)jv&`#=C!!y6~MONYI+ zDwIu5t%pA+1#<1c=Z3@C>BS9&GK#!?c>j%OT1)!`yn!feoQUI|c18Ru?kGATmot(` z=2^;Xp8pLKV{o}`>)?Y7)p9=`usThm@i3xo;)SC%i2gIMKC$ggygVH!|AZ8HkWm$x9sOp0 z5~zz#aet`m7EIy~)qx^ao%%#I9|&DR&Hs9CFR=h3WW!&eCl;x2OEhZ#i-B4mlj5!q2JR7VyK`HO}O2vb^bv zs?S5Wgs3Wnc_O>}db(67oD+x)WS5&0(BXd2)x*(`>a++5v9NVRqV$gl$WDp24woTB z0*xeuc^oQrZ_+L<@2IrX0tqi$3e~!KGJl#dmG=IJmbqjf!Z1Y^J|Tc^O)(^vap5A1 z`W6mYvF2V>Jf`E`T}RtvO7b3rh28&Q-}QaB{7inS;vPi|X#L98HQ~(c8MnfPa{%_R zq4;$qoz+&2_BO@9BZF| z(Sv65O8Qk{EdX3CS%jT)nmsu4J~-sF@PI`1eAfVbx0GP;k13kUq$%$KC=)5dC*;t$ zD=BNxwiL{AkA>PHwau2xcZ^gayFy2nKU(Hk4PM(hletbsfeW5W(VUWv&x6WL72$h{ z)@dO6Hl?p%#vH?&M>g)AMc3r|;dZs~X~oLpzoD9S6tDAACRu}qmz-|(bo334gx?mf z*1RcwZM^kTHMm$N5YfSp`_@~dPnlW3HBfXBJq-jkug=|<_;CO&#ONs?SrZl|&J$im zJ2`OzFj!Ywsjqn~MHhS`y$s$QUK+vj2HhUpOTDjR)4mW=V_(R5^BceD3}6tFc=F_# zn;U@dfk7oCwN0}yLz|Q4+v^S0Xd-=+r%%)j_J(!ug}(!j{N-bo#H>G3#LBB414_Ka zQM#ms$@b#hvLAX|uYXtCEGW{u@+ZsyEW{wMnmGDLMDiO64DYf)As?}mo%f+@#KHf% zfOwL&>gXfYxw}W+Sh3Md853sSp#Z@15_Ykd@B9JyI>Q!*b%q=8xR0cgAEEcevh8w# zsE>{JHNo?*^c0uQy9AF1+^iiBvX#U8_gs~)Gq`%xVlX4|0_K+;qupOSdcrNOKVPez z^8}%zLBqyvHdSbTkp`oTVx19M{CwJ51~pzM9xp6lVIqD9!yFeV+ahHJ+#aV5A3HVz z!GiAmAHHEStr5p9(A<8$`O;_i`T_y#k{S^2{&-Ct2Tvcm5lUEA*OKerK$KrW4bHM z{nm)Fm0NG6H4do$*`H$GW$v!8DruS7+7@F7MC>UbETw*GfYMRnldJB4H6bn*6&J=I zDd2B9F3ggH_dXT1^$4SGaAQfwd5pzti4OO!+o6&47m+l##8Rv6FW)f02SQ%j_Vn&< zPLlhUmb#kiGaQ@73+<+3GsJ6+r3Vufk;8gFqnn2-uMz*RR~{e0eRlsQeL3&+OfT8g z2`yY|x`z9#NdV(u%PjCZR_1KGj|*ocqi=4N+xZe$8`R=khvMdYfd;zR)Ek zNz%EyPx(fwK&j!?$~}?mo4KwP-*>FnD9ol(%w4f383oj#mwk$NbE9!5&Fnkw1Pu{a z@#FIkTzNvC0C4fUgt7%t_qawjx2WmPQw*zB{G02R*+l})(!#^ z((=^2#&oIh(f(CL1o6iMT42@DR!+B}WpGz|@RINF%EI-9s&aJ74^l|Qq??ylY0PSy z&sOH#ROLpfJ+5!&Me$C=$kL2YE!HFh4*TZ;`8S`Iv)A`@2zEUhJ0M};z zT>P*Io#GFvk)tf%S;RV)ejn#PsNUYHaC#r{OaLXd?PRC%-r+hVV6dZyC*^xW&M2J% z{nd5sdiR4?^z3xvvx7-}D&H|$VEFKJOQP~0pdhJbbwIvk^G}i>&()Q^0{!L{Cp{Jd z{`S61Yl!;duqdFBrZjk0k2NCYPx;AZ zU1#Hgb0=b-tg;h_Yy(f}#ik5*(MR#xZ{-913j0*G>BCCH)7!uInk@`0Xg(-9A3P@j z_Uz2|#qt0o0Sn4x@Mz=Mk#J=;Dt}_W8M5ZkC>(WuvzW!n2umJ$QR((NWs+LJk3Gte z80NKQm>mXPQsuFeFB=e={WhlPItDKe!50ZCu?ZmSO>-qU$KNITAk@yQP~pxEXH?MG zcgaZCN27KXY@5dtTW>yLh{mJ&p(2+~h<{6^xDBiP)bQ`!5XFW|s?Hq^b0l`3+x$iD zppDg&2)TL*D1_kqfcl*TztOrZ(9q6wSLdG{{8V;Lw9=-eMX4}MA`mKAXxiI64i6a1 z&GLBZ@r|x>fzwx&j!zfl@VhuHY(0CT69!O~(dIEkOf&8ulua-L zAa*s$WDj1+$&JR~d*?`+p-a}E)}J^xlCw^{Tmm#W;^6~q17RDR@ic1LasW% zu>9j?!-sGi-)d^`JJG7HcQk%__ThKwV&r{lsIi<>)pFBfhOAMyQ(7IjaCRxnx;+#~ zrcHVl=4Lyen&wUXt?F$**oq^&AA3dyCvZ#%zM*n_-IWsThzI7yP@aO8iYGVB##Q^3 zVG31L(&15=X4Uh5?rj5Q4GM}3egI#8MSA*tt_Eg;{WP|^?zpy^rrRV6e^d%eb{Qo1 z7SDaN2P?80wLVXJbo)%i#3e^0hJ}OnT zgz0*A?<(iM=QLyP@fWM;SIuN$2gdz9xwz)=)FWNAdG3AjCJW2Sl<#k_@rt_C))G|d zuYPhao>MjN<`DYC0KWhre*?M+*Ijd_#)}}w`XA55puFMpEpt<1|0lEw8luwJaOv~M zy!{e;oNU{vz^cTeJueTL;5o(bwfXWx@1}1WyN@^ehWUbGzgR%5j}N3IhUAO}^F*sh z1%M78QaLl^-U!tw-s*kK@5+D(=*qFgKocGjdW2jvu(Qu)pq@H0tH9M(@P9;VJPYlx zpo53bpMDpTO8VnV_zs1|n%$xig&4)>ou2z2i?l{`(ZKyJ{x8YEi!k$)!K-8UB@wAU z>DL`!hr9L;MP0y^OJ#W5V9d#%Dg%pb&K2I~@ZH}Xz%`nAxrHnnuRc&n!XGr2b0hO> z4?7>==>&UC0o8Br#Otf`L|m3G+RhII12E`(b`<(s83i}LVL@T%m&v#S0lJPxFZ-u(>4TX&G97TI?IGqN1b;84LAP%IxX-h z3%v-}W3MHriU5Av*}q6o9TlR$8gD(~axc2mr0TOflCaAV>AOCXg+NqqhlkdY4Vt3a z0ZK4aXSMnQut7f}by0Z*^grzCh<&|F7&Ces76~-7 z?+kxGaXegdyd;xODmyB3$-toge-PNh-@nYJTd_mz^s9{DVgybhP#z+@9wf6d1^j4s z)=D>j`NIBUThP*gd|YUVfOUlB)A9SRoUXzrNO3)S6nDIEIY)AmhLp7 zdSkyT^52#vJA3V9CxBOdtZXu!_#a7U85ZU9cX8N-rIxOxQ$jie&+ zI+g~d8wGwUB`Siz(y1Xmlc1|KV2?xV5ClCTa z>SJuJAs*ljI5bhLBC2U7m7f`6k-gO%L2*=<-}PRZHXQO~=>E1~ts^~fhdG+l@P$c> z-l!{%CFYfpnJ5$HytufKoY&mYkJLQ>2D=C`j?W|m6wDWTgAGE71QdKo_*yuJ_RJFvLgl8b;p6MGBWG_X5kdc>R>AiBsqC$jD~6RDW02Wz1O>Meulirc$0~ zz+;ttgZO^U>(|Cd6%e`1v>j4|40f??{(kz&g2NX=7;IXSK)M$;MI|IuoJ4W_zF1}cwMGf981NXlM8*8Vy%+2be-%+doz)b0) zg6UnFp5@v02DC&&fYdX&T9aA7!;5$Z8otd?cO8cYX{^$IpQz{QPTOvmpE)30KPxCO ziobu2yf#+rF%aVk=OlmVTs{1GyJh$MiFG*TW897SS_*kO7m_p0x&j1WicTfT_g$wl zCUv`v*2p7HcqMTQDi|P5J)E6g98U0T(|nM$&(e^APwIDrqWY0Z?fpMjeZ@bS;xE?) zHR>H6Xrqnjjdu#gJ|PVA@{%4PQa*Ql-oZZPIh!Us3xYjwWc2v;CSKs)nkui{(_4c5ZPc5^lY`?x7!oK*G_C7-4m2n`OcSn4V2iGXtP?RRYO{`;)| zwx;!66<(zsuX)}1Eg`$L%DjDe*waH(=Q2k3$GiQHWc{iMzJKg_s!cGMQ4*YSN3srf zRfn!Y)6X9=Vvv!iSE*6i#j1hweoc)aBC@ITSN6ixo|VY2%9*Ce(CbfHH10j{ z;8pZZf#$rEYhV;67dkYfV%#lmkM(-!W1peWuZI)2=U}-7^O769=dG6d4B`GRCU=tm zcmu}=^B7R)GrNi)#^Hz;@#q1cLtD&}Q<);^Yx3Lu3u7}PR7Dw>rxpZ0Wy@%CF6h@{ zGk6t1EXo^++qBcyJ=4<6S{^{J|NA@3oXXmr4EI<=|EM`fV~c)@L!|-}XbUbDEZqi{ zX8d9uLQ^TpQzO<6n3@48&|t|n6$TeCc0*8on6qCzLI*Uzeehc<-uBxa#MTmL^>-@T zX2!2A5T;-(T`)I6VTie+TRB?)$yaAS$sB`u^)@uitO3=IVpRFx8IMsyO^*Q%lM-c? zI{A~YA=?kTq%b1ST2qBWGj~vr)B}xb)#9qH2q-xlhHh0=mQ0yk^TNt@h%vDHjI2Tt&Oim-4!+U;pq$9eRTstPuY z{V+f*OQ1H2iEeg5J5{nOfupL0J|I9=Uq#B{XnD@N3UE4DFvoalJP;eBFG!f&1#uD1 z3YpCP++FDkbINtWWKcOZwV+GNdYPn|Wi;-W&O0d~*R6yc&^EC{_LtbOciZ?p_eqN5 zkMi?f7HgKoIS(oGwn(k&l1jtxf^L6u^FWqt;OKR0w>e$BbxNYAuS8=tU-@D=MS+mY z8G}rFc_}vTOSQXZUhjEAqv;jhjG%6s{WQce1ED0cb|r}=lI$TR=#0>U9Zg%;2JY_H zcdm)TF1|{Vn`@!IXLkauxe${fDQ}%0DS7uN2;?Q_J&sXS;z>aCSZ>-+obBNm>6|rT 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%0AJnV1lG=qj&HVCombdgen4lFYw{4vVZZ;-K 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�}4)(kM%yr8ZrX^KB31u;~Fs@pB(oMQ~o{!%2 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

(&mut self, predicate: P) -> Option + where + P: FnMut(&Self::Item) -> bool, + { + self.inner.find(predicate) + } + + #[inline] + fn position

(&mut self, predicate: P) -> Option + where + P: FnMut(Self::Item) -> bool, + { + self.inner.position(predicate) + } + + $( + #[inline] + fn rposition

(&mut self, predicate: P) -> Option + where + P: FnMut(Self::Item) -> bool, + { + let _test: $double_ended = (); + self.inner.rposition(predicate) + } + )? + } + }; + + (DoubleEndedIterator for $ty:ident $(<$($lt:lifetime),+>)?) => { + impl$(<$($lt),+>)? DoubleEndedIterator for $ty$(<$($lt),+>)? { + #[inline] + fn next_back(&mut self) -> Option { + self.inner.next_back() + } + + #[inline] + fn nth_back(&mut self, n: usize) -> Option { + self.inner.nth_back(n) + } + + #[inline] + fn rfind

(&mut self, predicate: P) -> Option + where + P: FnMut(&Self::Item) -> bool, + { + self.inner.rfind(predicate) + } + } + }; + + (ExactSizeIterator for $ty:ident $(<$($lt:lifetime),+>)?) => { + impl$(<$($lt),+>)? ExactSizeIterator for $ty$(<$($lt),+>)? { + #[inline] + fn len(&self) -> usize { + self.inner.len() + } + } + }; + + (FusedIterator for $ty:ident $(<$($lt:lifetime),+>)?) => { + impl$(<$($lt),+>)? FusedIterator for $ty$(<$($lt),+>)? {} + }; + + (Iterator, DoubleEndedIterator, ExactSizeIterator, FusedIterator for $ty:ident $(<$($lt:lifetime),+>)? => $item:ty) => { + delegate!(Iterator for $ty$(<$($lt),+>)? => $item, DoubleEnded = ()); + delegate!(DoubleEndedIterator for $ty$(<$($lt),+>)?); + delegate!(ExactSizeIterator for $ty$(<$($lt),+>)?); + delegate!(FusedIterator for $ty$(<$($lt),+>)?); + }; +} + +#[must_use] +#[derive(Clone, Debug)] +pub struct Bytes<'a> { + pub(crate) inner: Copied>, +} +delegate!(Iterator, DoubleEndedIterator, ExactSizeIterator, FusedIterator for Bytes<'a> => u8); + +#[derive(Clone, Debug)] +#[must_use] +pub struct EscapeDebug<'a> { + #[allow(clippy::type_complexity)] + pub(crate) inner: Chain< + Flatten>, + FlatMap, CharEscapeIter, fn(JavaCodePoint) -> CharEscapeIter>, + >, +} +delegate!(Iterator for EscapeDebug<'a> => char); +delegate!(FusedIterator for EscapeDebug<'a>); +impl<'a> Display for EscapeDebug<'a> { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + self.clone().try_for_each(|c| f.write_char(c)) + } +} + +#[derive(Clone, Debug)] +#[must_use] +pub struct EscapeDefault<'a> { + pub(crate) inner: FlatMap, CharEscapeIter, fn(JavaCodePoint) -> CharEscapeIter>, +} +delegate!(Iterator for EscapeDefault<'a> => char); +delegate!(FusedIterator for EscapeDefault<'a>); +impl<'a> Display for EscapeDefault<'a> { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + self.clone().try_for_each(|c| f.write_char(c)) + } +} + +#[derive(Clone, Debug)] +#[must_use] +pub struct EscapeUnicode<'a> { + pub(crate) inner: FlatMap, CharEscapeIter, fn(JavaCodePoint) -> CharEscapeIter>, +} +delegate!(Iterator for EscapeUnicode<'a> => char); +delegate!(FusedIterator for EscapeUnicode<'a>); +impl<'a> Display for EscapeUnicode<'a> { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + self.clone().try_for_each(|c| f.write_char(c)) + } +} + +#[derive(Clone, Debug)] +#[must_use] +pub struct Lines<'a> { + pub(crate) inner: Map, fn(&JavaStr) -> &JavaStr>, +} +delegate!(Iterator for Lines<'a> => &'a JavaStr); +delegate!(DoubleEndedIterator for Lines<'a>); +delegate!(FusedIterator for Lines<'a>); + +#[derive(Clone)] +#[must_use] +pub struct Chars<'a> { + pub(crate) inner: slice::Iter<'a, u8>, +} + +impl<'a> Iterator for Chars<'a> { + type Item = JavaCodePoint; + + #[inline] + fn next(&mut self) -> Option { + // SAFETY: `JavaStr` invariant says `self.inner` is a semi-valid UTF-8 string + // and the resulting `ch` is a valid Unicode Scalar Value or surrogate + // code point. + unsafe { next_code_point(&mut self.inner).map(|ch| JavaCodePoint::from_u32_unchecked(ch)) } + } + + // TODO: std has an optimized count impl + + #[inline] + fn size_hint(&self) -> (usize, Option) { + let len = self.inner.len(); + // `(len + 3)` can't overflow, because we know that the `slice::Iter` + // belongs to a slice in memory which has a maximum length of + // `isize::MAX` (that's well below `usize::MAX`). + (len.div_ceil(4), Some(len)) + } + + #[inline] + fn last(mut self) -> Option { + // No need to go through the entire string. + self.next_back() + } +} + +impl Debug for Chars<'_> { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "Chars(")?; + f.debug_list().entries(self.clone()).finish()?; + write!(f, ")")?; + Ok(()) + } +} + +impl<'a> DoubleEndedIterator for Chars<'a> { + #[inline] + fn next_back(&mut self) -> Option { + // SAFETY: `JavaStr` invariant says `self.inner` is a semi-valid UTF-8 string + // and the resulting `ch` is a valid Unicode Scalar Value or surrogate + // code point. + unsafe { + next_code_point_reverse(&mut self.inner).map(|ch| JavaCodePoint::from_u32_unchecked(ch)) + } + } +} + +impl FusedIterator for Chars<'_> {} + +impl<'a> Chars<'a> { + #[inline] + #[must_use] + pub fn as_str(&self) -> &'a JavaStr { + // SAFETY: `Chars` is only made from a JavaStr, which guarantees the iter is + // semi-valid UTF-8. + unsafe { JavaStr::from_semi_utf8_unchecked(self.inner.as_slice()) } + } +} + +#[derive(Clone, Debug)] +#[must_use] +pub struct CharIndices<'a> { + pub(crate) front_offset: usize, + pub(crate) inner: Chars<'a>, +} + +impl<'a> Iterator for CharIndices<'a> { + type Item = (usize, JavaCodePoint); + + #[inline] + fn next(&mut self) -> Option<(usize, JavaCodePoint)> { + let pre_len = self.inner.inner.len(); + match self.inner.next() { + None => None, + Some(ch) => { + let index = self.front_offset; + let len = self.inner.inner.len(); + self.front_offset += pre_len - len; + Some((index, ch)) + } + } + } + + #[inline] + fn count(self) -> usize { + self.inner.count() + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + self.inner.size_hint() + } + + #[inline] + fn last(mut self) -> Option<(usize, JavaCodePoint)> { + // No need to go through the entire string. + self.next_back() + } +} + +impl<'a> DoubleEndedIterator for CharIndices<'a> { + #[inline] + fn next_back(&mut self) -> Option<(usize, JavaCodePoint)> { + self.inner.next_back().map(|ch| { + let index = self.front_offset + self.inner.inner.len(); + (index, ch) + }) + } +} + +impl FusedIterator for CharIndices<'_> {} + +impl<'a> CharIndices<'a> { + #[inline] + #[must_use] + pub fn as_str(&self) -> &'a JavaStr { + self.inner.as_str() + } +} + +#[must_use] +#[derive(Debug, Clone)] +pub struct Matches<'a, P> { + pub(crate) str: &'a JavaStr, + pub(crate) pat: P, +} + +impl<'a, P> Iterator for Matches<'a, P> +where + P: JavaStrPattern, +{ + type Item = &'a JavaStr; + + #[inline] + fn next(&mut self) -> Option { + if let Some((index, len)) = self.pat.find_in(self.str) { + // SAFETY: pattern returns valid indices + let ret = unsafe { self.str.get_unchecked(index..index + len) }; + self.str = unsafe { self.str.get_unchecked(index + len..) }; + Some(ret) + } else { + self.str = Default::default(); + None + } + } +} + +impl<'a, P> DoubleEndedIterator for Matches<'a, P> +where + P: JavaStrPattern, +{ + #[inline] + fn next_back(&mut self) -> Option { + if let Some((index, len)) = self.pat.rfind_in(self.str) { + // SAFETY: pattern returns valid indices + let ret = unsafe { self.str.get_unchecked(index..index + len) }; + self.str = unsafe { self.str.get_unchecked(..index) }; + Some(ret) + } else { + self.str = Default::default(); + None + } + } +} + +#[must_use] +#[derive(Clone, Debug)] +pub struct RMatches<'a, P> { + pub(crate) inner: Matches<'a, P>, +} + +impl<'a, P> Iterator for RMatches<'a, P> +where + P: JavaStrPattern, +{ + type Item = &'a JavaStr; + + #[inline] + fn next(&mut self) -> Option { + self.inner.next_back() + } +} + +impl<'a, P> DoubleEndedIterator for RMatches<'a, P> +where + P: JavaStrPattern, +{ + #[inline] + fn next_back(&mut self) -> Option { + self.inner.next() + } +} + +#[must_use] +#[derive(Clone, Debug)] +pub struct MatchIndices<'a, P> { + pub(crate) str: &'a JavaStr, + pub(crate) start: usize, + pub(crate) pat: P, +} + +impl<'a, P> Iterator for MatchIndices<'a, P> +where + P: JavaStrPattern, +{ + type Item = (usize, &'a JavaStr); + + #[inline] + fn next(&mut self) -> Option { + if let Some((index, len)) = self.pat.find_in(self.str) { + let full_index = self.start + index; + self.start = full_index + len; + // SAFETY: pattern returns valid indices + let ret = unsafe { self.str.get_unchecked(index..index + len) }; + self.str = unsafe { self.str.get_unchecked(index + len..) }; + Some((full_index, ret)) + } else { + self.start += self.str.len(); + self.str = Default::default(); + None + } + } +} + +impl<'a, P> DoubleEndedIterator for MatchIndices<'a, P> +where + P: JavaStrPattern, +{ + #[inline] + fn next_back(&mut self) -> Option { + if let Some((index, len)) = self.pat.rfind_in(self.str) { + // SAFETY: pattern returns valid indices + let ret = unsafe { self.str.get_unchecked(index..index + len) }; + self.str = unsafe { self.str.get_unchecked(..index) }; + Some((self.start + index, ret)) + } else { + self.str = Default::default(); + None + } + } +} + +#[derive(Clone, Debug)] +pub struct RMatchIndices<'a, P> { + pub(crate) inner: MatchIndices<'a, P>, +} + +impl<'a, P> Iterator for RMatchIndices<'a, P> +where + P: JavaStrPattern, +{ + type Item = (usize, &'a JavaStr); + + #[inline] + fn next(&mut self) -> Option { + self.inner.next_back() + } +} + +impl<'a, P> DoubleEndedIterator for RMatchIndices<'a, P> +where + P: JavaStrPattern, +{ + #[inline] + fn next_back(&mut self) -> Option { + self.inner.next() + } +} + +#[derive(Clone, Debug)] +struct SplitHelper<'a, P> { + start: usize, + end: usize, + haystack: &'a JavaStr, + pat: P, + allow_trailing_empty: bool, + finished: bool, + had_empty_match: bool, +} + +impl<'a, P> SplitHelper<'a, P> +where + P: JavaStrPattern, +{ + #[inline] + fn new(haystack: &'a JavaStr, pat: P, allow_trailing_empty: bool) -> Self { + Self { + start: 0, + end: haystack.len(), + haystack, + pat, + allow_trailing_empty, + finished: false, + had_empty_match: false, + } + } + + #[inline] + fn get_end(&mut self) -> Option<&'a JavaStr> { + if !self.finished { + self.finished = true; + + if self.allow_trailing_empty || self.end - self.start > 0 { + // SAFETY: `self.start` and `self.end` always lie on unicode boundaries. + let string = unsafe { self.haystack.get_unchecked(self.start..self.end) }; + return Some(string); + } + } + + None + } + + #[inline] + fn next_match(&mut self) -> Option<(usize, usize)> { + // SAFETY: `self.start` always lies on a unicode boundary. + let substr = unsafe { self.haystack.get_unchecked(self.start..) }; + + let result = if self.had_empty_match { + // if we had an empty match before, we are going to find the empty match again. + // don't do that, search from the next index along. + + if substr.is_empty() { + None + } else { + // SAFETY: we can pop the string because we already checked if the string is + // empty above + let first_char_len = unsafe { substr.chars().next().unwrap_unchecked().len_utf8() }; + let popped_str = unsafe { substr.get_unchecked(first_char_len..) }; + + self.pat + .find_in(popped_str) + .map(|(index, len)| (index + first_char_len + self.start, len)) + } + } else { + self.pat + .find_in(substr) + .map(|(index, len)| (index + self.start, len)) + }; + + self.had_empty_match = result.is_some_and(|(_, len)| len == 0); + + result + } + + #[inline] + fn next(&mut self) -> Option<&'a JavaStr> { + if self.finished { + return None; + } + + match self.next_match() { + Some((index, len)) => unsafe { + // SAFETY: pattern guarantees valid indices + let elt = self.haystack.get_unchecked(self.start..index); + self.start = index + len; + Some(elt) + }, + None => self.get_end(), + } + } + + #[inline] + fn next_inclusive(&mut self) -> Option<&'a JavaStr> { + if self.finished { + return None; + } + + match self.next_match() { + Some((index, len)) => unsafe { + // SAFETY: pattern guarantees valid indices + let elt = self.haystack.get_unchecked(self.start..index + len); + self.start = index + len; + Some(elt) + }, + None => self.get_end(), + } + } + + #[inline] + fn next_match_back(&mut self) -> Option<(usize, usize)> { + // SAFETY: `self.end` always lies on a unicode boundary. + let substr = unsafe { self.haystack.get_unchecked(..self.end) }; + + let result = if self.had_empty_match { + // if we had an empty match before, we are going to find the empty match again. + // don't do that, search from the next index along. + + if substr.is_empty() { + None + } else { + // SAFETY: we can pop the string because we already checked if the string is + // empty above + let last_char_len = + unsafe { substr.chars().next_back().unwrap_unchecked().len_utf8() }; + let popped_str = unsafe { substr.get_unchecked(..substr.len() - last_char_len) }; + + self.pat.rfind_in(popped_str) + } + } else { + self.pat.rfind_in(substr) + }; + + self.had_empty_match = result.is_some_and(|(_, len)| len == 0); + + result + } + + #[inline] + fn next_back(&mut self) -> Option<&'a JavaStr> { + if self.finished { + return None; + } + + if !self.allow_trailing_empty { + self.allow_trailing_empty = true; + match self.next_back() { + Some(elt) if !elt.is_empty() => return Some(elt), + _ => { + if self.finished { + return None; + } + } + } + } + + match self.next_match_back() { + Some((index, len)) => unsafe { + // SAFETY: pattern guarantees valid indices + let elt = self.haystack.get_unchecked(index + len..self.end); + self.end = index; + Some(elt) + }, + None => unsafe { + // SAFETY: `self.start` and `self.end` always lie on unicode boundaries. + self.finished = true; + Some(self.haystack.get_unchecked(self.start..self.end)) + }, + } + } + + #[inline] + fn next_back_inclusive(&mut self) -> Option<&'a JavaStr> { + if self.finished { + return None; + } + + if !self.allow_trailing_empty { + self.allow_trailing_empty = true; + match self.next_back_inclusive() { + Some(elt) if !elt.is_empty() => return Some(elt), + _ => { + if self.finished { + return None; + } + } + } + } + + match self.next_match_back() { + Some((index, len)) => unsafe { + // SAFETY: pattern guarantees valid indices + let elt = self.haystack.get_unchecked(index + len..self.end); + self.end = index + len; + Some(elt) + }, + None => unsafe { + // SAFETY: `self.start` and `self.end` always lie on unicode boundaries. + self.finished = true; + Some(self.haystack.get_unchecked(self.start..self.end)) + }, + } + } +} + +#[derive(Clone, Debug)] +pub struct Split<'a, P> { + inner: SplitHelper<'a, P>, +} + +impl<'a, P> Split<'a, P> +where + P: JavaStrPattern, +{ + #[inline] + pub(crate) fn new(haystack: &'a JavaStr, pat: P) -> Self { + Split { + inner: SplitHelper::new(haystack, pat, true), + } + } +} + +impl<'a, P> Iterator for Split<'a, P> +where + P: JavaStrPattern, +{ + type Item = &'a JavaStr; + + #[inline] + fn next(&mut self) -> Option { + self.inner.next() + } +} + +impl<'a, P> DoubleEndedIterator for Split<'a, P> +where + P: JavaStrPattern, +{ + #[inline] + fn next_back(&mut self) -> Option { + self.inner.next_back() + } +} + +impl<'a, P> FusedIterator for Split<'a, P> where P: JavaStrPattern {} + +#[derive(Clone, Debug)] +pub struct RSplit<'a, P> { + inner: SplitHelper<'a, P>, +} + +impl<'a, P> RSplit<'a, P> +where + P: JavaStrPattern, +{ + #[inline] + pub(crate) fn new(haystack: &'a JavaStr, pat: P) -> Self { + RSplit { + inner: SplitHelper::new(haystack, pat, true), + } + } +} + +impl<'a, P> Iterator for RSplit<'a, P> +where + P: JavaStrPattern, +{ + type Item = &'a JavaStr; + + #[inline] + fn next(&mut self) -> Option { + self.inner.next_back() + } +} + +impl<'a, P> DoubleEndedIterator for RSplit<'a, P> +where + P: JavaStrPattern, +{ + #[inline] + fn next_back(&mut self) -> Option { + self.inner.next() + } +} + +impl<'a, P> FusedIterator for RSplit<'a, P> where P: JavaStrPattern {} + +#[derive(Clone, Debug)] +pub struct SplitTerminator<'a, P> { + inner: SplitHelper<'a, P>, +} + +impl<'a, P> SplitTerminator<'a, P> +where + P: JavaStrPattern, +{ + #[inline] + pub(crate) fn new(haystack: &'a JavaStr, pat: P) -> Self { + SplitTerminator { + inner: SplitHelper::new(haystack, pat, false), + } + } +} + +impl<'a, P> Iterator for SplitTerminator<'a, P> +where + P: JavaStrPattern, +{ + type Item = &'a JavaStr; + + #[inline] + fn next(&mut self) -> Option { + self.inner.next() + } +} + +impl<'a, P> DoubleEndedIterator for SplitTerminator<'a, P> +where + P: JavaStrPattern, +{ + #[inline] + fn next_back(&mut self) -> Option { + self.inner.next_back() + } +} + +impl<'a, P> FusedIterator for SplitTerminator<'a, P> where P: JavaStrPattern {} + +#[derive(Clone, Debug)] +pub struct RSplitTerminator<'a, P> { + inner: SplitHelper<'a, P>, +} + +impl<'a, P> RSplitTerminator<'a, P> +where + P: JavaStrPattern, +{ + #[inline] + pub(crate) fn new(haystack: &'a JavaStr, pat: P) -> Self { + RSplitTerminator { + inner: SplitHelper::new(haystack, pat, false), + } + } +} + +impl<'a, P> Iterator for RSplitTerminator<'a, P> +where + P: JavaStrPattern, +{ + type Item = &'a JavaStr; + + #[inline] + fn next(&mut self) -> Option { + self.inner.next_back() + } +} + +impl<'a, P> DoubleEndedIterator for RSplitTerminator<'a, P> +where + P: JavaStrPattern, +{ + #[inline] + fn next_back(&mut self) -> Option { + self.inner.next() + } +} + +impl<'a, P> FusedIterator for RSplitTerminator<'a, P> where P: JavaStrPattern {} + +#[derive(Clone, Debug)] +pub struct SplitInclusive<'a, P> { + inner: SplitHelper<'a, P>, +} + +impl<'a, P> SplitInclusive<'a, P> +where + P: JavaStrPattern, +{ + #[inline] + pub(crate) fn new(haystack: &'a JavaStr, pat: P) -> Self { + SplitInclusive { + inner: SplitHelper::new(haystack, pat, false), + } + } +} + +impl<'a, P> Iterator for SplitInclusive<'a, P> +where + P: JavaStrPattern, +{ + type Item = &'a JavaStr; + + #[inline] + fn next(&mut self) -> Option { + self.inner.next_inclusive() + } +} + +impl<'a, P> DoubleEndedIterator for SplitInclusive<'a, P> +where + P: JavaStrPattern, +{ + #[inline] + fn next_back(&mut self) -> Option { + self.inner.next_back_inclusive() + } +} + +impl<'a, P> FusedIterator for SplitInclusive<'a, P> where P: JavaStrPattern {} + +#[derive(Clone, Debug)] +pub struct SplitN<'a, P> { + inner: SplitHelper<'a, P>, + count: usize, +} + +impl<'a, P> SplitN<'a, P> +where + P: JavaStrPattern, +{ + #[inline] + pub(crate) fn new(haystack: &'a JavaStr, pat: P, count: usize) -> Self { + SplitN { + inner: SplitHelper::new(haystack, pat, true), + count, + } + } +} + +impl<'a, P> Iterator for SplitN<'a, P> +where + P: JavaStrPattern, +{ + type Item = &'a JavaStr; + + #[inline] + fn next(&mut self) -> Option { + match self.count { + 0 => None, + 1 => { + self.count = 0; + self.inner.get_end() + } + _ => { + self.count -= 1; + self.inner.next() + } + } + } +} + +impl<'a, P> FusedIterator for SplitN<'a, P> where P: JavaStrPattern {} + +#[derive(Clone, Debug)] +pub struct RSplitN<'a, P> { + inner: SplitHelper<'a, P>, + count: usize, +} + +impl<'a, P> RSplitN<'a, P> +where + P: JavaStrPattern, +{ + #[inline] + pub(crate) fn new(haystack: &'a JavaStr, pat: P, count: usize) -> Self { + RSplitN { + inner: SplitHelper::new(haystack, pat, true), + count, + } + } +} + +impl<'a, P> Iterator for RSplitN<'a, P> +where + P: JavaStrPattern, +{ + type Item = &'a JavaStr; + + #[inline] + fn next(&mut self) -> Option { + match self.count { + 0 => None, + 1 => { + self.count = 0; + self.inner.get_end() + } + _ => { + self.count -= 1; + self.inner.next_back() + } + } + } +} + +impl<'a, P> FusedIterator for RSplitN<'a, P> where P: JavaStrPattern {} + +#[derive(Clone, Debug)] +pub struct SplitAsciiWhitespace<'a> { + #[allow(clippy::type_complexity)] + pub(crate) inner: Map< + Filter bool>, fn(&&[u8]) -> bool>, + fn(&[u8]) -> &JavaStr, + >, +} +delegate!(Iterator for SplitAsciiWhitespace<'a> => &'a JavaStr); +delegate!(DoubleEndedIterator for SplitAsciiWhitespace<'a>); +delegate!(FusedIterator for SplitAsciiWhitespace<'a>); + +#[derive(Clone, Debug)] +pub struct SplitWhitespace<'a> { + #[allow(clippy::type_complexity)] + pub(crate) inner: Filter bool>, fn(&&JavaStr) -> bool>, +} +delegate!(Iterator for SplitWhitespace<'a> => &'a JavaStr); +delegate!(DoubleEndedIterator for SplitWhitespace<'a>); +delegate!(FusedIterator for SplitWhitespace<'a>); diff --git a/vendor/valence/crates/java_string/src/lib.rs b/vendor/valence/crates/java_string/src/lib.rs new file mode 100644 index 00000000..18e658af --- /dev/null +++ b/vendor/valence/crates/java_string/src/lib.rs @@ -0,0 +1,26 @@ +#![doc = include_str!("../README.md")] + +mod cesu8; +mod char; +mod error; +mod iter; +mod owned; +mod pattern; +#[cfg(feature = "serde")] +mod serde; +mod slice; +pub(crate) mod validations; + +pub use char::*; +pub use error::*; +pub use iter::*; +pub use owned::*; +pub use pattern::*; +pub use slice::*; + +#[macro_export] +macro_rules! format_java { + ($($arg:tt)*) => { + $crate::JavaString::from(::std::format!($($arg)*)) + } +} diff --git a/vendor/valence/crates/java_string/src/owned.rs b/vendor/valence/crates/java_string/src/owned.rs new file mode 100644 index 00000000..3cda2b23 --- /dev/null +++ b/vendor/valence/crates/java_string/src/owned.rs @@ -0,0 +1,1401 @@ +use std::borrow::{Borrow, BorrowMut, Cow}; +use std::collections::{Bound, TryReserveError}; +use std::convert::Infallible; +use std::fmt::{Debug, Display, Formatter, Write}; +use std::hash::{Hash, Hasher}; +use std::iter::FusedIterator; +use std::ops::{ + Add, AddAssign, Deref, DerefMut, Index, IndexMut, Range, RangeBounds, RangeFrom, RangeFull, + RangeInclusive, RangeTo, RangeToInclusive, +}; +use std::rc::Rc; +use std::str::FromStr; +use std::sync::Arc; +use std::{ptr, slice}; + +use crate::validations::{ + run_utf8_full_validation_from_semi, run_utf8_semi_validation, to_range_checked, +}; +use crate::{Chars, FromUtf8Error, JavaCodePoint, JavaStr, Utf8Error}; + +#[derive(Default, PartialEq, PartialOrd, Eq, Ord)] +pub struct JavaString { + vec: Vec, +} + +impl JavaString { + #[inline] + #[must_use] + pub const fn new() -> JavaString { + JavaString { vec: Vec::new() } + } + + #[inline] + #[must_use] + pub fn with_capacity(capacity: usize) -> JavaString { + JavaString { + vec: Vec::with_capacity(capacity), + } + } + + /// Converts `vec` to a `JavaString` if it is fully-valid UTF-8, i.e. UTF-8 + /// without surrogate code points. See [`String::from_utf8`]. + #[inline] + pub fn from_full_utf8(vec: Vec) -> Result { + match std::str::from_utf8(&vec) { + Ok(..) => Ok(JavaString { vec }), + Err(e) => Err(FromUtf8Error { + bytes: vec, + error: e.into(), + }), + } + } + + /// Converts `vec` to a `JavaString` if it is semi-valid UTF-8, i.e. UTF-8 + /// with surrogate code points. + /// + /// ``` + /// # use java_string::{JavaCodePoint, JavaString}; + /// + /// assert_eq!( + /// JavaString::from_semi_utf8(b"Hello World!".to_vec()).unwrap(), + /// "Hello World!" + /// ); + /// assert_eq!( + /// JavaString::from_semi_utf8(vec![0xf0, 0x9f, 0x92, 0x96]).unwrap(), + /// "šŸ’–" + /// ); + /// assert_eq!( + /// JavaString::from_semi_utf8(vec![0xed, 0xa0, 0x80]).unwrap(), + /// JavaString::from(JavaCodePoint::from_u32(0xd800).unwrap()) + /// ); + /// assert!(JavaString::from_semi_utf8(vec![0xed]).is_err()); + /// ``` + pub fn from_semi_utf8(vec: Vec) -> Result { + match run_utf8_semi_validation(&vec) { + Ok(..) => Ok(JavaString { vec }), + Err(err) => Err(FromUtf8Error { + bytes: vec, + error: err, + }), + } + } + + /// Converts `v` to a `Cow`, replacing invalid semi-UTF-8 with the + /// replacement character ļæ½. + /// + /// ``` + /// # use std::borrow::Cow; + /// # use java_string::{JavaStr, JavaString}; + /// + /// let sparkle_heart = [0xf0, 0x9f, 0x92, 0x96]; + /// let result = JavaString::from_semi_utf8_lossy(&sparkle_heart); + /// assert!(matches!(result, Cow::Borrowed(_))); + /// assert_eq!(result, JavaStr::from_str("šŸ’–")); + /// + /// let foobar_with_error = [b'f', b'o', b'o', 0xed, b'b', b'a', b'r']; + /// let result = JavaString::from_semi_utf8_lossy(&foobar_with_error); + /// assert!(matches!(result, Cow::Owned(_))); + /// assert_eq!(result, JavaStr::from_str("fooļæ½bar")); + /// ``` + #[must_use] + pub fn from_semi_utf8_lossy(v: &[u8]) -> Cow<'_, JavaStr> { + const REPLACEMENT: &str = "\u{FFFD}"; + + match run_utf8_semi_validation(v) { + Ok(()) => unsafe { + // SAFETY: validation succeeded + Cow::Borrowed(JavaStr::from_semi_utf8_unchecked(v)) + }, + Err(error) => { + let mut result = unsafe { + // SAFETY: validation succeeded up to this index + JavaString::from_semi_utf8_unchecked( + v.get_unchecked(..error.valid_up_to).to_vec(), + ) + }; + result.push_str(REPLACEMENT); + let mut index = error.valid_up_to + error.error_len.unwrap_or(1) as usize; + loop { + match run_utf8_semi_validation(&v[index..]) { + Ok(()) => { + unsafe { + // SAFETY: validation succeeded + result + .push_java_str(JavaStr::from_semi_utf8_unchecked(&v[index..])); + } + return Cow::Owned(result); + } + Err(error) => { + unsafe { + // SAFETY: validation succeeded up to this index + result.push_java_str(JavaStr::from_semi_utf8_unchecked( + v.get_unchecked(index..index + error.valid_up_to), + )); + } + result.push_str(REPLACEMENT); + index += error.valid_up_to + error.error_len.unwrap_or(1) as usize; + } + } + } + } + } + } + + /// # Safety + /// + /// The parameter must be in semi-valid UTF-8 format, that is, UTF-8 plus + /// surrogate code points. + #[inline] + #[must_use] + pub unsafe fn from_semi_utf8_unchecked(bytes: Vec) -> JavaString { + JavaString { vec: bytes } + } + + /// See [`String::into_bytes`]. + #[inline] + #[must_use] + pub fn into_bytes(self) -> Vec { + self.vec + } + + /// See [`String::as_str`]. + #[inline] + #[must_use] + pub fn as_java_str(&self) -> &JavaStr { + unsafe { + // SAFETY: this str has semi-valid UTF-8 + JavaStr::from_semi_utf8_unchecked(&self.vec) + } + } + + /// See [`String::as_mut_str`]. + #[inline] + #[must_use] + pub fn as_mut_java_str(&mut self) -> &mut JavaStr { + unsafe { + // SAFETY: this str has semi-valid UTF-8 + JavaStr::from_semi_utf8_unchecked_mut(&mut self.vec) + } + } + + /// Tries to convert this `JavaString` to a `String`, returning an error if + /// it is not fully valid UTF-8, i.e. has no surrogate code points. + /// + /// ``` + /// # use java_string::{JavaCodePoint, JavaString}; + /// + /// assert_eq!( + /// JavaString::from("Hello World!").into_string().unwrap(), + /// "Hello World!" + /// ); + /// assert_eq!( + /// JavaString::from("abc\0ā„šŸ’£").into_string().unwrap(), + /// "abc\0ā„šŸ’£" + /// ); + /// + /// let string_with_error = JavaString::from("abc") + /// + JavaString::from(JavaCodePoint::from_u32(0xd800).unwrap()).as_java_str(); + /// assert!(string_with_error.into_string().is_err()); + /// ``` + pub fn into_string(self) -> Result { + run_utf8_full_validation_from_semi(self.as_bytes()).map(|_| unsafe { + // SAFETY: validation succeeded + self.into_string_unchecked() + }) + } + + /// # Safety + /// + /// This string must be fully valid UTF-8, i.e. have no surrogate code + /// points. + #[inline] + #[must_use] + pub unsafe fn into_string_unchecked(self) -> String { + // SAFETY: preconditions checked by caller + unsafe { String::from_utf8_unchecked(self.vec) } + } + + /// See [`String::push_str`]. + #[inline] + pub fn push_java_str(&mut self, string: &JavaStr) { + self.vec.extend_from_slice(string.as_bytes()) + } + + /// See [`String::push_str`]. + #[inline] + pub fn push_str(&mut self, string: &str) { + self.vec.extend_from_slice(string.as_bytes()) + } + + /// See [`String::capacity`]. + #[inline] + #[must_use] + pub fn capacity(&self) -> usize { + self.vec.capacity() + } + + /// See [`String::reserve`]. + #[inline] + pub fn reserve(&mut self, additional: usize) { + self.vec.reserve(additional) + } + + /// See [`String::reserve_exact`]. + #[inline] + pub fn reserve_exact(&mut self, additional: usize) { + self.vec.reserve_exact(additional) + } + + /// See [`String::try_reserve`]. + #[inline] + pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> { + self.vec.try_reserve(additional) + } + + /// See [`String::try_reserve_exact`]. + #[inline] + pub fn try_reserve_exact(&mut self, additional: usize) -> Result<(), TryReserveError> { + self.vec.try_reserve_exact(additional) + } + + /// See [`String::shrink_to_fit`]. + #[inline] + pub fn shrink_to_fit(&mut self) { + self.vec.shrink_to_fit() + } + + /// See [`String::shrink_to`]. + #[inline] + pub fn shrink_to(&mut self, min_capacity: usize) { + self.vec.shrink_to(min_capacity) + } + + /// See [`String::push`]. + #[inline] + pub fn push(&mut self, ch: char) { + match ch.len_utf8() { + 1 => self.vec.push(ch as u8), + _ => self + .vec + .extend_from_slice(ch.encode_utf8(&mut [0; 4]).as_bytes()), + } + } + + /// See [`String::push`]. + #[inline] + pub fn push_java(&mut self, ch: JavaCodePoint) { + match ch.len_utf8() { + 1 => self.vec.push(ch.as_u32() as u8), + _ => self.vec.extend_from_slice(ch.encode_semi_utf8(&mut [0; 4])), + } + } + + /// See [`String::as_bytes`]. + #[inline] + #[must_use] + pub fn as_bytes(&self) -> &[u8] { + &self.vec + } + + /// See [`String::truncate`]. + #[inline] + pub fn truncate(&mut self, new_len: usize) { + if new_len <= self.len() { + assert!(self.is_char_boundary(new_len)); + self.vec.truncate(new_len) + } + } + + /// See [`String::pop`]. + /// + /// ``` + /// # use java_string::JavaString; + /// + /// let mut str = JavaString::from("Hello World!"); + /// assert_eq!(str.pop().unwrap(), '!'); + /// assert_eq!(str, "Hello World"); + /// + /// let mut str = JavaString::from("ę±äŗ¬"); + /// assert_eq!(str.pop().unwrap(), 'äŗ¬'); + /// assert_eq!(str, "ę±"); + /// + /// assert!(JavaString::new().pop().is_none()); + /// ``` + #[inline] + pub fn pop(&mut self) -> Option { + let ch = self.chars().next_back()?; + let newlen = self.len() - ch.len_utf8(); + unsafe { + self.vec.set_len(newlen); + } + Some(ch) + } + + /// See [`String::remove`]. + /// + /// ``` + /// # use java_string::JavaString; + /// + /// let mut str = JavaString::from("Hello World!"); + /// assert_eq!(str.remove(5), ' '); + /// assert_eq!(str, "HelloWorld!"); + /// + /// let mut str = JavaString::from("Hello šŸ¦€ World!"); + /// assert_eq!(str.remove(6), 'šŸ¦€'); + /// assert_eq!(str, "Hello World!"); + /// ``` + /// ```should_panic + /// # use java_string::JavaString; + /// // Should panic + /// JavaString::new().remove(0); + /// ``` + /// ```should_panic + /// # use java_string::JavaString; + /// // Should panic + /// JavaString::from("šŸ¦€").remove(1); + /// ``` + #[inline] + pub fn remove(&mut self, idx: usize) -> JavaCodePoint { + let ch = match self[idx..].chars().next() { + Some(ch) => ch, + None => panic!("cannot remove a char from the end of a string"), + }; + + let next = idx + ch.len_utf8(); + let len = self.len(); + unsafe { + ptr::copy( + self.vec.as_ptr().add(next), + self.vec.as_mut_ptr().add(idx), + len - next, + ); + self.vec.set_len(len - (next - idx)); + } + ch + } + + /// See [`String::retain`]. + /// + /// ``` + /// # use java_string::{JavaCodePoint, JavaString}; + /// + /// let mut str = JavaString::from("Hello šŸ¦€ World!"); + /// str.retain(|ch| !ch.is_ascii_uppercase()); + /// assert_eq!(str, "ello šŸ¦€ orld!"); + /// str.retain(JavaCodePoint::is_ascii); + /// assert_eq!(str, "ello orld!"); + /// ``` + #[inline] + pub fn retain(&mut self, mut f: F) + where + F: FnMut(JavaCodePoint) -> bool, + { + struct SetLenOnDrop<'a> { + s: &'a mut JavaString, + idx: usize, + del_bytes: usize, + } + + impl<'a> Drop for SetLenOnDrop<'a> { + #[inline] + fn drop(&mut self) { + let new_len = self.idx - self.del_bytes; + debug_assert!(new_len <= self.s.len()); + unsafe { self.s.vec.set_len(new_len) }; + } + } + + let len = self.len(); + let mut guard = SetLenOnDrop { + s: self, + idx: 0, + del_bytes: 0, + }; + + while guard.idx < len { + // SAFETY: `guard.idx` is positive-or-zero and less that len so the + // `get_unchecked` is in bound. `self` is valid UTF-8 like string + // and the returned slice starts at a unicode code point so the + // `Chars` always return one character. + let ch = unsafe { + guard + .s + .get_unchecked(guard.idx..len) + .chars() + .next() + .unwrap_unchecked() + }; + let ch_len = ch.len_utf8(); + + if !f(ch) { + guard.del_bytes += ch_len; + } else if guard.del_bytes > 0 { + // SAFETY: `guard.idx` is in bound and `guard.del_bytes` represent the number of + // bytes that are erased from the string so the resulting `guard.idx - + // guard.del_bytes` always represent a valid unicode code point. + // + // `guard.del_bytes` >= `ch.len_utf8()`, so taking a slice with `ch.len_utf8()` + // len is safe. + ch.encode_semi_utf8(unsafe { + slice::from_raw_parts_mut( + guard.s.as_mut_ptr().add(guard.idx - guard.del_bytes), + ch.len_utf8(), + ) + }); + } + + // Point idx to the next char + guard.idx += ch_len; + } + + drop(guard); + } + + /// See [`String::insert`]. + /// + /// ``` + /// # use java_string::JavaString; + /// let mut s = JavaString::from("foo"); + /// s.insert(3, 'a'); + /// s.insert(4, 'r'); + /// s.insert(3, 'b'); + /// assert_eq!(s, "foobar"); + /// ``` + #[inline] + pub fn insert(&mut self, idx: usize, ch: char) { + assert!(self.is_char_boundary(idx)); + let mut bits = [0; 4]; + let bits = ch.encode_utf8(&mut bits).as_bytes(); + + unsafe { + self.insert_bytes(idx, bits); + } + } + + /// See [`String::insert`]. + #[inline] + pub fn insert_java(&mut self, idx: usize, ch: JavaCodePoint) { + assert!(self.is_char_boundary(idx)); + let mut bits = [0; 4]; + let bits = ch.encode_semi_utf8(&mut bits); + + unsafe { + self.insert_bytes(idx, bits); + } + } + + #[inline] + unsafe fn insert_bytes(&mut self, idx: usize, bytes: &[u8]) { + let len = self.len(); + let amt = bytes.len(); + self.vec.reserve(amt); + + unsafe { + ptr::copy( + self.vec.as_ptr().add(idx), + self.vec.as_mut_ptr().add(idx + amt), + len - idx, + ); + ptr::copy_nonoverlapping(bytes.as_ptr(), self.vec.as_mut_ptr().add(idx), amt); + self.vec.set_len(len + amt); + } + } + + /// See [`String::insert_str`]. + /// + /// ``` + /// # use java_string::JavaString; + /// let mut s = JavaString::from("bar"); + /// s.insert_str(0, "foo"); + /// assert_eq!(s, "foobar"); + /// ``` + #[inline] + pub fn insert_str(&mut self, idx: usize, string: &str) { + assert!(self.is_char_boundary(idx)); + + unsafe { + self.insert_bytes(idx, string.as_bytes()); + } + } + + /// See [`String::insert_str`]. + pub fn insert_java_str(&mut self, idx: usize, string: &JavaStr) { + assert!(self.is_char_boundary(idx)); + + unsafe { + self.insert_bytes(idx, string.as_bytes()); + } + } + + /// See [`String::as_mut_vec`]. + /// + /// # Safety + /// + /// The returned `Vec` must not have invalid UTF-8 written to it, besides + /// surrogate pairs. + #[inline] + pub unsafe fn as_mut_vec(&mut self) -> &mut Vec { + &mut self.vec + } + + /// See [`String::len`]. + #[inline] + #[must_use] + pub fn len(&self) -> usize { + self.vec.len() + } + + /// See [`String::is_empty`]. + #[inline] + #[must_use] + pub fn is_empty(&self) -> bool { + self.len() == 0 + } + + /// See [`String::split_off`]. + /// + /// ``` + /// # use java_string::JavaString; + /// let mut hello = JavaString::from("Hello World!"); + /// let world = hello.split_off(6); + /// assert_eq!(hello, "Hello "); + /// assert_eq!(world, "World!"); + /// ``` + /// ```should_panic + /// # use java_string::JavaString; + /// let mut s = JavaString::from("šŸ¦€"); + /// // Should panic + /// let _ = s.split_off(1); + /// ``` + #[inline] + #[must_use] + pub fn split_off(&mut self, at: usize) -> JavaString { + assert!(self.is_char_boundary(at)); + let other = self.vec.split_off(at); + unsafe { JavaString::from_semi_utf8_unchecked(other) } + } + + /// See [`String::clear`]. + #[inline] + pub fn clear(&mut self) { + self.vec.clear(); + } + + /// See [`String::drain`]. + /// + /// ``` + /// # use java_string::JavaString; + /// + /// let mut s = JavaString::from("α is alpha, β is beta"); + /// let beta_offset = s.find('β').unwrap_or(s.len()); + /// + /// // Remove the range up until the β from the string + /// let t: JavaString = s.drain(..beta_offset).collect(); + /// assert_eq!(t, "α is alpha, "); + /// assert_eq!(s, "β is beta"); + /// + /// // A full range clears the string, like `clear()` does + /// s.drain(..); + /// assert_eq!(s, ""); + /// ``` + #[inline] + pub fn drain(&mut self, range: R) -> Drain<'_> + where + R: RangeBounds, + { + // Memory safety: see String::drain + let Range { start, end } = to_range_checked(range, ..self.len()); + assert!(self.is_char_boundary(start)); + assert!(self.is_char_boundary(end)); + + // Take out two simultaneous borrows. The &mut String won't be accessed + // until iteration is over, in Drop. + let self_ptr = self as *mut _; + // SAFETY: `to_range_checked` and `is_char_boundary` do the appropriate bounds + // checks. + let chars_iter = unsafe { self.get_unchecked(start..end) }.chars(); + + Drain { + start, + end, + iter: chars_iter, + string: self_ptr, + } + } + + /// See [`String::replace_range`]. + /// + /// ``` + /// # use java_string::JavaString; + /// + /// let mut s = JavaString::from("α is alpha, β is beta"); + /// let beta_offset = s.find('β').unwrap_or(s.len()); + /// + /// // Replace the range up until the β from the string + /// s.replace_range(..beta_offset, "Ī‘ is capital alpha; "); + /// assert_eq!(s, "Ī‘ is capital alpha; β is beta"); + /// ``` + /// ```should_panic + /// # use java_string::JavaString; + /// let mut s = JavaString::from("α is alpha, β is beta"); + /// // Should panic + /// s.replace_range(..1, "Ī‘ is capital alpha; "); + /// ``` + pub fn replace_range(&mut self, range: R, replace_with: &str) + where + R: RangeBounds, + { + self.replace_range_java(range, JavaStr::from_str(replace_with)) + } + + /// See [`String::replace_range`]. + pub fn replace_range_java(&mut self, range: R, replace_with: &JavaStr) + where + R: RangeBounds, + { + let start = range.start_bound(); + match start { + Bound::Included(&n) => assert!(self.is_char_boundary(n)), + Bound::Excluded(&n) => assert!(self.is_char_boundary(n + 1)), + Bound::Unbounded => {} + }; + let end = range.end_bound(); + match end { + Bound::Included(&n) => assert!(self.is_char_boundary(n + 1)), + Bound::Excluded(&n) => assert!(self.is_char_boundary(n)), + Bound::Unbounded => {} + }; + + unsafe { self.as_mut_vec() }.splice((start, end), replace_with.bytes()); + } + + /// See [`String::into_boxed_str`]. + #[inline] + #[must_use] + pub fn into_boxed_str(self) -> Box { + let slice = self.vec.into_boxed_slice(); + unsafe { JavaStr::from_boxed_semi_utf8_unchecked(slice) } + } + + /// See [`String::leak`]. + #[inline] + pub fn leak<'a>(self) -> &'a mut JavaStr { + let slice = self.vec.leak(); + unsafe { JavaStr::from_semi_utf8_unchecked_mut(slice) } + } +} + +impl Add<&str> for JavaString { + type Output = JavaString; + + #[inline] + fn add(mut self, rhs: &str) -> Self::Output { + self.push_str(rhs); + self + } +} + +impl Add<&JavaStr> for JavaString { + type Output = JavaString; + + #[inline] + fn add(mut self, rhs: &JavaStr) -> Self::Output { + self.push_java_str(rhs); + self + } +} + +impl AddAssign<&str> for JavaString { + #[inline] + fn add_assign(&mut self, rhs: &str) { + self.push_str(rhs); + } +} + +impl AddAssign<&JavaStr> for JavaString { + #[inline] + fn add_assign(&mut self, rhs: &JavaStr) { + self.push_java_str(rhs); + } +} + +impl AsMut for JavaString { + #[inline] + fn as_mut(&mut self) -> &mut JavaStr { + self.as_mut_java_str() + } +} + +impl AsRef<[u8]> for JavaString { + #[inline] + fn as_ref(&self) -> &[u8] { + self.as_bytes() + } +} + +impl AsRef for JavaString { + #[inline] + fn as_ref(&self) -> &JavaStr { + self.as_java_str() + } +} + +impl Borrow for JavaString { + #[inline] + fn borrow(&self) -> &JavaStr { + self.as_java_str() + } +} + +impl BorrowMut for JavaString { + #[inline] + fn borrow_mut(&mut self) -> &mut JavaStr { + self.as_mut_java_str() + } +} + +impl Clone for JavaString { + #[inline] + fn clone(&self) -> Self { + JavaString { + vec: self.vec.clone(), + } + } + + #[inline] + fn clone_from(&mut self, source: &Self) { + self.vec.clone_from(&source.vec) + } +} + +impl Debug for JavaString { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + Debug::fmt(&**self, f) + } +} + +impl Deref for JavaString { + type Target = JavaStr; + + #[inline] + fn deref(&self) -> &Self::Target { + self.as_java_str() + } +} + +impl DerefMut for JavaString { + #[inline] + fn deref_mut(&mut self) -> &mut Self::Target { + self.as_mut_java_str() + } +} + +impl Display for JavaString { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + Display::fmt(&**self, f) + } +} + +impl Extend for JavaString { + fn extend>(&mut self, iter: T) { + let iterator = iter.into_iter(); + let (lower_bound, _) = iterator.size_hint(); + self.reserve(lower_bound); + iterator.for_each(move |c| self.push(c)); + } +} + +impl Extend for JavaString { + fn extend>(&mut self, iter: T) { + let iterator = iter.into_iter(); + let (lower_bound, _) = iterator.size_hint(); + self.reserve(lower_bound); + iterator.for_each(move |c| self.push_java(c)); + } +} + +impl Extend for JavaString { + fn extend>(&mut self, iter: T) { + iter.into_iter().for_each(move |s| self.push_str(&s)); + } +} + +impl Extend for JavaString { + fn extend>(&mut self, iter: T) { + iter.into_iter().for_each(move |s| self.push_java_str(&s)); + } +} + +impl<'a> Extend<&'a char> for JavaString { + fn extend>(&mut self, iter: T) { + self.extend(iter.into_iter().cloned()) + } +} + +impl<'a> Extend<&'a JavaCodePoint> for JavaString { + fn extend>(&mut self, iter: T) { + self.extend(iter.into_iter().cloned()) + } +} + +impl<'a> Extend<&'a str> for JavaString { + fn extend>(&mut self, iter: T) { + iter.into_iter().for_each(move |s| self.push_str(s)); + } +} + +impl<'a> Extend<&'a JavaStr> for JavaString { + fn extend>(&mut self, iter: T) { + iter.into_iter().for_each(move |s| self.push_java_str(s)); + } +} + +impl Extend> for JavaString { + fn extend>>(&mut self, iter: T) { + iter.into_iter().for_each(move |s| self.push_str(&s)); + } +} + +impl Extend> for JavaString { + fn extend>>(&mut self, iter: T) { + iter.into_iter().for_each(move |s| self.push_java_str(&s)); + } +} + +impl<'a> Extend> for JavaString { + fn extend>>(&mut self, iter: T) { + iter.into_iter().for_each(move |s| self.push_str(&s)); + } +} + +impl<'a> Extend> for JavaString { + fn extend>>(&mut self, iter: T) { + iter.into_iter().for_each(move |s| self.push_java_str(&s)); + } +} + +impl From for JavaString { + #[inline] + fn from(value: String) -> Self { + unsafe { + // SAFETY: value is valid UTF-8 + JavaString::from_semi_utf8_unchecked(value.into_bytes()) + } + } +} + +impl From<&String> for JavaString { + #[inline] + fn from(value: &String) -> Self { + Self::from(value.clone()) + } +} + +impl From<&JavaString> for JavaString { + #[inline] + fn from(value: &JavaString) -> Self { + value.clone() + } +} + +impl From<&mut str> for JavaString { + #[inline] + fn from(value: &mut str) -> Self { + Self::from(&*value) + } +} + +impl From<&str> for JavaString { + #[inline] + fn from(value: &str) -> Self { + Self::from(value.to_owned()) + } +} + +impl From<&mut JavaStr> for JavaString { + #[inline] + fn from(value: &mut JavaStr) -> Self { + Self::from(&*value) + } +} + +impl From<&JavaStr> for JavaString { + #[inline] + fn from(value: &JavaStr) -> Self { + value.to_owned() + } +} + +impl From> for JavaString { + #[inline] + fn from(value: Box) -> Self { + Self::from(value.into_string()) + } +} + +impl From> for JavaString { + #[inline] + fn from(value: Box) -> Self { + value.into_string() + } +} + +impl<'a> From> for JavaString { + #[inline] + fn from(value: Cow<'a, str>) -> Self { + Self::from(value.into_owned()) + } +} + +impl<'a> From> for JavaString { + #[inline] + fn from(value: Cow<'a, JavaStr>) -> Self { + value.into_owned() + } +} + +impl From for Arc { + #[inline] + fn from(value: JavaString) -> Self { + Arc::from(&value[..]) + } +} + +impl<'a> From for Cow<'a, JavaStr> { + #[inline] + fn from(value: JavaString) -> Self { + Cow::Owned(value) + } +} + +impl From for Rc { + #[inline] + fn from(value: JavaString) -> Self { + Rc::from(&value[..]) + } +} + +impl From for Vec { + #[inline] + fn from(value: JavaString) -> Self { + value.into_bytes() + } +} + +impl From for JavaString { + #[inline] + fn from(value: char) -> Self { + Self::from(value.encode_utf8(&mut [0; 4])) + } +} + +impl From for JavaString { + #[inline] + fn from(value: JavaCodePoint) -> Self { + unsafe { + // SAFETY: we're encoding into semi-valid UTF-8 + JavaString::from_semi_utf8_unchecked(value.encode_semi_utf8(&mut [0; 4]).to_vec()) + } + } +} + +impl FromIterator for JavaString { + #[inline] + fn from_iter>(iter: T) -> Self { + let mut buf = JavaString::new(); + buf.extend(iter); + buf + } +} + +impl<'a> FromIterator<&'a char> for JavaString { + #[inline] + fn from_iter>(iter: T) -> Self { + let mut buf = JavaString::new(); + buf.extend(iter); + buf + } +} + +impl FromIterator for JavaString { + #[inline] + fn from_iter>(iter: T) -> Self { + let mut buf = JavaString::new(); + buf.extend(iter); + buf + } +} + +impl<'a> FromIterator<&'a JavaCodePoint> for JavaString { + #[inline] + fn from_iter>(iter: T) -> Self { + let mut buf = JavaString::new(); + buf.extend(iter); + buf + } +} + +impl<'a> FromIterator<&'a str> for JavaString { + #[inline] + fn from_iter>(iter: T) -> Self { + let mut buf = JavaString::new(); + buf.extend(iter); + buf + } +} + +impl FromIterator for JavaString { + fn from_iter>(iter: T) -> Self { + let mut iterator = iter.into_iter(); + + match iterator.next() { + None => JavaString::new(), + Some(buf) => { + let mut buf = JavaString::from(buf); + buf.extend(iterator); + buf + } + } + } +} + +impl FromIterator for JavaString { + fn from_iter>(iter: T) -> Self { + let mut iterator = iter.into_iter(); + + match iterator.next() { + None => JavaString::new(), + Some(mut buf) => { + buf.extend(iterator); + buf + } + } + } +} + +impl FromIterator> for JavaString { + #[inline] + fn from_iter>>(iter: T) -> Self { + let mut buf = JavaString::new(); + buf.extend(iter); + buf + } +} + +impl FromIterator> for JavaString { + #[inline] + fn from_iter>>(iter: T) -> Self { + let mut buf = JavaString::new(); + buf.extend(iter); + buf + } +} + +impl<'a> FromIterator> for JavaString { + #[inline] + fn from_iter>>(iter: T) -> Self { + let mut buf = JavaString::new(); + buf.extend(iter); + buf + } +} + +impl<'a> FromIterator> for JavaString { + #[inline] + fn from_iter>>(iter: T) -> Self { + let mut buf = JavaString::new(); + buf.extend(iter); + buf + } +} + +impl FromStr for JavaString { + type Err = Infallible; + + #[inline] + fn from_str(s: &str) -> Result { + Ok(Self::from(s)) + } +} + +impl Hash for JavaString { + #[inline] + fn hash(&self, state: &mut H) { + (**self).hash(state) + } +} + +impl Index> for JavaString { + type Output = JavaStr; + + #[inline] + fn index(&self, index: Range) -> &Self::Output { + &self[..][index] + } +} + +impl Index> for JavaString { + type Output = JavaStr; + + #[inline] + fn index(&self, index: RangeFrom) -> &Self::Output { + &self[..][index] + } +} + +impl Index for JavaString { + type Output = JavaStr; + + #[inline] + fn index(&self, _index: RangeFull) -> &Self::Output { + self.as_java_str() + } +} + +impl Index> for JavaString { + type Output = JavaStr; + + #[inline] + fn index(&self, index: RangeInclusive) -> &Self::Output { + &self[..][index] + } +} + +impl Index> for JavaString { + type Output = JavaStr; + + #[inline] + fn index(&self, index: RangeTo) -> &Self::Output { + &self[..][index] + } +} + +impl Index> for JavaString { + type Output = JavaStr; + + #[inline] + fn index(&self, index: RangeToInclusive) -> &Self::Output { + &self[..][index] + } +} + +impl IndexMut> for JavaString { + #[inline] + fn index_mut(&mut self, index: Range) -> &mut Self::Output { + &mut self[..][index] + } +} + +impl IndexMut> for JavaString { + #[inline] + fn index_mut(&mut self, index: RangeFrom) -> &mut Self::Output { + &mut self[..][index] + } +} + +impl IndexMut for JavaString { + #[inline] + fn index_mut(&mut self, _index: RangeFull) -> &mut Self::Output { + self.as_mut_java_str() + } +} + +impl IndexMut> for JavaString { + #[inline] + fn index_mut(&mut self, index: RangeInclusive) -> &mut Self::Output { + &mut self[..][index] + } +} + +impl IndexMut> for JavaString { + #[inline] + fn index_mut(&mut self, index: RangeTo) -> &mut Self::Output { + &mut self[..][index] + } +} + +impl IndexMut> for JavaString { + #[inline] + fn index_mut(&mut self, index: RangeToInclusive) -> &mut Self::Output { + &mut self[..][index] + } +} + +impl PartialEq for JavaString { + #[inline] + fn eq(&self, other: &str) -> bool { + self[..] == other + } +} + +impl PartialEq for str { + #[inline] + fn eq(&self, other: &JavaString) -> bool { + self == other[..] + } +} + +impl<'a> PartialEq<&'a str> for JavaString { + #[inline] + fn eq(&self, other: &&'a str) -> bool { + self == *other + } +} + +impl PartialEq for &str { + #[inline] + fn eq(&self, other: &JavaString) -> bool { + *self == other + } +} + +impl PartialEq for JavaString { + #[inline] + fn eq(&self, other: &String) -> bool { + &self[..] == other + } +} + +impl PartialEq for String { + #[inline] + fn eq(&self, other: &JavaString) -> bool { + self == &other[..] + } +} + +impl PartialEq for JavaString { + #[inline] + fn eq(&self, other: &JavaStr) -> bool { + self[..] == other + } +} + +impl<'a> PartialEq<&'a JavaStr> for JavaString { + #[inline] + fn eq(&self, other: &&'a JavaStr) -> bool { + self == *other + } +} + +impl<'a> PartialEq> for JavaString { + #[inline] + fn eq(&self, other: &Cow<'a, str>) -> bool { + &self[..] == other + } +} + +impl<'a> PartialEq for Cow<'a, str> { + #[inline] + fn eq(&self, other: &JavaString) -> bool { + self == &other[..] + } +} + +impl<'a> PartialEq> for JavaString { + #[inline] + fn eq(&self, other: &Cow<'a, JavaStr>) -> bool { + &self[..] == other + } +} + +impl<'a> PartialEq for Cow<'a, JavaStr> { + #[inline] + fn eq(&self, other: &JavaString) -> bool { + self == &other[..] + } +} + +impl Write for JavaString { + #[inline] + fn write_str(&mut self, s: &str) -> std::fmt::Result { + self.push_str(s); + Ok(()) + } + + #[inline] + fn write_char(&mut self, c: char) -> std::fmt::Result { + self.push(c); + Ok(()) + } +} + +pub struct Drain<'a> { + string: *mut JavaString, + start: usize, + end: usize, + iter: Chars<'a>, +} + +impl Debug for Drain<'_> { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_tuple("Drain").field(&self.as_str()).finish() + } +} + +unsafe impl Sync for Drain<'_> {} +unsafe impl Send for Drain<'_> {} + +impl Drop for Drain<'_> { + #[inline] + fn drop(&mut self) { + unsafe { + // Use Vec::drain. "Reaffirm" the bounds checks to avoid + // panic code being inserted again. + let self_vec = (*self.string).as_mut_vec(); + if self.start <= self.end && self.end <= self_vec.len() { + self_vec.drain(self.start..self.end); + } + } + } +} + +impl AsRef for Drain<'_> { + #[inline] + fn as_ref(&self) -> &JavaStr { + self.as_str() + } +} + +impl AsRef<[u8]> for Drain<'_> { + #[inline] + fn as_ref(&self) -> &[u8] { + self.as_str().as_bytes() + } +} + +impl Drain<'_> { + #[inline] + #[must_use] + pub fn as_str(&self) -> &JavaStr { + self.iter.as_str() + } +} + +impl Iterator for Drain<'_> { + type Item = JavaCodePoint; + + #[inline] + fn next(&mut self) -> Option { + self.iter.next() + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + self.iter.size_hint() + } + + #[inline] + fn last(mut self) -> Option { + self.next_back() + } +} + +impl DoubleEndedIterator for Drain<'_> { + #[inline] + fn next_back(&mut self) -> Option { + self.iter.next_back() + } +} + +impl FusedIterator for Drain<'_> {} diff --git a/vendor/valence/crates/java_string/src/pattern.rs b/vendor/valence/crates/java_string/src/pattern.rs new file mode 100644 index 00000000..06cc7804 --- /dev/null +++ b/vendor/valence/crates/java_string/src/pattern.rs @@ -0,0 +1,402 @@ +use crate::{JavaCodePoint, JavaStr}; + +mod private_pattern { + use crate::{JavaCodePoint, JavaStr}; + + pub trait Sealed {} + + impl Sealed for char {} + impl Sealed for JavaCodePoint {} + impl Sealed for &str {} + impl Sealed for &JavaStr {} + impl Sealed for F where F: FnMut(JavaCodePoint) -> bool {} + impl Sealed for &[char] {} + impl Sealed for &[JavaCodePoint] {} + impl Sealed for &char {} + impl Sealed for &JavaCodePoint {} + impl Sealed for &&str {} + impl Sealed for &&JavaStr {} +} + +/// # Safety +/// +/// Methods in this trait must only return indexes that are on char boundaries +pub unsafe trait JavaStrPattern: private_pattern::Sealed { + fn prefix_len_in(&mut self, haystack: &JavaStr) -> Option; + fn suffix_len_in(&mut self, haystack: &JavaStr) -> Option; + fn find_in(&mut self, haystack: &JavaStr) -> Option<(usize, usize)>; + fn rfind_in(&mut self, haystack: &JavaStr) -> Option<(usize, usize)>; +} + +unsafe impl JavaStrPattern for char { + #[inline] + fn prefix_len_in(&mut self, haystack: &JavaStr) -> Option { + let ch = haystack.chars().next()?; + if ch == *self { + Some(ch.len_utf8()) + } else { + None + } + } + + #[inline] + fn suffix_len_in(&mut self, haystack: &JavaStr) -> Option { + let ch = haystack.chars().next_back()?; + if ch == *self { + Some(ch.len_utf8()) + } else { + None + } + } + + #[inline] + fn find_in(&mut self, haystack: &JavaStr) -> Option<(usize, usize)> { + let mut encoded = [0; 4]; + let encoded = self.encode_utf8(&mut encoded).as_bytes(); + find(haystack.as_bytes(), encoded).map(|index| (index, encoded.len())) + } + + #[inline] + fn rfind_in(&mut self, haystack: &JavaStr) -> Option<(usize, usize)> { + let mut encoded = [0; 4]; + let encoded = self.encode_utf8(&mut encoded).as_bytes(); + rfind(haystack.as_bytes(), encoded).map(|index| (index, encoded.len())) + } +} + +unsafe impl JavaStrPattern for JavaCodePoint { + #[inline] + fn prefix_len_in(&mut self, haystack: &JavaStr) -> Option { + let ch = haystack.chars().next()?; + if ch == *self { + Some(ch.len_utf8()) + } else { + None + } + } + + #[inline] + fn suffix_len_in(&mut self, haystack: &JavaStr) -> Option { + let ch = haystack.chars().next_back()?; + if ch == *self { + Some(ch.len_utf8()) + } else { + None + } + } + + #[inline] + fn find_in(&mut self, haystack: &JavaStr) -> Option<(usize, usize)> { + let mut encoded = [0; 4]; + let encoded = self.encode_semi_utf8(&mut encoded); + find(haystack.as_bytes(), encoded).map(|index| (index, encoded.len())) + } + + #[inline] + fn rfind_in(&mut self, haystack: &JavaStr) -> Option<(usize, usize)> { + let mut encoded = [0; 4]; + let encoded = self.encode_semi_utf8(&mut encoded); + rfind(haystack.as_bytes(), encoded).map(|index| (index, encoded.len())) + } +} + +unsafe impl JavaStrPattern for &str { + #[inline] + fn prefix_len_in(&mut self, haystack: &JavaStr) -> Option { + if haystack.as_bytes().starts_with(self.as_bytes()) { + Some(self.len()) + } else { + None + } + } + + #[inline] + fn suffix_len_in(&mut self, haystack: &JavaStr) -> Option { + if haystack.as_bytes().ends_with(self.as_bytes()) { + Some(self.len()) + } else { + None + } + } + + #[inline] + fn find_in(&mut self, haystack: &JavaStr) -> Option<(usize, usize)> { + find(haystack.as_bytes(), self.as_bytes()).map(|index| (index, self.len())) + } + + #[inline] + fn rfind_in(&mut self, haystack: &JavaStr) -> Option<(usize, usize)> { + rfind(haystack.as_bytes(), self.as_bytes()).map(|index| (index, self.len())) + } +} + +unsafe impl JavaStrPattern for &JavaStr { + #[inline] + fn prefix_len_in(&mut self, haystack: &JavaStr) -> Option { + if haystack.as_bytes().starts_with(self.as_bytes()) { + Some(self.len()) + } else { + None + } + } + + #[inline] + fn suffix_len_in(&mut self, haystack: &JavaStr) -> Option { + if haystack.as_bytes().ends_with(self.as_bytes()) { + Some(self.len()) + } else { + None + } + } + + #[inline] + fn find_in(&mut self, haystack: &JavaStr) -> Option<(usize, usize)> { + find(haystack.as_bytes(), self.as_bytes()).map(|index| (index, self.len())) + } + + #[inline] + fn rfind_in(&mut self, haystack: &JavaStr) -> Option<(usize, usize)> { + rfind(haystack.as_bytes(), self.as_bytes()).map(|index| (index, self.len())) + } +} + +unsafe impl JavaStrPattern for F +where + F: FnMut(JavaCodePoint) -> bool, +{ + #[inline] + fn prefix_len_in(&mut self, haystack: &JavaStr) -> Option { + let ch = haystack.chars().next()?; + if self(ch) { + Some(ch.len_utf8()) + } else { + None + } + } + + #[inline] + fn suffix_len_in(&mut self, haystack: &JavaStr) -> Option { + let ch = haystack.chars().next_back()?; + if self(ch) { + Some(ch.len_utf8()) + } else { + None + } + } + + #[inline] + fn find_in(&mut self, haystack: &JavaStr) -> Option<(usize, usize)> { + haystack + .char_indices() + .find(|(_, ch)| self(*ch)) + .map(|(index, ch)| (index, ch.len_utf8())) + } + + #[inline] + fn rfind_in(&mut self, haystack: &JavaStr) -> Option<(usize, usize)> { + haystack + .char_indices() + .rfind(|(_, ch)| self(*ch)) + .map(|(index, ch)| (index, ch.len_utf8())) + } +} + +unsafe impl JavaStrPattern for &[char] { + #[inline] + fn prefix_len_in(&mut self, haystack: &JavaStr) -> Option { + let ch = haystack.chars().next()?; + if self.iter().any(|c| ch == *c) { + Some(ch.len_utf8()) + } else { + None + } + } + + #[inline] + fn suffix_len_in(&mut self, haystack: &JavaStr) -> Option { + let ch = haystack.chars().next_back()?; + if self.iter().any(|c| ch == *c) { + Some(ch.len_utf8()) + } else { + None + } + } + + #[inline] + fn find_in(&mut self, haystack: &JavaStr) -> Option<(usize, usize)> { + haystack + .char_indices() + .find(|(_, ch)| self.iter().any(|c| *ch == *c)) + .map(|(index, ch)| (index, ch.len_utf8())) + } + + #[inline] + fn rfind_in(&mut self, haystack: &JavaStr) -> Option<(usize, usize)> { + haystack + .char_indices() + .rfind(|(_, ch)| self.iter().any(|c| *ch == *c)) + .map(|(index, ch)| (index, ch.len_utf8())) + } +} + +unsafe impl JavaStrPattern for &[JavaCodePoint] { + #[inline] + fn prefix_len_in(&mut self, haystack: &JavaStr) -> Option { + let ch = haystack.chars().next()?; + if self.contains(&ch) { + Some(ch.len_utf8()) + } else { + None + } + } + + #[inline] + fn suffix_len_in(&mut self, haystack: &JavaStr) -> Option { + let ch = haystack.chars().next_back()?; + if self.contains(&ch) { + Some(ch.len_utf8()) + } else { + None + } + } + + #[inline] + fn find_in(&mut self, haystack: &JavaStr) -> Option<(usize, usize)> { + haystack + .char_indices() + .find(|(_, ch)| self.contains(ch)) + .map(|(index, ch)| (index, ch.len_utf8())) + } + + #[inline] + fn rfind_in(&mut self, haystack: &JavaStr) -> Option<(usize, usize)> { + haystack + .char_indices() + .rfind(|(_, ch)| self.contains(ch)) + .map(|(index, ch)| (index, ch.len_utf8())) + } +} + +unsafe impl JavaStrPattern for &char { + #[inline] + fn prefix_len_in(&mut self, haystack: &JavaStr) -> Option { + let mut ch = **self; + ch.prefix_len_in(haystack) + } + + #[inline] + fn suffix_len_in(&mut self, haystack: &JavaStr) -> Option { + let mut ch = **self; + ch.suffix_len_in(haystack) + } + + #[inline] + fn find_in(&mut self, haystack: &JavaStr) -> Option<(usize, usize)> { + let mut ch = **self; + ch.find_in(haystack) + } + + #[inline] + fn rfind_in(&mut self, haystack: &JavaStr) -> Option<(usize, usize)> { + let mut ch = **self; + ch.rfind_in(haystack) + } +} + +unsafe impl JavaStrPattern for &JavaCodePoint { + #[inline] + fn prefix_len_in(&mut self, haystack: &JavaStr) -> Option { + let mut ch = **self; + ch.prefix_len_in(haystack) + } + + #[inline] + fn suffix_len_in(&mut self, haystack: &JavaStr) -> Option { + let mut ch = **self; + ch.suffix_len_in(haystack) + } + + #[inline] + fn find_in(&mut self, haystack: &JavaStr) -> Option<(usize, usize)> { + let mut ch = **self; + ch.find_in(haystack) + } + + #[inline] + fn rfind_in(&mut self, haystack: &JavaStr) -> Option<(usize, usize)> { + let mut ch = **self; + ch.rfind_in(haystack) + } +} + +unsafe impl JavaStrPattern for &&str { + #[inline] + fn prefix_len_in(&mut self, haystack: &JavaStr) -> Option { + let mut str = **self; + str.prefix_len_in(haystack) + } + + #[inline] + fn suffix_len_in(&mut self, haystack: &JavaStr) -> Option { + let mut str = **self; + str.suffix_len_in(haystack) + } + + #[inline] + fn find_in(&mut self, haystack: &JavaStr) -> Option<(usize, usize)> { + let mut str = **self; + str.find_in(haystack) + } + + #[inline] + fn rfind_in(&mut self, haystack: &JavaStr) -> Option<(usize, usize)> { + let mut str = **self; + str.rfind_in(haystack) + } +} + +unsafe impl JavaStrPattern for &&JavaStr { + #[inline] + fn prefix_len_in(&mut self, haystack: &JavaStr) -> Option { + let mut str = **self; + str.prefix_len_in(haystack) + } + + #[inline] + fn suffix_len_in(&mut self, haystack: &JavaStr) -> Option { + let mut str = **self; + str.suffix_len_in(haystack) + } + + #[inline] + fn find_in(&mut self, haystack: &JavaStr) -> Option<(usize, usize)> { + let mut str = **self; + str.find_in(haystack) + } + + #[inline] + fn rfind_in(&mut self, haystack: &JavaStr) -> Option<(usize, usize)> { + let mut str = **self; + str.rfind_in(haystack) + } +} + +#[inline] +fn find(haystack: &[u8], needle: &[u8]) -> Option { + if needle.is_empty() { + return Some(0); + } + haystack + .windows(needle.len()) + .position(|window| window == needle) +} + +#[inline] +fn rfind(haystack: &[u8], needle: &[u8]) -> Option { + if needle.is_empty() { + return Some(haystack.len()); + } + haystack + .windows(needle.len()) + .rposition(|window| window == needle) +} diff --git a/vendor/valence/crates/java_string/src/serde.rs b/vendor/valence/crates/java_string/src/serde.rs new file mode 100644 index 00000000..e1c152d1 --- /dev/null +++ b/vendor/valence/crates/java_string/src/serde.rs @@ -0,0 +1,263 @@ +use std::fmt::Formatter; + +use serde::de::value::SeqAccessDeserializer; +use serde::de::{Error, SeqAccess, Unexpected, Visitor}; +use serde::ser::SerializeSeq; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; + +use crate::{JavaCodePoint, JavaStr, JavaString}; + +impl Serialize for JavaString { + #[inline] + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + match self.as_str() { + Ok(str) => str.serialize(serializer), + Err(_) => { + let mut seq = serializer.serialize_seq(None)?; + for ch in self.chars() { + seq.serialize_element(&ch.as_u32())?; + } + seq.end() + } + } + } +} + +impl<'de> Deserialize<'de> for JavaString { + #[inline] + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_any(JavaStringVisitor) + } +} + +struct JavaStringVisitor; + +impl<'de> Visitor<'de> for JavaStringVisitor { + type Value = JavaString; + + fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result { + formatter.write_str("a JavaString") + } + + fn visit_str(self, v: &str) -> Result + where + E: Error, + { + Ok(JavaString::from(v)) + } + + fn visit_string(self, v: String) -> Result + where + E: Error, + { + Ok(JavaString::from(v)) + } + + fn visit_bytes(self, v: &[u8]) -> Result + where + E: Error, + { + match JavaStr::from_semi_utf8(v) { + Ok(str) => Ok(str.to_owned()), + Err(_) => Err(Error::invalid_value(Unexpected::Bytes(v), &self)), + } + } + + fn visit_byte_buf(self, v: Vec) -> Result + where + E: Error, + { + JavaString::from_semi_utf8(v) + .map_err(|err| Error::invalid_value(Unexpected::Bytes(&err.into_bytes()), &self)) + } + + fn visit_seq(self, seq: A) -> Result + where + A: SeqAccess<'de>, + { + let vec = Vec::::deserialize(SeqAccessDeserializer::new(seq))?; + JavaString::from_semi_utf8(vec).map_err(|_| Error::invalid_value(Unexpected::Seq, &self)) + } +} + +impl Serialize for JavaStr { + #[inline] + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + match self.as_str() { + Ok(str) => str.serialize(serializer), + Err(_) => { + let mut seq = serializer.serialize_seq(None)?; + for ch in self.chars() { + seq.serialize_element(&ch.as_u32())?; + } + seq.end() + } + } + } +} + +impl<'de: 'a, 'a> Deserialize<'de> for &'a JavaStr { + #[inline] + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_any(JavaStrVisitor) + } +} + +struct JavaStrVisitor; + +impl<'de> Visitor<'de> for JavaStrVisitor { + type Value = &'de JavaStr; + + fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result { + formatter.write_str("a borrowed JavaStr") + } + + fn visit_borrowed_str(self, v: &'de str) -> Result + where + E: Error, + { + Ok(JavaStr::from_str(v)) + } + + fn visit_borrowed_bytes(self, v: &'de [u8]) -> Result + where + E: Error, + { + JavaStr::from_semi_utf8(v).map_err(|_| Error::invalid_value(Unexpected::Bytes(v), &self)) + } +} + +impl Serialize for JavaCodePoint { + #[inline] + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + match self.as_char() { + Some(ch) => ch.serialize(serializer), + None => self.as_u32().serialize(serializer), + } + } +} + +impl<'de> Deserialize<'de> for JavaCodePoint { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_any(JavaCodePointVisitor) + } +} + +struct JavaCodePointVisitor; + +impl<'de> Visitor<'de> for JavaCodePointVisitor { + type Value = JavaCodePoint; + + fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result { + formatter.write_str("a character") + } + + #[inline] + fn visit_i8(self, v: i8) -> Result + where + E: Error, + { + self.visit_i32(v as i32) + } + + #[inline] + fn visit_i16(self, v: i16) -> Result + where + E: Error, + { + self.visit_i32(v as i32) + } + + fn visit_i32(self, v: i32) -> Result + where + E: Error, + { + if v < 0 { + Err(Error::invalid_value(Unexpected::Signed(v as i64), &self)) + } else { + self.visit_u32(v as u32) + } + } + + fn visit_i64(self, v: i64) -> Result + where + E: Error, + { + if v < 0 { + Err(Error::invalid_value(Unexpected::Signed(v), &self)) + } else { + self.visit_u64(v as u64) + } + } + + #[inline] + fn visit_u8(self, v: u8) -> Result + where + E: Error, + { + self.visit_u32(v as u32) + } + + #[inline] + fn visit_u16(self, v: u16) -> Result + where + E: Error, + { + self.visit_u32(v as u32) + } + + fn visit_u32(self, v: u32) -> Result + where + E: Error, + { + JavaCodePoint::from_u32(v) + .ok_or_else(|| Error::invalid_value(Unexpected::Unsigned(v as u64), &self)) + } + + fn visit_u64(self, v: u64) -> Result + where + E: Error, + { + if v > u32::MAX as u64 { + Err(Error::invalid_value(Unexpected::Unsigned(v), &self)) + } else { + self.visit_u32(v as u32) + } + } + + fn visit_char(self, v: char) -> Result + where + E: Error, + { + Ok(JavaCodePoint::from_char(v)) + } + + fn visit_str(self, v: &str) -> Result + where + E: Error, + { + let mut iter = v.chars(); + match (iter.next(), iter.next()) { + (Some(c), None) => Ok(JavaCodePoint::from_char(c)), + _ => Err(Error::invalid_value(Unexpected::Str(v), &self)), + } + } +} diff --git a/vendor/valence/crates/java_string/src/slice.rs b/vendor/valence/crates/java_string/src/slice.rs new file mode 100644 index 00000000..e9faadf4 --- /dev/null +++ b/vendor/valence/crates/java_string/src/slice.rs @@ -0,0 +1,2267 @@ +use std::borrow::Cow; +use std::collections::Bound; +use std::fmt::{Debug, Display, Formatter, Write}; +use std::hash::{Hash, Hasher}; +use std::ops::{ + Add, AddAssign, Index, IndexMut, Range, RangeBounds, RangeFrom, RangeFull, RangeInclusive, + RangeTo, RangeToInclusive, +}; +use std::rc::Rc; +use std::str::FromStr; +use std::sync::Arc; +use std::{ptr, slice}; + +use crate::char::EscapeDebugExtArgs; +use crate::validations::{ + run_utf8_full_validation_from_semi, run_utf8_semi_validation, slice_error_fail, + str_end_index_overflow_fail, +}; +use crate::{ + Bytes, CharEscapeIter, CharIndices, Chars, EscapeDebug, EscapeDefault, EscapeUnicode, + JavaCodePoint, JavaStrPattern, JavaString, Lines, MatchIndices, Matches, ParseError, + RMatchIndices, RMatches, RSplit, RSplitN, RSplitTerminator, Split, SplitAsciiWhitespace, + SplitInclusive, SplitN, SplitTerminator, SplitWhitespace, Utf8Error, +}; + +#[repr(transparent)] +#[derive(PartialEq, Eq, PartialOrd, Ord)] +pub struct JavaStr { + inner: [u8], +} + +impl JavaStr { + /// Converts `v` to a `&JavaStr` if it is fully-valid UTF-8, i.e. UTF-8 + /// without surrogate code points. See [`std::str::from_utf8`]. + #[inline] + pub const fn from_full_utf8(v: &[u8]) -> Result<&JavaStr, Utf8Error> { + match std::str::from_utf8(v) { + Ok(str) => Ok(JavaStr::from_str(str)), + Err(err) => Err(Utf8Error::from_std(err)), + } + } + + /// Converts `v` to a `&mut JavaStr` if it is fully-valid UTF-8, i.e. UTF-8 + /// without surrogate code points. See [`std::str::from_utf8_mut`]. + #[inline] + pub fn from_full_utf8_mut(v: &mut [u8]) -> Result<&mut JavaStr, Utf8Error> { + match std::str::from_utf8_mut(v) { + Ok(str) => Ok(JavaStr::from_mut_str(str)), + Err(err) => Err(Utf8Error::from_std(err)), + } + } + + /// Converts `v` to a `&JavaStr` if it is semi-valid UTF-8, i.e. UTF-8 + /// with surrogate code points. + pub fn from_semi_utf8(v: &[u8]) -> Result<&JavaStr, Utf8Error> { + match run_utf8_semi_validation(v) { + Ok(()) => Ok(unsafe { JavaStr::from_semi_utf8_unchecked(v) }), + Err(err) => Err(err), + } + } + + /// Converts `v` to a `&mut JavaStr` if it is semi-valid UTF-8, i.e. UTF-8 + /// with surrogate code points. + pub fn from_semi_utf8_mut(v: &mut [u8]) -> Result<&mut JavaStr, Utf8Error> { + match run_utf8_semi_validation(v) { + Ok(()) => Ok(unsafe { JavaStr::from_semi_utf8_unchecked_mut(v) }), + Err(err) => Err(err), + } + } + + /// # Safety + /// + /// The parameter must be in semi-valid UTF-8 format, that is, UTF-8 plus + /// surrogate code points. + #[inline] + #[must_use] + pub const unsafe fn from_semi_utf8_unchecked(v: &[u8]) -> &JavaStr { + // SAFETY: the caller must guarantee that the bytes `v` are valid UTF-8, minus + // the absence of surrogate chars. Also relies on `&JavaStr` and `&[u8]` + // having the same layout. + unsafe { std::mem::transmute(v) } + } + + /// # Safety + /// + /// The parameter must be in semi-valid UTF-8 format, that is, UTF-8 plus + /// surrogate code points. + #[inline] + #[must_use] + pub unsafe fn from_semi_utf8_unchecked_mut(v: &mut [u8]) -> &mut JavaStr { + // SAFETY: see from_semi_utf8_unchecked + unsafe { std::mem::transmute(v) } + } + + #[inline] + #[must_use] + pub const fn from_str(str: &str) -> &JavaStr { + unsafe { + // SAFETY: the input str is guaranteed to have valid UTF-8. + JavaStr::from_semi_utf8_unchecked(str.as_bytes()) + } + } + + #[inline] + #[must_use] + pub fn from_mut_str(str: &mut str) -> &mut JavaStr { + unsafe { + // SAFETY: the input str is guaranteed to have valid UTF-8. + JavaStr::from_semi_utf8_unchecked_mut(str.as_bytes_mut()) + } + } + + #[inline] + #[must_use] + pub fn from_boxed_str(v: Box) -> Box { + unsafe { JavaStr::from_boxed_semi_utf8_unchecked(v.into_boxed_bytes()) } + } + + /// # Safety + /// + /// The parameter must be in semi-valid UTF-8 format, that is, UTF-8 plus + /// surrogate code points. + #[inline] + #[must_use] + pub unsafe fn from_boxed_semi_utf8_unchecked(v: Box<[u8]>) -> Box { + unsafe { Box::from_raw(Box::into_raw(v) as *mut JavaStr) } + } + + /// See [`str::as_bytes`]. + #[inline] + #[must_use] + pub const fn as_bytes(&self) -> &[u8] { + &self.inner + } + + /// See [`str::as_bytes_mut`]. + /// + /// # Safety + /// + /// The returned slice must not have invalid UTF-8 written to it, besides + /// surrogate pairs. + #[inline] + #[must_use] + pub unsafe fn as_bytes_mut(&mut self) -> &mut [u8] { + &mut self.inner + } + + /// See [`str::as_mut_ptr`]. + #[inline] + #[must_use] + pub fn as_mut_ptr(&mut self) -> *mut u8 { + self.inner.as_mut_ptr() + } + + /// See [`str::as_ptr`]. + #[inline] + #[must_use] + pub const fn as_ptr(&self) -> *const u8 { + self.inner.as_ptr() + } + + /// Tries to convert this `&JavaStr` to a `&str`, returning an error if + /// it is not fully valid UTF-8, i.e. has no surrogate code points. + pub const fn as_str(&self) -> Result<&str, Utf8Error> { + // Manual implementation of Option::map since it's not const + match run_utf8_full_validation_from_semi(self.as_bytes()) { + Ok(..) => unsafe { + // SAFETY: we were already semi-valid, and full validation just succeeded. + Ok(self.as_str_unchecked()) + }, + Err(err) => Err(err), + } + } + + /// # Safety + /// + /// This string must be fully valid UTF-8, i.e. have no surrogate code + /// points. + #[inline] + #[must_use] + pub const unsafe fn as_str_unchecked(&self) -> &str { + unsafe { std::str::from_utf8_unchecked(self.as_bytes()) } + } + + /// Converts this `&JavaStr` to a `Cow`, replacing surrogate code + /// points with the replacement character ļæ½. + /// + /// ``` + /// # use std::borrow::Cow; + /// # use java_string::{JavaCodePoint, JavaStr, JavaString}; + /// let s = JavaStr::from_str("Hello šŸ¦€ World!"); + /// let result = s.as_str_lossy(); + /// assert!(matches!(result, Cow::Borrowed(_))); + /// assert_eq!(result, "Hello šŸ¦€ World!"); + /// + /// let s = JavaString::from("Hello ") + /// + JavaString::from(JavaCodePoint::from_u32(0xd800).unwrap()).as_java_str() + /// + JavaStr::from_str(" World!"); + /// let result = s.as_str_lossy(); + /// assert!(matches!(result, Cow::Owned(_))); + /// assert_eq!(result, "Hello ļæ½ World!"); + /// ``` + #[must_use] + pub fn as_str_lossy(&self) -> Cow<'_, str> { + match run_utf8_full_validation_from_semi(self.as_bytes()) { + Ok(()) => unsafe { + // SAFETY: validation succeeded + Cow::Borrowed(self.as_str_unchecked()) + }, + Err(error) => unsafe { + // SAFETY: invalid parts of string are converted to replacement char + Cow::Owned( + self.transform_invalid_string(error, str::to_owned, |_| { + JavaStr::from_str("\u{FFFD}") + }) + .into_string_unchecked(), + ) + }, + } + } + + /// See [`str::bytes`]. + #[inline] + pub fn bytes(&self) -> Bytes<'_> { + Bytes { + inner: self.inner.iter().copied(), + } + } + + /// See [`str::char_indices`]. + #[inline] + pub fn char_indices(&self) -> CharIndices<'_> { + CharIndices { + front_offset: 0, + inner: self.chars(), + } + } + + /// See [`str::chars`]. + #[inline] + pub fn chars(&self) -> Chars<'_> { + Chars { + inner: self.inner.iter(), + } + } + + /// See [`str::contains`]. + /// + /// ``` + /// # use java_string::JavaStr; + /// let bananas = JavaStr::from_str("bananas"); + /// + /// assert!(bananas.contains("nana")); + /// assert!(!bananas.contains("apples")); + /// ``` + #[inline] + #[must_use] + pub fn contains

(&self, mut pat: P) -> bool + where + P: JavaStrPattern, + { + pat.find_in(self).is_some() + } + + /// See [`str::ends_with`]. + /// + /// ``` + /// # use java_string::JavaStr; + /// let bananas = JavaStr::from_str("bananas"); + /// + /// assert!(bananas.ends_with("anas")); + /// assert!(!bananas.ends_with("nana")); + /// ``` + #[inline] + #[must_use] + pub fn ends_with

(&self, mut pat: P) -> bool + where + P: JavaStrPattern, + { + pat.suffix_len_in(self).is_some() + } + + /// See [`str::eq_ignore_ascii_case`]. + #[inline] + #[must_use] + pub fn eq_ignore_ascii_case(&self, other: &str) -> bool { + self.as_bytes().eq_ignore_ascii_case(other.as_bytes()) + } + + /// See [`str::eq_ignore_ascii_case`]. + #[inline] + #[must_use] + pub fn eq_java_ignore_ascii_case(&self, other: &JavaStr) -> bool { + self.as_bytes().eq_ignore_ascii_case(other.as_bytes()) + } + + /// See [`str::escape_debug`]. + /// + /// ``` + /// # use java_string::JavaStr; + /// assert_eq!( + /// JavaStr::from_str("ā¤\n!").escape_debug().to_string(), + /// "ā¤\\n!" + /// ); + /// ``` + #[inline] + pub fn escape_debug(&self) -> EscapeDebug<'_> { + #[inline] + fn escape_first(first: JavaCodePoint) -> CharEscapeIter { + first.escape_debug_ext(EscapeDebugExtArgs::ESCAPE_ALL) + } + #[inline] + fn escape_rest(char: JavaCodePoint) -> CharEscapeIter { + char.escape_debug_ext(EscapeDebugExtArgs { + escape_single_quote: true, + escape_double_quote: true, + }) + } + + let mut chars = self.chars(); + EscapeDebug { + inner: chars + .next() + .map(escape_first as fn(JavaCodePoint) -> CharEscapeIter) + .into_iter() + .flatten() + .chain(chars.flat_map(escape_rest as fn(JavaCodePoint) -> CharEscapeIter)), + } + } + + /// See [`str::escape_default`]. + /// + /// ``` + /// # use java_string::JavaStr; + /// assert_eq!( + /// JavaStr::from_str("ā¤\n!").escape_default().to_string(), + /// "\\u{2764}\\n!" + /// ); + /// ``` + #[inline] + pub fn escape_default(&self) -> EscapeDefault<'_> { + EscapeDefault { + inner: self.chars().flat_map(JavaCodePoint::escape_default), + } + } + + /// See [`str::escape_unicode`]. + /// + /// ``` + /// # use java_string::JavaStr; + /// assert_eq!( + /// JavaStr::from_str("ā¤\n!").escape_unicode().to_string(), + /// "\\u{2764}\\u{a}\\u{21}" + /// ); + /// ``` + #[inline] + pub fn escape_unicode(&self) -> EscapeUnicode<'_> { + EscapeUnicode { + inner: self.chars().flat_map(JavaCodePoint::escape_unicode), + } + } + + /// See [`str::find`]. + /// + /// ``` + /// let s = "Lƶwe 老虎 LĆ©opard Gepardi"; + /// + /// assert_eq!(s.find('L'), Some(0)); + /// assert_eq!(s.find('Ć©'), Some(14)); + /// assert_eq!(s.find("pard"), Some(17)); + /// + /// let x: &[_] = &['1', '2']; + /// assert_eq!(s.find(x), None); + /// ``` + #[inline] + #[must_use] + pub fn find

(&self, mut pat: P) -> Option + where + P: JavaStrPattern, + { + pat.find_in(self).map(|(index, _)| index) + } + + /// See [`str::get`]. + /// + /// ``` + /// # use java_string::{JavaStr, JavaString}; + /// let v = JavaString::from("šŸ—»āˆˆšŸŒ"); + /// + /// assert_eq!(Some(JavaStr::from_str("šŸ—»")), v.get(0..4)); + /// + /// // indices not on UTF-8 sequence boundaries + /// assert!(v.get(1..).is_none()); + /// assert!(v.get(..8).is_none()); + /// + /// // out of bounds + /// assert!(v.get(..42).is_none()); + /// ``` + #[inline] + #[must_use] + pub fn get(&self, i: I) -> Option<&JavaStr> + where + I: JavaStrSliceIndex, + { + i.get(self) + } + + /// See [`str::get_mut`]. + #[inline] + #[must_use] + pub fn get_mut(&mut self, i: I) -> Option<&mut JavaStr> + where + I: JavaStrSliceIndex, + { + i.get_mut(self) + } + + /// See [`str::get_unchecked`]. + /// + /// # Safety + /// + /// - The starting index must not exceed the ending index + /// - Indexes must be within bounds of the original slice + /// - Indexes must lie on UTF-8 sequence boundaries + #[inline] + #[must_use] + pub unsafe fn get_unchecked(&self, i: I) -> &JavaStr + where + I: JavaStrSliceIndex, + { + unsafe { &*i.get_unchecked(self) } + } + + /// See [`str::get_unchecked_mut`]. + /// + /// # Safety + /// + /// - The starting index must not exceed the ending index + /// - Indexes must be within bounds of the original slice + /// - Indexes must lie on UTF-8 sequence boundaries + #[inline] + #[must_use] + pub unsafe fn get_unchecked_mut(&mut self, i: I) -> &mut JavaStr + where + I: JavaStrSliceIndex, + { + unsafe { &mut *i.get_unchecked_mut(self) } + } + + /// See [`str::into_boxed_bytes`]. + #[inline] + #[must_use] + pub fn into_boxed_bytes(self: Box) -> Box<[u8]> { + unsafe { Box::from_raw(Box::into_raw(self) as *mut [u8]) } + } + + /// See [`str::into_string`]. + #[inline] + #[must_use] + pub fn into_string(self: Box) -> JavaString { + let slice = self.into_boxed_bytes(); + unsafe { JavaString::from_semi_utf8_unchecked(slice.into_vec()) } + } + + /// See [`str::is_ascii`]. + #[inline] + #[must_use] + pub fn is_ascii(&self) -> bool { + self.as_bytes().is_ascii() + } + + /// See [`str::is_char_boundary`]. + #[inline] + #[must_use] + pub fn is_char_boundary(&self, index: usize) -> bool { + // 0 is always ok. + // Test for 0 explicitly so that it can optimize out the check + // easily and skip reading string data for that case. + // Note that optimizing `self.get(..index)` relies on this. + if index == 0 { + return true; + } + + match self.as_bytes().get(index) { + // For `None` we have two options: + // + // - index == self.len() Empty strings are valid, so return true + // - index > self.len() In this case return false + // + // The check is placed exactly here, because it improves generated + // code on higher opt-levels. See https://github.com/rust-lang/rust/pull/84751 for more details. + None => index == self.len(), + + Some(&b) => { + // This is bit magic equivalent to: b < 128 || b >= 192 + (b as i8) >= -0x40 + } + } + } + + pub(crate) fn floor_char_boundary(&self, index: usize) -> usize { + if index >= self.len() { + self.len() + } else { + let lower_bound = index.saturating_sub(3); + let new_index = self.as_bytes()[lower_bound..=index].iter().rposition(|b| { + // This is bit magic equivalent to: b < 128 || b >= 192 + (*b as i8) >= -0x40 + }); + + // SAFETY: we know that the character boundary will be within four bytes + unsafe { lower_bound + new_index.unwrap_unchecked() } + } + } + + /// See [`str::is_empty`]. + #[inline] + #[must_use] + pub fn is_empty(&self) -> bool { + self.len() == 0 + } + + /// See [`str::len`]. + #[inline] + #[must_use] + pub fn len(&self) -> usize { + self.inner.len() + } + + /// See [`str::lines`]. + #[inline] + pub fn lines(&self) -> Lines<'_> { + Lines { + inner: self.split_inclusive('\n').map(|line| { + let Some(line) = line.strip_suffix('\n') else { + return line; + }; + let Some(line) = line.strip_suffix('\r') else { + return line; + }; + line + }), + } + } + + /// See [`str::make_ascii_lowercase`]. + #[inline] + pub fn make_ascii_lowercase(&mut self) { + // SAFETY: changing ASCII letters only does not invalidate UTF-8. + let me = unsafe { self.as_bytes_mut() }; + me.make_ascii_lowercase() + } + + /// See [`str::make_ascii_uppercase`]. + #[inline] + pub fn make_ascii_uppercase(&mut self) { + // SAFETY: changing ASCII letters only does not invalidate UTF-8. + let me = unsafe { self.as_bytes_mut() }; + me.make_ascii_uppercase() + } + + /// See [`str::match_indices`]. + /// + /// ``` + /// # use java_string::JavaStr; + /// let v: Vec<_> = JavaStr::from_str("abcXXXabcYYYabc") + /// .match_indices("abc") + /// .collect(); + /// assert_eq!( + /// v, + /// [ + /// (0, JavaStr::from_str("abc")), + /// (6, JavaStr::from_str("abc")), + /// (12, JavaStr::from_str("abc")) + /// ] + /// ); + /// + /// let v: Vec<_> = JavaStr::from_str("1abcabc2").match_indices("abc").collect(); + /// assert_eq!( + /// v, + /// [(1, JavaStr::from_str("abc")), (4, JavaStr::from_str("abc"))] + /// ); + /// + /// let v: Vec<_> = JavaStr::from_str("ababa").match_indices("aba").collect(); + /// assert_eq!(v, [(0, JavaStr::from_str("aba"))]); // only the first `aba` + /// ``` + #[inline] + pub fn match_indices

(&self, pat: P) -> MatchIndices

+ where + P: JavaStrPattern, + { + MatchIndices { + str: self, + start: 0, + pat, + } + } + + /// See [`str::matches`]. + /// + /// ``` + /// # use java_string::{JavaCodePoint, JavaStr}; + /// let v: Vec<&JavaStr> = JavaStr::from_str("abcXXXabcYYYabc") + /// .matches("abc") + /// .collect(); + /// assert_eq!( + /// v, + /// [ + /// JavaStr::from_str("abc"), + /// JavaStr::from_str("abc"), + /// JavaStr::from_str("abc") + /// ] + /// ); + /// + /// let v: Vec<&JavaStr> = JavaStr::from_str("1abc2abc3") + /// .matches(JavaCodePoint::is_numeric) + /// .collect(); + /// assert_eq!( + /// v, + /// [ + /// JavaStr::from_str("1"), + /// JavaStr::from_str("2"), + /// JavaStr::from_str("3") + /// ] + /// ); + /// ``` + #[inline] + pub fn matches

(&self, pat: P) -> Matches

+ where + P: JavaStrPattern, + { + Matches { str: self, pat } + } + + /// See [`str::parse`]. + #[inline] + pub fn parse(&self) -> Result::Err>> + where + F: FromStr, + { + match self.as_str() { + Ok(str) => str.parse().map_err(ParseError::Err), + Err(err) => Err(ParseError::InvalidUtf8(err)), + } + } + + /// See [`str::repeat`]. + #[inline] + #[must_use] + pub fn repeat(&self, n: usize) -> JavaString { + unsafe { JavaString::from_semi_utf8_unchecked(self.as_bytes().repeat(n)) } + } + + /// See [`str::replace`]. + /// + /// ``` + /// # use java_string::JavaStr; + /// let s = JavaStr::from_str("this is old"); + /// + /// assert_eq!("this is new", s.replace("old", "new")); + /// assert_eq!("than an old", s.replace("is", "an")); + /// ``` + #[inline] + #[must_use] + pub fn replace

(&self, from: P, to: &str) -> JavaString + where + P: JavaStrPattern, + { + self.replace_java(from, JavaStr::from_str(to)) + } + + /// See [`str::replace`]. + #[inline] + #[must_use] + pub fn replace_java

(&self, from: P, to: &JavaStr) -> JavaString + where + P: JavaStrPattern, + { + let mut result = JavaString::new(); + let mut last_end = 0; + for (start, part) in self.match_indices(from) { + result.push_java_str(unsafe { self.get_unchecked(last_end..start) }); + result.push_java_str(to); + last_end = start + part.len(); + } + result.push_java_str(unsafe { self.get_unchecked(last_end..self.len()) }); + result + } + + /// See [`str::replacen`]. + /// + /// ``` + /// # use java_string::{JavaCodePoint, JavaStr}; + /// let s = JavaStr::from_str("foo foo 123 foo"); + /// assert_eq!("new new 123 foo", s.replacen("foo", "new", 2)); + /// assert_eq!("faa fao 123 foo", s.replacen('o', "a", 3)); + /// assert_eq!( + /// "foo foo new23 foo", + /// s.replacen(JavaCodePoint::is_numeric, "new", 1) + /// ); + /// ``` + #[inline] + #[must_use] + pub fn replacen

(&self, from: P, to: &str, count: usize) -> JavaString + where + P: JavaStrPattern, + { + self.replacen_java(from, JavaStr::from_str(to), count) + } + + /// See [`str::replacen`]. + #[inline] + #[must_use] + pub fn replacen_java

(&self, from: P, to: &JavaStr, count: usize) -> JavaString + where + P: JavaStrPattern, + { + // Hope to reduce the times of re-allocation + let mut result = JavaString::with_capacity(32); + let mut last_end = 0; + for (start, part) in self.match_indices(from).take(count) { + result.push_java_str(unsafe { self.get_unchecked(last_end..start) }); + result.push_java_str(to); + last_end = start + part.len(); + } + result.push_java_str(unsafe { self.get_unchecked(last_end..self.len()) }); + result + } + + /// See [`str::rfind`]. + /// + /// ``` + /// # use java_string::JavaStr; + /// let s = JavaStr::from_str("Lƶwe 老虎 LĆ©opard Gepardi"); + /// + /// assert_eq!(s.rfind('L'), Some(13)); + /// assert_eq!(s.rfind('Ć©'), Some(14)); + /// assert_eq!(s.rfind("pard"), Some(24)); + /// + /// let x: &[_] = &['1', '2']; + /// assert_eq!(s.rfind(x), None); + /// ``` + #[inline] + #[must_use] + pub fn rfind

(&self, mut pat: P) -> Option + where + P: JavaStrPattern, + { + pat.rfind_in(self).map(|(index, _)| index) + } + + /// See [`str::rmatch_indices`]. + /// + /// ``` + /// # use java_string::JavaStr; + /// let v: Vec<_> = JavaStr::from_str("abcXXXabcYYYabc") + /// .rmatch_indices("abc") + /// .collect(); + /// assert_eq!( + /// v, + /// [ + /// (12, JavaStr::from_str("abc")), + /// (6, JavaStr::from_str("abc")), + /// (0, JavaStr::from_str("abc")) + /// ] + /// ); + /// + /// let v: Vec<_> = JavaStr::from_str("1abcabc2") + /// .rmatch_indices("abc") + /// .collect(); + /// assert_eq!( + /// v, + /// [(4, JavaStr::from_str("abc")), (1, JavaStr::from_str("abc"))] + /// ); + /// + /// let v: Vec<_> = JavaStr::from_str("ababa").rmatch_indices("aba").collect(); + /// assert_eq!(v, [(2, JavaStr::from_str("aba"))]); // only the last `aba` + /// ``` + #[inline] + pub fn rmatch_indices

(&self, pat: P) -> RMatchIndices

+ where + P: JavaStrPattern, + { + RMatchIndices { + inner: self.match_indices(pat), + } + } + + /// See [`str::rmatches`]. + /// + /// ``` + /// # use java_string::{JavaCodePoint, JavaStr}; + /// let v: Vec<&JavaStr> = JavaStr::from_str("abcXXXabcYYYabc") + /// .rmatches("abc") + /// .collect(); + /// assert_eq!( + /// v, + /// [ + /// JavaStr::from_str("abc"), + /// JavaStr::from_str("abc"), + /// JavaStr::from_str("abc") + /// ] + /// ); + /// + /// let v: Vec<&JavaStr> = JavaStr::from_str("1abc2abc3") + /// .rmatches(JavaCodePoint::is_numeric) + /// .collect(); + /// assert_eq!( + /// v, + /// [ + /// JavaStr::from_str("3"), + /// JavaStr::from_str("2"), + /// JavaStr::from_str("1") + /// ] + /// ); + /// ``` + #[inline] + pub fn rmatches

(&self, pat: P) -> RMatches

+ where + P: JavaStrPattern, + { + RMatches { + inner: self.matches(pat), + } + } + + /// See [`str::rsplit`]. + /// + /// ``` + /// # use java_string::JavaStr; + /// let v: Vec<&JavaStr> = JavaStr::from_str("Mary had a little lamb") + /// .rsplit(' ') + /// .collect(); + /// assert_eq!( + /// v, + /// [ + /// JavaStr::from_str("lamb"), + /// JavaStr::from_str("little"), + /// JavaStr::from_str("a"), + /// JavaStr::from_str("had"), + /// JavaStr::from_str("Mary") + /// ] + /// ); + /// + /// let v: Vec<&JavaStr> = JavaStr::from_str("").rsplit('X').collect(); + /// assert_eq!(v, [JavaStr::from_str("")]); + /// + /// let v: Vec<&JavaStr> = JavaStr::from_str("lionXXtigerXleopard") + /// .rsplit('X') + /// .collect(); + /// assert_eq!( + /// v, + /// [ + /// JavaStr::from_str("leopard"), + /// JavaStr::from_str("tiger"), + /// JavaStr::from_str(""), + /// JavaStr::from_str("lion") + /// ] + /// ); + /// + /// let v: Vec<&JavaStr> = JavaStr::from_str("lion::tiger::leopard") + /// .rsplit("::") + /// .collect(); + /// assert_eq!( + /// v, + /// [ + /// JavaStr::from_str("leopard"), + /// JavaStr::from_str("tiger"), + /// JavaStr::from_str("lion") + /// ] + /// ); + /// ``` + #[inline] + pub fn rsplit

(&self, pat: P) -> RSplit

+ where + P: JavaStrPattern, + { + RSplit::new(self, pat) + } + + /// See [`str::rsplit_once`]. + /// + /// ``` + /// # use java_string::JavaStr; + /// assert_eq!(JavaStr::from_str("cfg").rsplit_once('='), None); + /// assert_eq!( + /// JavaStr::from_str("cfg=foo").rsplit_once('='), + /// Some((JavaStr::from_str("cfg"), JavaStr::from_str("foo"))) + /// ); + /// assert_eq!( + /// JavaStr::from_str("cfg=foo=bar").rsplit_once('='), + /// Some((JavaStr::from_str("cfg=foo"), JavaStr::from_str("bar"))) + /// ); + /// ``` + #[inline] + #[must_use] + pub fn rsplit_once

(&self, mut delimiter: P) -> Option<(&JavaStr, &JavaStr)> + where + P: JavaStrPattern, + { + let (index, len) = delimiter.rfind_in(self)?; + // SAFETY: pattern is known to return valid indices. + unsafe { + Some(( + self.get_unchecked(..index), + self.get_unchecked(index + len..), + )) + } + } + + /// See [`str::rsplit_terminator`]. + /// + /// ``` + /// # use java_string::JavaStr; + /// let v: Vec<&JavaStr> = JavaStr::from_str("A.B.").rsplit_terminator('.').collect(); + /// assert_eq!(v, [JavaStr::from_str("B"), JavaStr::from_str("A")]); + /// + /// let v: Vec<&JavaStr> = JavaStr::from_str("A..B..").rsplit_terminator(".").collect(); + /// assert_eq!( + /// v, + /// [ + /// JavaStr::from_str(""), + /// JavaStr::from_str("B"), + /// JavaStr::from_str(""), + /// JavaStr::from_str("A") + /// ] + /// ); + /// + /// let v: Vec<&JavaStr> = JavaStr::from_str("A.B:C.D") + /// .rsplit_terminator(&['.', ':'][..]) + /// .collect(); + /// assert_eq!( + /// v, + /// [ + /// JavaStr::from_str("D"), + /// JavaStr::from_str("C"), + /// JavaStr::from_str("B"), + /// JavaStr::from_str("A") + /// ] + /// ); + /// ``` + #[inline] + pub fn rsplit_terminator

(&self, pat: P) -> RSplitTerminator

+ where + P: JavaStrPattern, + { + RSplitTerminator::new(self, pat) + } + + /// See [`str::rsplitn`]. + /// + /// ``` + /// # use java_string::JavaStr; + /// let v: Vec<&JavaStr> = JavaStr::from_str("Mary had a little lamb") + /// .rsplitn(3, ' ') + /// .collect(); + /// assert_eq!( + /// v, + /// [ + /// JavaStr::from_str("lamb"), + /// JavaStr::from_str("little"), + /// JavaStr::from_str("Mary had a") + /// ] + /// ); + /// + /// let v: Vec<&JavaStr> = JavaStr::from_str("lionXXtigerXleopard") + /// .rsplitn(3, 'X') + /// .collect(); + /// assert_eq!( + /// v, + /// [ + /// JavaStr::from_str("leopard"), + /// JavaStr::from_str("tiger"), + /// JavaStr::from_str("lionX") + /// ] + /// ); + /// + /// let v: Vec<&JavaStr> = JavaStr::from_str("lion::tiger::leopard") + /// .rsplitn(2, "::") + /// .collect(); + /// assert_eq!( + /// v, + /// [ + /// JavaStr::from_str("leopard"), + /// JavaStr::from_str("lion::tiger") + /// ] + /// ); + /// ``` + #[inline] + pub fn rsplitn

(&self, n: usize, pat: P) -> RSplitN

+ where + P: JavaStrPattern, + { + RSplitN::new(self, pat, n) + } + + /// See [`str::split`]. + /// + /// ``` + /// # use java_string::{JavaCodePoint, JavaStr}; + /// let v: Vec<&JavaStr> = JavaStr::from_str("Mary had a little lamb") + /// .split(' ') + /// .collect(); + /// assert_eq!( + /// v, + /// [ + /// JavaStr::from_str("Mary"), + /// JavaStr::from_str("had"), + /// JavaStr::from_str("a"), + /// JavaStr::from_str("little"), + /// JavaStr::from_str("lamb") + /// ] + /// ); + /// + /// let v: Vec<&JavaStr> = JavaStr::from_str("").split('X').collect(); + /// assert_eq!(v, [JavaStr::from_str("")]); + /// + /// let v: Vec<&JavaStr> = JavaStr::from_str("lionXXtigerXleopard") + /// .split('X') + /// .collect(); + /// assert_eq!( + /// v, + /// [ + /// JavaStr::from_str("lion"), + /// JavaStr::from_str(""), + /// JavaStr::from_str("tiger"), + /// JavaStr::from_str("leopard") + /// ] + /// ); + /// + /// let v: Vec<&JavaStr> = JavaStr::from_str("lion::tiger::leopard") + /// .split("::") + /// .collect(); + /// assert_eq!( + /// v, + /// [ + /// JavaStr::from_str("lion"), + /// JavaStr::from_str("tiger"), + /// JavaStr::from_str("leopard") + /// ] + /// ); + /// + /// let v: Vec<&JavaStr> = JavaStr::from_str("abc1def2ghi") + /// .split(JavaCodePoint::is_numeric) + /// .collect(); + /// assert_eq!( + /// v, + /// [ + /// JavaStr::from_str("abc"), + /// JavaStr::from_str("def"), + /// JavaStr::from_str("ghi") + /// ] + /// ); + /// + /// let v: Vec<&JavaStr> = JavaStr::from_str("lionXtigerXleopard") + /// .split(JavaCodePoint::is_uppercase) + /// .collect(); + /// assert_eq!( + /// v, + /// [ + /// JavaStr::from_str("lion"), + /// JavaStr::from_str("tiger"), + /// JavaStr::from_str("leopard") + /// ] + /// ); + /// ``` + #[inline] + pub fn split

(&self, pat: P) -> Split

+ where + P: JavaStrPattern, + { + Split::new(self, pat) + } + + /// See [`str::split_ascii_whitespace`]. + /// + /// ``` + /// # use java_string::JavaStr; + /// let mut iter = JavaStr::from_str(" Mary had\ta little \n\t lamb").split_ascii_whitespace(); + /// assert_eq!(Some(JavaStr::from_str("Mary")), iter.next()); + /// assert_eq!(Some(JavaStr::from_str("had")), iter.next()); + /// assert_eq!(Some(JavaStr::from_str("a")), iter.next()); + /// assert_eq!(Some(JavaStr::from_str("little")), iter.next()); + /// assert_eq!(Some(JavaStr::from_str("lamb")), iter.next()); + /// + /// assert_eq!(None, iter.next()); + /// ``` + #[inline] + pub fn split_ascii_whitespace(&self) -> SplitAsciiWhitespace<'_> { + #[inline] + fn is_non_empty(bytes: &&[u8]) -> bool { + !bytes.is_empty() + } + + SplitAsciiWhitespace { + inner: self + .as_bytes() + .split(u8::is_ascii_whitespace as fn(&u8) -> bool) + .filter(is_non_empty as fn(&&[u8]) -> bool) + .map(|bytes| unsafe { JavaStr::from_semi_utf8_unchecked(bytes) }), + } + } + + /// See [`str::split_at`]. + /// + /// ``` + /// # use java_string::JavaStr; + /// let s = JavaStr::from_str("Per Martin-Lƶf"); + /// + /// let (first, last) = s.split_at(3); + /// + /// assert_eq!("Per", first); + /// assert_eq!(" Martin-Lƶf", last); + /// ``` + /// ```should_panic + /// # use java_string::JavaStr; + /// let s = JavaStr::from_str("Per Martin-Lƶf"); + /// // Should panic + /// let _ = s.split_at(13); + /// ``` + #[inline] + #[must_use] + pub fn split_at(&self, mid: usize) -> (&JavaStr, &JavaStr) { + // is_char_boundary checks that the index is in [0, .len()] + if self.is_char_boundary(mid) { + // SAFETY: just checked that `mid` is on a char boundary. + unsafe { + ( + self.get_unchecked(0..mid), + self.get_unchecked(mid..self.len()), + ) + } + } else { + slice_error_fail(self, 0, mid) + } + } + + /// See [`str::split_at_mut`]. + /// + /// ``` + /// # use java_string::{JavaStr, JavaString}; + /// let mut s = JavaString::from("Per Martin-Lƶf"); + /// let s = s.as_mut_java_str(); + /// + /// let (first, last) = s.split_at_mut(3); + /// + /// assert_eq!("Per", first); + /// assert_eq!(" Martin-Lƶf", last); + /// ``` + /// ```should_panic + /// # use java_string::{JavaStr, JavaString}; + /// let mut s = JavaString::from("Per Martin-Lƶf"); + /// let s = s.as_mut_java_str(); + /// // Should panic + /// let _ = s.split_at(13); + /// ``` + #[inline] + #[must_use] + pub fn split_at_mut(&mut self, mid: usize) -> (&mut JavaStr, &mut JavaStr) { + // is_char_boundary checks that the index is in [0, .len()] + if self.is_char_boundary(mid) { + let len = self.len(); + let ptr = self.as_mut_ptr(); + // SAFETY: just checked that `mid` is on a char boundary. + unsafe { + ( + JavaStr::from_semi_utf8_unchecked_mut(slice::from_raw_parts_mut(ptr, mid)), + JavaStr::from_semi_utf8_unchecked_mut(slice::from_raw_parts_mut( + ptr.add(mid), + len - mid, + )), + ) + } + } else { + slice_error_fail(self, 0, mid) + } + } + + /// See [`str::split_inclusive`]. + /// + /// ``` + /// # use java_string::JavaStr; + /// let v: Vec<&JavaStr> = JavaStr::from_str("Mary had a little lamb\nlittle lamb\nlittle lamb.\n") + /// .split_inclusive('\n') + /// .collect(); + /// assert_eq!( + /// v, + /// [ + /// JavaStr::from_str("Mary had a little lamb\n"), + /// JavaStr::from_str("little lamb\n"), + /// JavaStr::from_str("little lamb.\n") + /// ] + /// ); + /// ``` + #[inline] + pub fn split_inclusive

(&self, pat: P) -> SplitInclusive

+ where + P: JavaStrPattern, + { + SplitInclusive::new(self, pat) + } + + /// See [`str::split_once`]. + /// + /// ``` + /// # use java_string::JavaStr; + /// assert_eq!(JavaStr::from_str("cfg").split_once('='), None); + /// assert_eq!( + /// JavaStr::from_str("cfg=").split_once('='), + /// Some((JavaStr::from_str("cfg"), JavaStr::from_str(""))) + /// ); + /// assert_eq!( + /// JavaStr::from_str("cfg=foo").split_once('='), + /// Some((JavaStr::from_str("cfg"), JavaStr::from_str("foo"))) + /// ); + /// assert_eq!( + /// JavaStr::from_str("cfg=foo=bar").split_once('='), + /// Some((JavaStr::from_str("cfg"), JavaStr::from_str("foo=bar"))) + /// ); + /// ``` + #[inline] + #[must_use] + pub fn split_once

(&self, mut delimiter: P) -> Option<(&JavaStr, &JavaStr)> + where + P: JavaStrPattern, + { + let (index, len) = delimiter.find_in(self)?; + // SAFETY: pattern is known to return valid indices. + unsafe { + Some(( + self.get_unchecked(..index), + self.get_unchecked(index + len..), + )) + } + } + + /// See [`str::split_terminator`]. + /// + /// ``` + /// # use java_string::JavaStr; + /// let v: Vec<&JavaStr> = JavaStr::from_str("A.B.").split_terminator('.').collect(); + /// assert_eq!(v, [JavaStr::from_str("A"), JavaStr::from_str("B")]); + /// + /// let v: Vec<&JavaStr> = JavaStr::from_str("A..B..").split_terminator(".").collect(); + /// assert_eq!( + /// v, + /// [ + /// JavaStr::from_str("A"), + /// JavaStr::from_str(""), + /// JavaStr::from_str("B"), + /// JavaStr::from_str("") + /// ] + /// ); + /// + /// let v: Vec<&JavaStr> = JavaStr::from_str("A.B:C.D") + /// .split_terminator(&['.', ':'][..]) + /// .collect(); + /// assert_eq!( + /// v, + /// [ + /// JavaStr::from_str("A"), + /// JavaStr::from_str("B"), + /// JavaStr::from_str("C"), + /// JavaStr::from_str("D") + /// ] + /// ); + /// ``` + #[inline] + pub fn split_terminator

(&self, pat: P) -> SplitTerminator

+ where + P: JavaStrPattern, + { + SplitTerminator::new(self, pat) + } + + /// See [`str::split_whitespace`]. + #[inline] + pub fn split_whitespace(&self) -> SplitWhitespace<'_> { + SplitWhitespace { + inner: self + .split(JavaCodePoint::is_whitespace as fn(JavaCodePoint) -> bool) + .filter(|str| !str.is_empty()), + } + } + + /// See [`str::splitn`]. + /// + /// ``` + /// # use java_string::JavaStr; + /// let v: Vec<&JavaStr> = JavaStr::from_str("Mary had a little lambda") + /// .splitn(3, ' ') + /// .collect(); + /// assert_eq!( + /// v, + /// [ + /// JavaStr::from_str("Mary"), + /// JavaStr::from_str("had"), + /// JavaStr::from_str("a little lambda") + /// ] + /// ); + /// + /// let v: Vec<&JavaStr> = JavaStr::from_str("lionXXtigerXleopard") + /// .splitn(3, "X") + /// .collect(); + /// assert_eq!( + /// v, + /// [ + /// JavaStr::from_str("lion"), + /// JavaStr::from_str(""), + /// JavaStr::from_str("tigerXleopard") + /// ] + /// ); + /// + /// let v: Vec<&JavaStr> = JavaStr::from_str("abcXdef").splitn(1, 'X').collect(); + /// assert_eq!(v, [JavaStr::from_str("abcXdef")]); + /// + /// let v: Vec<&JavaStr> = JavaStr::from_str("").splitn(1, 'X').collect(); + /// assert_eq!(v, [JavaStr::from_str("")]); + /// ``` + #[inline] + pub fn splitn

(&self, n: usize, pat: P) -> SplitN

+ where + P: JavaStrPattern, + { + SplitN::new(self, pat, n) + } + + /// See [`str::starts_with`]. + /// + /// ``` + /// # use java_string::JavaStr; + /// let bananas = JavaStr::from_str("bananas"); + /// + /// assert!(bananas.starts_with("bana")); + /// assert!(!bananas.starts_with("nana")); + /// ``` + #[inline] + #[must_use] + pub fn starts_with

(&self, mut pat: P) -> bool + where + P: JavaStrPattern, + { + pat.prefix_len_in(self).is_some() + } + + /// See [`str::strip_prefix`]. + /// + /// ``` + /// # use java_string::JavaStr; + /// assert_eq!( + /// JavaStr::from_str("foo:bar").strip_prefix("foo:"), + /// Some(JavaStr::from_str("bar")) + /// ); + /// assert_eq!(JavaStr::from_str("foo:bar").strip_prefix("bar"), None); + /// assert_eq!( + /// JavaStr::from_str("foofoo").strip_prefix("foo"), + /// Some(JavaStr::from_str("foo")) + /// ); + /// ``` + #[inline] + #[must_use] + pub fn strip_prefix

(&self, mut prefix: P) -> Option<&JavaStr> + where + P: JavaStrPattern, + { + let len = prefix.prefix_len_in(self)?; + // SAFETY: pattern is known to return valid indices. + unsafe { Some(self.get_unchecked(len..)) } + } + + /// See [`str::strip_suffix`]. + /// + /// ``` + /// # use java_string::JavaStr; + /// assert_eq!( + /// JavaStr::from_str("bar:foo").strip_suffix(":foo"), + /// Some(JavaStr::from_str("bar")) + /// ); + /// assert_eq!(JavaStr::from_str("bar:foo").strip_suffix("bar"), None); + /// assert_eq!( + /// JavaStr::from_str("foofoo").strip_suffix("foo"), + /// Some(JavaStr::from_str("foo")) + /// ); + /// ``` + #[inline] + #[must_use] + pub fn strip_suffix

(&self, mut suffix: P) -> Option<&JavaStr> + where + P: JavaStrPattern, + { + let len = suffix.suffix_len_in(self)?; + // SAFETY: pattern is known to return valid indices. + unsafe { Some(self.get_unchecked(..self.len() - len)) } + } + + /// See [`str::to_ascii_lowercase`]. + #[inline] + #[must_use] + pub fn to_ascii_lowercase(&self) -> JavaString { + let mut s = self.to_owned(); + s.make_ascii_lowercase(); + s + } + + /// See [`str::to_ascii_uppercase`]. + #[inline] + #[must_use] + pub fn to_ascii_uppercase(&self) -> JavaString { + let mut s = self.to_owned(); + s.make_ascii_uppercase(); + s + } + + /// See [`str::to_lowercase`]. + /// + /// ``` + /// # use java_string::{JavaCodePoint, JavaStr, JavaString}; + /// let s = JavaStr::from_str("HELLO"); + /// assert_eq!("hello", s.to_lowercase()); + /// + /// let odysseus = JavaStr::from_str("į½ˆĪ”Ī„Ī£Ī£Ī•ĪŽĪ£"); + /// assert_eq!("į½€Ī“Ļ…ĻƒĻƒĪµĻĻ‚", odysseus.to_lowercase()); + /// + /// let s = JavaString::from("Hello ") + /// + JavaString::from(JavaCodePoint::from_u32(0xd800).unwrap()).as_java_str() + /// + JavaStr::from_str(" World!"); + /// let expected = JavaString::from("hello ") + /// + JavaString::from(JavaCodePoint::from_u32(0xd800).unwrap()).as_java_str() + /// + JavaStr::from_str(" world!"); + /// assert_eq!(expected, s.to_lowercase()); + /// ``` + #[inline] + #[must_use] + pub fn to_lowercase(&self) -> JavaString { + self.transform_string(str::to_lowercase, |ch| ch) + } + + /// See [str::to_uppercase]. + /// + /// ``` + /// # use java_string::{JavaCodePoint, JavaStr, JavaString}; + /// let s = JavaStr::from_str("hello"); + /// assert_eq!("HELLO", s.to_uppercase()); + /// + /// let s = JavaStr::from_str("tschüß"); + /// assert_eq!("TSCHÜSS", s.to_uppercase()); + /// + /// let s = JavaString::from("Hello ") + /// + JavaString::from(JavaCodePoint::from_u32(0xd800).unwrap()).as_java_str() + /// + JavaStr::from_str(" World!"); + /// let expected = JavaString::from("HELLO ") + /// + JavaString::from(JavaCodePoint::from_u32(0xd800).unwrap()).as_java_str() + /// + JavaStr::from_str(" WORLD!"); + /// assert_eq!(expected, s.to_uppercase()); + /// ``` + #[inline] + #[must_use] + pub fn to_uppercase(&self) -> JavaString { + self.transform_string(str::to_uppercase, |ch| ch) + } + + /// See [str::trim]. + #[inline] + #[must_use] + pub fn trim(&self) -> &JavaStr { + self.trim_matches(|c: JavaCodePoint| c.is_whitespace()) + } + + /// See [str::trim_end]. + #[inline] + #[must_use] + pub fn trim_end(&self) -> &JavaStr { + self.trim_end_matches(|c: JavaCodePoint| c.is_whitespace()) + } + + /// See [str::trim_end_matches]. + /// + /// ``` + /// # use java_string::{JavaCodePoint, JavaStr}; + /// assert_eq!( + /// JavaStr::from_str("11foo1bar11").trim_end_matches('1'), + /// "11foo1bar" + /// ); + /// assert_eq!( + /// JavaStr::from_str("123foo1bar123").trim_end_matches(JavaCodePoint::is_numeric), + /// "123foo1bar" + /// ); + /// + /// let x: &[_] = &['1', '2']; + /// assert_eq!( + /// JavaStr::from_str("12foo1bar12").trim_end_matches(x), + /// "12foo1bar" + /// ); + /// ``` + #[inline] + #[must_use] + pub fn trim_end_matches

(&self, mut pat: P) -> &JavaStr + where + P: JavaStrPattern, + { + let mut str = self; + while let Some(suffix_len) = pat.suffix_len_in(str) { + if suffix_len == 0 { + break; + } + // SAFETY: pattern is known to return valid indices. + str = unsafe { str.get_unchecked(..str.len() - suffix_len) }; + } + str + } + + /// See [str::trim_matches]. + /// + /// ``` + /// # use java_string::{JavaCodePoint, JavaStr}; + /// assert_eq!( + /// JavaStr::from_str("11foo1bar11").trim_matches('1'), + /// "foo1bar" + /// ); + /// assert_eq!( + /// JavaStr::from_str("123foo1bar123").trim_matches(JavaCodePoint::is_numeric), + /// "foo1bar" + /// ); + /// + /// let x: &[_] = &['1', '2']; + /// assert_eq!(JavaStr::from_str("12foo1bar12").trim_matches(x), "foo1bar"); + /// ``` + #[inline] + #[must_use] + pub fn trim_matches

(&self, mut pat: P) -> &JavaStr + where + P: JavaStrPattern, + { + let mut str = self; + while let Some(prefix_len) = pat.prefix_len_in(str) { + if prefix_len == 0 { + break; + } + // SAFETY: pattern is known to return valid indices. + str = unsafe { str.get_unchecked(prefix_len..) }; + } + while let Some(suffix_len) = pat.suffix_len_in(str) { + if suffix_len == 0 { + break; + } + // SAFETY: pattern is known to return valid indices. + str = unsafe { str.get_unchecked(..str.len() - suffix_len) }; + } + str + } + + /// See [str::trim_start]. + #[inline] + #[must_use] + pub fn trim_start(&self) -> &JavaStr { + self.trim_start_matches(|c: JavaCodePoint| c.is_whitespace()) + } + + /// See [str::trim_start_matches]. + /// + /// ``` + /// # use java_string::{JavaCodePoint, JavaStr}; + /// assert_eq!( + /// JavaStr::from_str("11foo1bar11").trim_start_matches('1'), + /// "foo1bar11" + /// ); + /// assert_eq!( + /// JavaStr::from_str("123foo1bar123").trim_start_matches(JavaCodePoint::is_numeric), + /// "foo1bar123" + /// ); + /// + /// let x: &[_] = &['1', '2']; + /// assert_eq!( + /// JavaStr::from_str("12foo1bar12").trim_start_matches(x), + /// "foo1bar12" + /// ); + /// ``` + #[inline] + #[must_use] + pub fn trim_start_matches

(&self, mut pat: P) -> &JavaStr + where + P: JavaStrPattern, + { + let mut str = self; + while let Some(prefix_len) = pat.prefix_len_in(str) { + if prefix_len == 0 { + break; + } + // SAFETY: pattern is known to return valid indices. + str = unsafe { str.get_unchecked(prefix_len..) }; + } + str + } + + #[inline] + fn transform_string( + &self, + mut string_transformer: SF, + invalid_char_transformer: ICF, + ) -> JavaString + where + SF: FnMut(&str) -> String, + ICF: FnMut(&JavaStr) -> &JavaStr, + { + let bytes = self.as_bytes(); + match run_utf8_full_validation_from_semi(bytes) { + Ok(()) => JavaString::from(string_transformer(unsafe { + // SAFETY: validation succeeded + std::str::from_utf8_unchecked(bytes) + })), + Err(error) => { + self.transform_invalid_string(error, string_transformer, invalid_char_transformer) + } + } + } + + #[inline] + fn transform_invalid_string( + &self, + error: Utf8Error, + mut string_transformer: SF, + mut invalid_char_transformer: ICF, + ) -> JavaString + where + SF: FnMut(&str) -> String, + ICF: FnMut(&JavaStr) -> &JavaStr, + { + let bytes = self.as_bytes(); + let mut result = JavaString::from(string_transformer(unsafe { + // SAFETY: validation succeeded up to this index + std::str::from_utf8_unchecked(bytes.get_unchecked(..error.valid_up_to)) + })); + result.push_java_str(invalid_char_transformer(unsafe { + // SAFETY: any UTF-8 error in semi-valid UTF-8 is a 3 byte long sequence + // representing a surrogate code point. We're pushing that sequence now + JavaStr::from_semi_utf8_unchecked( + bytes.get_unchecked(error.valid_up_to..error.valid_up_to + 3), + ) + })); + let mut index = error.valid_up_to + 3; + loop { + let remainder = unsafe { bytes.get_unchecked(index..) }; + match run_utf8_full_validation_from_semi(remainder) { + Ok(()) => { + result.push_str(&string_transformer(unsafe { + // SAFETY: validation succeeded + std::str::from_utf8_unchecked(remainder) + })); + return result; + } + Err(error) => { + result.push_str(&string_transformer(unsafe { + // SAFETY: validation succeeded up to this index + std::str::from_utf8_unchecked( + bytes.get_unchecked(index..index + error.valid_up_to), + ) + })); + result.push_java_str(invalid_char_transformer(unsafe { + // SAFETY: see comment above + JavaStr::from_semi_utf8_unchecked(bytes.get_unchecked( + index + error.valid_up_to..index + error.valid_up_to + 3, + )) + })); + index += error.valid_up_to + 3; + } + } + } + } +} + +impl<'a> Add<&JavaStr> for Cow<'a, JavaStr> { + type Output = Cow<'a, JavaStr>; + + #[inline] + fn add(mut self, rhs: &JavaStr) -> Self::Output { + self += rhs; + self + } +} + +impl<'a> AddAssign<&JavaStr> for Cow<'a, JavaStr> { + #[inline] + fn add_assign(&mut self, rhs: &JavaStr) { + if !rhs.is_empty() { + match self { + Cow::Borrowed(lhs) => { + let mut result = lhs.to_owned(); + result.push_java_str(rhs); + *self = Cow::Owned(result); + } + Cow::Owned(lhs) => { + lhs.push_java_str(rhs); + } + } + } + } +} + +impl AsRef<[u8]> for JavaStr { + #[inline] + fn as_ref(&self) -> &[u8] { + self.as_bytes() + } +} + +impl AsRef for str { + #[inline] + fn as_ref(&self) -> &JavaStr { + JavaStr::from_str(self) + } +} + +impl AsRef for String { + #[inline] + fn as_ref(&self) -> &JavaStr { + JavaStr::from_str(self) + } +} + +impl AsRef for JavaStr { + #[inline] + fn as_ref(&self) -> &JavaStr { + self + } +} + +impl Clone for Box { + #[inline] + fn clone(&self) -> Self { + let buf: Box<[u8]> = self.as_bytes().into(); + unsafe { JavaStr::from_boxed_semi_utf8_unchecked(buf) } + } +} + +impl Debug for JavaStr { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.write_char('"')?; + let mut from = 0; + for (i, c) in self.char_indices() { + let esc = c.escape_debug_ext(EscapeDebugExtArgs { + escape_single_quote: false, + escape_double_quote: true, + }); + // If char needs escaping, flush backlog so far and write, else skip. + // Also handle invalid UTF-8 here + if esc.len() != 1 || c.as_char().is_none() { + unsafe { + // SAFETY: any invalid UTF-8 should have been caught by a previous iteration + f.write_str(self[from..i].as_str_unchecked())?; + } + for c in esc { + f.write_char(c)?; + } + from = i + c.len_utf8(); + } + } + unsafe { + // SAFETY: any invalid UTF-8 should have been caught by the loop above + f.write_str(self[from..].as_str_unchecked())?; + } + f.write_char('"') + } +} + +impl Default for &JavaStr { + #[inline] + fn default() -> Self { + JavaStr::from_str("") + } +} + +impl Default for Box { + #[inline] + fn default() -> Self { + JavaStr::from_boxed_str(Box::::default()) + } +} + +impl Display for JavaStr { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + Display::fmt(&self.as_str_lossy(), f) + } +} + +impl<'a> From<&'a JavaStr> for Cow<'a, JavaStr> { + #[inline] + fn from(value: &'a JavaStr) -> Self { + Cow::Borrowed(value) + } +} + +impl From<&JavaStr> for Arc { + #[inline] + fn from(value: &JavaStr) -> Self { + let arc = Arc::<[u8]>::from(value.as_bytes()); + unsafe { Arc::from_raw(Arc::into_raw(arc) as *const JavaStr) } + } +} + +impl From<&JavaStr> for Box { + #[inline] + fn from(value: &JavaStr) -> Self { + unsafe { JavaStr::from_boxed_semi_utf8_unchecked(Box::from(value.as_bytes())) } + } +} + +impl From<&JavaStr> for Rc { + #[inline] + fn from(value: &JavaStr) -> Self { + let rc = Rc::<[u8]>::from(value.as_bytes()); + unsafe { Rc::from_raw(Rc::into_raw(rc) as *const JavaStr) } + } +} + +impl From<&JavaStr> for Vec { + #[inline] + fn from(value: &JavaStr) -> Self { + From::from(value.as_bytes()) + } +} + +impl From> for Box { + #[inline] + fn from(value: Cow<'_, JavaStr>) -> Self { + match value { + Cow::Borrowed(s) => Box::from(s), + Cow::Owned(s) => Box::from(s), + } + } +} + +impl From for Box { + #[inline] + fn from(value: JavaString) -> Self { + value.into_boxed_str() + } +} + +impl<'a> From<&'a str> for &'a JavaStr { + #[inline] + fn from(value: &'a str) -> Self { + JavaStr::from_str(value) + } +} + +impl<'a> From<&'a String> for &'a JavaStr { + #[inline] + fn from(value: &'a String) -> Self { + JavaStr::from_str(value) + } +} + +impl Hash for JavaStr { + #[inline] + fn hash(&self, state: &mut H) { + state.write(self.as_bytes()); + state.write_u8(0xff); + } +} + +impl Index for JavaStr +where + I: JavaStrSliceIndex, +{ + type Output = JavaStr; + + #[inline] + fn index(&self, index: I) -> &Self::Output { + index.index(self) + } +} + +impl IndexMut for JavaStr +where + I: JavaStrSliceIndex, +{ + #[inline] + fn index_mut(&mut self, index: I) -> &mut Self::Output { + index.index_mut(self) + } +} + +impl<'a, 'b> PartialEq<&'b JavaStr> for Cow<'a, str> { + #[inline] + fn eq(&self, other: &&'b JavaStr) -> bool { + self == *other + } +} + +impl<'a, 'b> PartialEq<&'b JavaStr> for Cow<'a, JavaStr> { + #[inline] + fn eq(&self, other: &&'b JavaStr) -> bool { + self == *other + } +} + +impl<'a> PartialEq> for &JavaStr { + #[inline] + fn eq(&self, other: &Cow<'a, str>) -> bool { + *self == other + } +} + +impl<'a> PartialEq> for JavaStr { + #[inline] + fn eq(&self, other: &Cow<'a, str>) -> bool { + other == self + } +} + +impl<'a> PartialEq> for &JavaStr { + #[inline] + fn eq(&self, other: &Cow<'a, JavaStr>) -> bool { + *self == other + } +} + +impl<'a> PartialEq> for JavaStr { + #[inline] + fn eq(&self, other: &Cow<'a, JavaStr>) -> bool { + other == self + } +} + +impl PartialEq for &JavaStr { + #[inline] + fn eq(&self, other: &String) -> bool { + *self == other + } +} + +impl PartialEq for JavaStr { + #[inline] + fn eq(&self, other: &String) -> bool { + self == &other[..] + } +} + +impl PartialEq for String { + #[inline] + fn eq(&self, other: &JavaStr) -> bool { + &self[..] == other + } +} + +impl PartialEq for &JavaStr { + #[inline] + fn eq(&self, other: &JavaString) -> bool { + *self == other + } +} + +impl PartialEq for JavaStr { + #[inline] + fn eq(&self, other: &JavaString) -> bool { + self == other[..] + } +} + +impl<'a> PartialEq for Cow<'a, str> { + #[inline] + fn eq(&self, other: &JavaStr) -> bool { + match self { + Cow::Borrowed(this) => this == other, + Cow::Owned(this) => this == other, + } + } +} + +impl<'a> PartialEq for Cow<'a, JavaStr> { + #[inline] + fn eq(&self, other: &JavaStr) -> bool { + match self { + Cow::Borrowed(this) => this == other, + Cow::Owned(this) => this == other, + } + } +} + +impl PartialEq for str { + #[inline] + fn eq(&self, other: &JavaStr) -> bool { + JavaStr::from_str(self) == other + } +} + +impl PartialEq for &str { + #[inline] + fn eq(&self, other: &JavaStr) -> bool { + *self == other + } +} + +impl PartialEq for JavaStr { + #[inline] + fn eq(&self, other: &str) -> bool { + self == JavaStr::from_str(other) + } +} + +impl<'a> PartialEq<&'a str> for JavaStr { + #[inline] + fn eq(&self, other: &&'a str) -> bool { + self == *other + } +} + +impl PartialEq for &JavaStr { + #[inline] + fn eq(&self, other: &JavaStr) -> bool { + *self == other + } +} + +impl<'a> PartialEq<&'a JavaStr> for JavaStr { + #[inline] + fn eq(&self, other: &&'a JavaStr) -> bool { + self == *other + } +} + +impl ToOwned for JavaStr { + type Owned = JavaString; + + #[inline] + fn to_owned(&self) -> Self::Owned { + unsafe { JavaString::from_semi_utf8_unchecked(self.as_bytes().to_vec()) } + } +} + +mod private_slice_index { + use std::ops; + + pub trait Sealed {} + + impl Sealed for ops::Range {} + impl Sealed for ops::RangeTo {} + impl Sealed for ops::RangeFrom {} + impl Sealed for ops::RangeFull {} + impl Sealed for ops::RangeInclusive {} + impl Sealed for ops::RangeToInclusive {} +} + +/// # Safety +/// +/// Implementations' `check_bounds` method must properly check the bounds of the +/// slice, such that calling `get_unchecked` is not UB. +pub unsafe trait JavaStrSliceIndex: private_slice_index::Sealed + Sized { + fn check_bounds(&self, slice: &JavaStr) -> bool; + fn check_bounds_fail(self, slice: &JavaStr) -> !; + + /// # Safety + /// + /// - The input slice must be a valid pointer + /// - This index must not be out of bounds of the input slice + /// - The indices of this slice must point to char boundaries in the input + /// slice + unsafe fn get_unchecked(self, slice: *const JavaStr) -> *const JavaStr; + + /// # Safety + /// + /// - The input slice must be a valid pointer + /// - This index must not be out of bounds of the input slice + /// - The indices of this slice must point to char boundaries in the input + /// slice + unsafe fn get_unchecked_mut(self, slice: *mut JavaStr) -> *mut JavaStr; + + #[inline] + fn get(self, slice: &JavaStr) -> Option<&JavaStr> { + if self.check_bounds(slice) { + Some(unsafe { &*self.get_unchecked(slice) }) + } else { + None + } + } + + #[inline] + fn get_mut(self, slice: &mut JavaStr) -> Option<&mut JavaStr> { + if self.check_bounds(slice) { + Some(unsafe { &mut *self.get_unchecked_mut(slice) }) + } else { + None + } + } + + #[inline] + fn index(self, slice: &JavaStr) -> &JavaStr { + if self.check_bounds(slice) { + unsafe { &*self.get_unchecked(slice) } + } else { + self.check_bounds_fail(slice) + } + } + + #[inline] + fn index_mut(self, slice: &mut JavaStr) -> &mut JavaStr { + if self.check_bounds(slice) { + unsafe { &mut *self.get_unchecked_mut(slice) } + } else { + self.check_bounds_fail(slice) + } + } +} + +unsafe impl JavaStrSliceIndex for RangeFull { + #[inline] + fn check_bounds(&self, _slice: &JavaStr) -> bool { + true + } + + #[inline] + fn check_bounds_fail(self, _slice: &JavaStr) -> ! { + unreachable!() + } + + #[inline] + unsafe fn get_unchecked(self, slice: *const JavaStr) -> *const JavaStr { + slice + } + + #[inline] + unsafe fn get_unchecked_mut(self, slice: *mut JavaStr) -> *mut JavaStr { + slice + } +} + +unsafe impl JavaStrSliceIndex for Range { + #[inline] + fn check_bounds(&self, slice: &JavaStr) -> bool { + self.start <= self.end + && slice.is_char_boundary(self.start) + && slice.is_char_boundary(self.end) + } + + #[inline] + #[track_caller] + fn check_bounds_fail(self, slice: &JavaStr) -> ! { + slice_error_fail(slice, self.start, self.end) + } + + #[inline] + unsafe fn get_unchecked(self, slice: *const JavaStr) -> *const JavaStr { + let slice = slice as *const [u8]; + // SAFETY: the caller guarantees that `self` is in bounds of `slice` + // which satisfies all the conditions for `add`. + let ptr = unsafe { (slice as *const u8).add(self.start) }; + let len = self.end - self.start; + ptr::slice_from_raw_parts(ptr, len) as *const JavaStr + } + + #[inline] + unsafe fn get_unchecked_mut(self, slice: *mut JavaStr) -> *mut JavaStr { + let slice = slice as *mut [u8]; + // SAFETY: see comments for `get_unchecked`. + let ptr = unsafe { (slice as *mut u8).add(self.start) }; + let len = self.end - self.start; + ptr::slice_from_raw_parts_mut(ptr, len) as *mut JavaStr + } +} + +unsafe impl JavaStrSliceIndex for RangeTo { + #[inline] + fn check_bounds(&self, slice: &JavaStr) -> bool { + slice.is_char_boundary(self.end) + } + + #[inline] + #[track_caller] + fn check_bounds_fail(self, slice: &JavaStr) -> ! { + slice_error_fail(slice, 0, self.end) + } + + #[inline] + unsafe fn get_unchecked(self, slice: *const JavaStr) -> *const JavaStr { + unsafe { (0..self.end).get_unchecked(slice) } + } + + #[inline] + unsafe fn get_unchecked_mut(self, slice: *mut JavaStr) -> *mut JavaStr { + unsafe { (0..self.end).get_unchecked_mut(slice) } + } +} + +unsafe impl JavaStrSliceIndex for RangeFrom { + #[inline] + fn check_bounds(&self, slice: &JavaStr) -> bool { + slice.is_char_boundary(self.start) + } + + #[inline] + #[track_caller] + fn check_bounds_fail(self, slice: &JavaStr) -> ! { + slice_error_fail(slice, self.start, slice.len()) + } + + #[inline] + unsafe fn get_unchecked(self, slice: *const JavaStr) -> *const JavaStr { + let len = unsafe { (&*(slice as *const [u8])).len() }; + unsafe { (self.start..len).get_unchecked(slice) } + } + + #[inline] + unsafe fn get_unchecked_mut(self, slice: *mut JavaStr) -> *mut JavaStr { + let len = unsafe { (&*(slice as *mut [u8])).len() }; + unsafe { (self.start..len).get_unchecked_mut(slice) } + } +} + +#[inline] +fn into_slice_range(range: RangeInclusive) -> Range { + let exclusive_end = *range.end() + 1; + let start = match range.end_bound() { + Bound::Excluded(..) => exclusive_end, // excluded + Bound::Included(..) => *range.start(), + Bound::Unbounded => unreachable!(), + }; + start..exclusive_end +} + +unsafe impl JavaStrSliceIndex for RangeInclusive { + #[inline] + fn check_bounds(&self, slice: &JavaStr) -> bool { + *self.end() != usize::MAX && into_slice_range(self.clone()).check_bounds(slice) + } + + #[inline] + #[track_caller] + fn check_bounds_fail(self, slice: &JavaStr) -> ! { + if *self.end() == usize::MAX { + str_end_index_overflow_fail() + } else { + into_slice_range(self).check_bounds_fail(slice) + } + } + + #[inline] + unsafe fn get_unchecked(self, slice: *const JavaStr) -> *const JavaStr { + unsafe { into_slice_range(self).get_unchecked(slice) } + } + + #[inline] + unsafe fn get_unchecked_mut(self, slice: *mut JavaStr) -> *mut JavaStr { + unsafe { into_slice_range(self).get_unchecked_mut(slice) } + } +} + +unsafe impl JavaStrSliceIndex for RangeToInclusive { + #[inline] + fn check_bounds(&self, slice: &JavaStr) -> bool { + (0..=self.end).check_bounds(slice) + } + + #[inline] + fn check_bounds_fail(self, slice: &JavaStr) -> ! { + (0..=self.end).check_bounds_fail(slice) + } + + #[inline] + unsafe fn get_unchecked(self, slice: *const JavaStr) -> *const JavaStr { + unsafe { (0..=self.end).get_unchecked(slice) } + } + + #[inline] + unsafe fn get_unchecked_mut(self, slice: *mut JavaStr) -> *mut JavaStr { + unsafe { (0..=self.end).get_unchecked_mut(slice) } + } +} diff --git a/vendor/valence/crates/java_string/src/validations.rs b/vendor/valence/crates/java_string/src/validations.rs new file mode 100644 index 00000000..102783f5 --- /dev/null +++ b/vendor/valence/crates/java_string/src/validations.rs @@ -0,0 +1,369 @@ +use std::ops::{Bound, Range, RangeBounds, RangeTo}; + +use crate::{JavaStr, Utf8Error}; + +pub(crate) const TAG_CONT: u8 = 0b1000_0000; +pub(crate) const TAG_TWO_B: u8 = 0b1100_0000; +pub(crate) const TAG_THREE_B: u8 = 0b1110_0000; +pub(crate) const TAG_FOUR_B: u8 = 0b1111_0000; +pub(crate) const CONT_MASK: u8 = 0b0011_1111; + +#[inline] +const fn utf8_first_byte(byte: u8, width: u32) -> u32 { + (byte & (0x7f >> width)) as u32 +} + +#[inline] +const fn utf8_acc_cont_byte(ch: u32, byte: u8) -> u32 { + (ch << 6) | (byte & CONT_MASK) as u32 +} + +#[inline] +const fn utf8_is_cont_byte(byte: u8) -> bool { + (byte as i8) < -64 +} + +/// # Safety +/// +/// `bytes` must produce a semi-valid UTF-8 string +#[inline] +pub(crate) unsafe fn next_code_point<'a, I: Iterator>(bytes: &mut I) -> Option { + // Decode UTF-8 + let x = *bytes.next()?; + if x < 128 { + return Some(x as u32); + } + + // Multibyte case follows + // Decode from a byte combination out of: [[[x y] z] w] + // NOTE: Performance is sensitive to the exact formulation here + let init = utf8_first_byte(x, 2); + // SAFETY: `bytes` produces an UTF-8-like string, + // so the iterator must produce a value here. + let y = unsafe { *bytes.next().unwrap_unchecked() }; + let mut ch = utf8_acc_cont_byte(init, y); + if x >= 0xe0 { + // [[x y z] w] case + // 5th bit in 0xE0 .. 0xEF is always clear, so `init` is still valid + // SAFETY: `bytes` produces an UTF-8-like string, + // so the iterator must produce a value here. + let z = unsafe { *bytes.next().unwrap_unchecked() }; + let y_z = utf8_acc_cont_byte((y & CONT_MASK) as u32, z); + ch = init << 12 | y_z; + if x >= 0xf0 { + // [x y z w] case + // use only the lower 3 bits of `init` + // SAFETY: `bytes` produces an UTF-8-like string, + // so the iterator must produce a value here. + let w = unsafe { *bytes.next().unwrap_unchecked() }; + ch = (init & 7) << 18 | utf8_acc_cont_byte(y_z, w); + } + } + + Some(ch) +} + +/// # Safety +/// +/// `bytes` must produce a semi-valid UTF-8 string +#[inline] +pub(crate) unsafe fn next_code_point_reverse<'a, I: DoubleEndedIterator>( + bytes: &mut I, +) -> Option { + // Decode UTF-8 + let w = match *bytes.next_back()? { + next_byte if next_byte < 128 => return Some(next_byte as u32), + back_byte => back_byte, + }; + + // Multibyte case follows + // Decode from a byte combination out of: [x [y [z w]]] + let mut ch; + // SAFETY: `bytes` produces an UTF-8-like string, + // so the iterator must produce a value here. + let z = unsafe { *bytes.next_back().unwrap_unchecked() }; + ch = utf8_first_byte(z, 2); + if utf8_is_cont_byte(z) { + // SAFETY: `bytes` produces an UTF-8-like string, + // so the iterator must produce a value here. + let y = unsafe { *bytes.next_back().unwrap_unchecked() }; + ch = utf8_first_byte(y, 3); + if utf8_is_cont_byte(y) { + // SAFETY: `bytes` produces an UTF-8-like string, + // so the iterator must produce a value here. + let x = unsafe { *bytes.next_back().unwrap_unchecked() }; + ch = utf8_first_byte(x, 4); + ch = utf8_acc_cont_byte(ch, y); + } + ch = utf8_acc_cont_byte(ch, z); + } + ch = utf8_acc_cont_byte(ch, w); + + Some(ch) +} + +#[inline(always)] +pub(crate) fn run_utf8_semi_validation(v: &[u8]) -> Result<(), Utf8Error> { + let mut index = 0; + let len = v.len(); + + let usize_bytes = std::mem::size_of::(); + let ascii_block_size = 2 * usize_bytes; + let blocks_end = if len >= ascii_block_size { + len - ascii_block_size + 1 + } else { + 0 + }; + let align = v.as_ptr().align_offset(usize_bytes); + + while index < len { + let old_offset = index; + macro_rules! err { + ($error_len:expr) => { + return Err(Utf8Error { + valid_up_to: old_offset, + error_len: $error_len, + }) + }; + } + + macro_rules! next { + () => {{ + index += 1; + // we needed data, but there was none: error! + if index >= len { + err!(None) + } + v[index] + }}; + } + + let first = v[index]; + if first >= 128 { + let w = utf8_char_width(first); + // 2-byte encoding is for codepoints \u{0080} to \u{07ff} + // first C2 80 last DF BF + // 3-byte encoding is for codepoints \u{0800} to \u{ffff} + // first E0 A0 80 last EF BF BF + // INCLUDING surrogates codepoints \u{d800} to \u{dfff} + // ED A0 80 to ED BF BF + // 4-byte encoding is for codepoints \u{1000}0 to \u{10ff}ff + // first F0 90 80 80 last F4 8F BF BF + // + // Use the UTF-8 syntax from the RFC + // + // https://tools.ietf.org/html/rfc3629 + // UTF8-1 = %x00-7F + // UTF8-2 = %xC2-DF UTF8-tail + // UTF8-3 = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) / + // %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail ) + // UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) / + // %xF4 %x80-8F 2( UTF8-tail ) + match w { + 2 => { + if next!() as i8 >= -64 { + err!(Some(1)) + } + } + 3 => { + match (first, next!()) { + (0xe0, 0xa0..=0xbf) | (0xe1..=0xef, 0x80..=0xbf) => {} /* INCLUDING surrogate codepoints here */ + _ => err!(Some(1)), + } + if next!() as i8 >= -64 { + err!(Some(2)) + } + } + 4 => { + match (first, next!()) { + (0xf0, 0x90..=0xbf) | (0xf1..=0xf3, 0x80..=0xbf) | (0xf4, 0x80..=0x8f) => {} + _ => err!(Some(1)), + } + if next!() as i8 >= -64 { + err!(Some(2)) + } + if next!() as i8 >= -64 { + err!(Some(3)) + } + } + _ => err!(Some(1)), + } + index += 1; + } else { + // Ascii case, try to skip forward quickly. + // When the pointer is aligned, read 2 words of data per iteration + // until we find a word containing a non-ascii byte. + if align != usize::MAX && align.wrapping_sub(index) % usize_bytes == 0 { + let ptr = v.as_ptr(); + while index < blocks_end { + // SAFETY: since `align - index` and `ascii_block_size` are + // multiples of `usize_bytes`, `block = ptr.add(index)` is + // always aligned with a `usize` so it's safe to dereference + // both `block` and `block.add(1)`. + unsafe { + let block = ptr.add(index) as *const usize; + // break if there is a nonascii byte + let zu = contains_nonascii(*block); + let zv = contains_nonascii(*block.add(1)); + if zu || zv { + break; + } + } + index += ascii_block_size; + } + // step from the point where the wordwise loop stopped + while index < len && v[index] < 128 { + index += 1; + } + } else { + index += 1; + } + } + } + + Ok(()) +} + +#[inline(always)] +pub(crate) const fn run_utf8_full_validation_from_semi(v: &[u8]) -> Result<(), Utf8Error> { + // this function checks for surrogate codepoints, between \u{d800} to \u{dfff}, + // or ED A0 80 to ED BF BF of width 3 unicode chars. The valid range of width 3 + // characters is ED 80 80 to ED BF BF, so we need to check for an ED byte + // followed by a >=A0 byte. + let mut index = 0; + while index + 3 <= v.len() { + if v[index] == 0xed && v[index + 1] >= 0xa0 { + return Err(Utf8Error { + valid_up_to: index, + error_len: Some(1), + }); + } + index += 1; + } + + Ok(()) +} + +#[inline] +pub(crate) const fn utf8_char_width(first_byte: u8) -> usize { + const UTF8_CHAR_WIDTH: [u8; 256] = [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ]; + + UTF8_CHAR_WIDTH[first_byte as usize] as _ +} + +#[inline] +const fn contains_nonascii(x: usize) -> bool { + const NONASCII_MASK: usize = usize::from_ne_bytes([0x80; std::mem::size_of::()]); + (x & NONASCII_MASK) != 0 +} + +#[cold] +#[track_caller] +pub(crate) fn slice_error_fail(s: &JavaStr, begin: usize, end: usize) -> ! { + const MAX_DISPLAY_LENGTH: usize = 256; + let trunc_len = s.floor_char_boundary(MAX_DISPLAY_LENGTH); + let s_trunc = &s[..trunc_len]; + let ellipsis = if trunc_len < s.len() { "[...]" } else { "" }; + + // 1. out of bounds + if begin > s.len() || end > s.len() { + let oob_index = if begin > s.len() { begin } else { end }; + panic!("byte index {oob_index} is out of bounds of `{s_trunc}`{ellipsis}"); + } + + // 2. begin <= end + assert!( + begin <= end, + "begin <= end ({} <= {}) when slicing `{}`{}", + begin, + end, + s_trunc, + ellipsis + ); + + // 3. character boundary + let index = if !s.is_char_boundary(begin) { + begin + } else { + end + }; + // find the character + let char_start = s.floor_char_boundary(index); + // `char_start` must be less than len and a char boundary + let ch = s[char_start..].chars().next().unwrap(); + let char_range = char_start..char_start + ch.len_utf8(); + panic!( + "byte index {} is not a char boundary; it is inside {:?} (bytes {:?}) of `{}`{}", + index, ch, char_range, s_trunc, ellipsis + ); +} + +#[cold] +#[track_caller] +pub(crate) fn str_end_index_len_fail(index: usize, len: usize) -> ! { + panic!("range end index {index} out of range for JavaStr of length {len}"); +} + +#[cold] +#[track_caller] +pub(crate) fn str_index_order_fail(index: usize, end: usize) -> ! { + panic!("JavaStr index starts at {index} but ends at {end}"); +} + +#[cold] +#[track_caller] +pub(crate) fn str_start_index_overflow_fail() -> ! { + panic!("attempted to index JavaStr from after maximum usize"); +} + +#[cold] +#[track_caller] +pub(crate) fn str_end_index_overflow_fail() -> ! { + panic!("attempted to index JavaStr up to maximum usize") +} + +#[inline] +#[track_caller] +pub(crate) fn to_range_checked(range: R, bounds: RangeTo) -> Range +where + R: RangeBounds, +{ + let len = bounds.end; + + let start = range.start_bound(); + let start = match start { + Bound::Included(&start) => start, + Bound::Excluded(start) => start + .checked_add(1) + .unwrap_or_else(|| str_start_index_overflow_fail()), + Bound::Unbounded => 0, + }; + + let end: Bound<&usize> = range.end_bound(); + let end = match end { + Bound::Included(end) => end + .checked_add(1) + .unwrap_or_else(|| str_end_index_overflow_fail()), + Bound::Excluded(&end) => end, + Bound::Unbounded => len, + }; + + if start > end { + str_index_order_fail(start, end); + } + if end > len { + str_end_index_len_fail(end, len); + } + + Range { start, end } +} diff --git a/vendor/valence/crates/valence_advancement/Cargo.toml b/vendor/valence/crates/valence_advancement/Cargo.toml new file mode 100644 index 00000000..a74d009b --- /dev/null +++ b/vendor/valence/crates/valence_advancement/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "valence_advancement" +description = "Advancement support for Valence" +readme = "README.md" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[dependencies] +valence_server.workspace = true +bevy_app.workspace = true +bevy_ecs.workspace = true +bevy_hierarchy.workspace = true +derive_more.workspace = true +rustc-hash.workspace = true diff --git a/vendor/valence/crates/valence_advancement/README.md b/vendor/valence/crates/valence_advancement/README.md new file mode 100644 index 00000000..4aa5d3ab --- /dev/null +++ b/vendor/valence/crates/valence_advancement/README.md @@ -0,0 +1,7 @@ +# valence_advancement + +Everything related to Minecraft advancements. + +### Warning +- Each advancement should be scheduled to be sent to each unique client. +- Advancement identifier is not mutable and changing it can cause bugs. \ No newline at end of file diff --git a/vendor/valence/crates/valence_advancement/src/event.rs b/vendor/valence/crates/valence_advancement/src/event.rs new file mode 100644 index 00000000..7dfaf67f --- /dev/null +++ b/vendor/valence/crates/valence_advancement/src/event.rs @@ -0,0 +1,29 @@ +use bevy_ecs::prelude::*; +use valence_server::event_loop::PacketEvent; +use valence_server::protocol::packets::play::AdvancementTabC2s; +use valence_server::Ident; + +/// This event sends when the client changes or closes advancement's tab. +#[derive(Event, Clone, PartialEq, Eq, Debug)] +pub struct AdvancementTabChangeEvent { + pub client: Entity, + /// If None then the client has closed advancement's tabs. + pub opened_tab: Option, +} + +pub(crate) fn handle_advancement_tab_change( + mut packets: EventReader, + mut advancement_tab_change_events: EventWriter, +) { + for packet in packets.read() { + if let Some(pkt) = packet.decode::() { + advancement_tab_change_events.send(AdvancementTabChangeEvent { + client: packet.client, + opened_tab: match pkt { + AdvancementTabC2s::ClosedScreen => None, + AdvancementTabC2s::OpenedTab { tab_id } => Some(tab_id.into()), + }, + }) + } + } +} diff --git a/vendor/valence/crates/valence_advancement/src/lib.rs b/vendor/valence/crates/valence_advancement/src/lib.rs new file mode 100644 index 00000000..78521c6f --- /dev/null +++ b/vendor/valence/crates/valence_advancement/src/lib.rs @@ -0,0 +1,489 @@ +#![doc = include_str!("../README.md")] +#![allow(clippy::type_complexity)] + +pub mod event; + +use std::borrow::Cow; +use std::io::Write; +use std::time::{SystemTime, UNIX_EPOCH}; + +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use bevy_ecs::system::SystemParam; +pub use bevy_hierarchy; +use bevy_hierarchy::{Children, HierarchyPlugin, Parent}; +use derive_more::{Deref, DerefMut}; +use event::{handle_advancement_tab_change, AdvancementTabChangeEvent}; +use rustc_hash::FxHashMap; +use valence_server::client::{Client, FlushPacketsSet, SpawnClientsSet}; +use valence_server::protocol::packets::play::{ + advancement_update_s2c as packet, SelectAdvancementTabS2c, +}; +use valence_server::protocol::{ + anyhow, packet_id, Encode, Packet, PacketSide, PacketState, RawBytes, VarInt, WritePacket, +}; +use valence_server::{Ident, ItemStack, Text}; + +pub struct AdvancementPlugin; + +#[derive(SystemSet, Clone, Copy, Eq, PartialEq, Hash, Debug)] +pub struct WriteAdvancementPacketToClientsSet; + +#[derive(SystemSet, Clone, Copy, Eq, PartialEq, Hash, Debug)] +pub struct WriteAdvancementToCacheSet; + +impl Plugin for AdvancementPlugin { + fn build(&self, app: &mut bevy_app::App) { + app.add_plugins(HierarchyPlugin) + .configure_sets( + PostUpdate, + ( + WriteAdvancementPacketToClientsSet.before(FlushPacketsSet), + WriteAdvancementToCacheSet.before(WriteAdvancementPacketToClientsSet), + ), + ) + .add_event::() + .add_systems( + PreUpdate, + ( + add_advancement_update_component_to_new_clients.after(SpawnClientsSet), + handle_advancement_tab_change, + ), + ) + .add_systems( + PostUpdate, + ( + update_advancement_cached_bytes.in_set(WriteAdvancementToCacheSet), + send_advancement_update_packet.in_set(WriteAdvancementPacketToClientsSet), + ), + ); + } +} + +/// Components for advancement that are required +/// Optional components: +/// [AdvancementDisplay] +/// [Parent] - parent advancement +#[derive(Bundle)] +pub struct AdvancementBundle { + pub advancement: Advancement, + pub requirements: AdvancementRequirements, + pub cached_bytes: AdvancementCachedBytes, +} + +fn add_advancement_update_component_to_new_clients( + mut commands: Commands, + query: Query>, +) { + for client in query.iter() { + commands + .entity(client) + .insert(AdvancementClientUpdate::default()); + } +} + +#[derive(SystemParam, Debug)] +struct UpdateAdvancementCachedBytesQuery<'w, 's> { + advancement_id_query: Query<'w, 's, &'static Advancement>, + criteria_query: Query<'w, 's, &'static AdvancementCriteria>, +} + +impl<'w, 's> UpdateAdvancementCachedBytesQuery<'w, 's> { + fn write( + &self, + a_identifier: &Advancement, + a_requirements: &AdvancementRequirements, + a_display: Option<&AdvancementDisplay>, + a_children: Option<&Children>, + a_parent: Option<&Parent>, + w: impl Write, + ) -> anyhow::Result<()> { + let Self { + advancement_id_query, + criteria_query, + } = self; + + let mut pkt = packet::Advancement { + parent_id: None, + display_data: None, + criteria: vec![], + requirements: vec![], + sends_telemetry_data: false, + }; + + if let Some(a_parent) = a_parent { + let a_identifier = advancement_id_query.get(a_parent.get())?; + pkt.parent_id = Some(a_identifier.0.borrowed()); + } + + if let Some(a_display) = a_display { + pkt.display_data = Some(packet::AdvancementDisplay { + title: Cow::Borrowed(&a_display.title), + description: Cow::Borrowed(&a_display.description), + icon: &a_display.icon, + frame_type: VarInt(a_display.frame_type as _), + flags: a_display.flags(), + background_texture: a_display.background_texture.as_ref().map(|v| v.borrowed()), + x_coord: a_display.x_coord, + y_coord: a_display.y_coord, + }); + } + + if let Some(a_children) = a_children { + for a_child in a_children.iter() { + let Ok(c_identifier) = criteria_query.get(*a_child) else { + continue; + }; + pkt.criteria.push((c_identifier.0.borrowed(), ())); + } + } + + for requirements in a_requirements.0.iter() { + let mut requirements_p = vec![]; + for requirement in requirements { + let c_identifier = criteria_query.get(*requirement)?; + requirements_p.push(c_identifier.0.as_str()); + } + pkt.requirements.push(packet::AdvancementRequirements { + requirement: requirements_p, + }); + } + + (&a_identifier.0, pkt).encode(w) + } +} + +fn update_advancement_cached_bytes( + mut query: Query< + ( + &Advancement, + &AdvancementRequirements, + &mut AdvancementCachedBytes, + Option<&AdvancementDisplay>, + Option<&Children>, + Option<&Parent>, + ), + Or<( + Changed, + Changed, + Changed, + Changed, + )>, + >, + update_advancement_cached_bytes_query: UpdateAdvancementCachedBytesQuery, +) { + for (a_identifier, a_requirements, mut a_bytes, a_display, a_children, a_parent) in + query.iter_mut() + { + a_bytes.0.clear(); + update_advancement_cached_bytes_query + .write( + a_identifier, + a_requirements, + a_display, + a_children, + a_parent, + &mut a_bytes.0, + ) + .expect("Failed to write an advancement"); + } +} + +#[derive(SystemParam, Debug)] +#[allow(clippy::type_complexity)] +pub(crate) struct SingleAdvancementUpdateQuery<'w, 's> { + advancement_bytes_query: Query<'w, 's, &'static AdvancementCachedBytes>, + advancement_id_query: Query<'w, 's, &'static Advancement>, + criteria_query: Query<'w, 's, &'static AdvancementCriteria>, + parent_query: Query<'w, 's, &'static Parent>, +} + +#[derive(Debug)] +pub(crate) struct AdvancementUpdateEncodeS2c<'w, 's, 'a> { + client_update: AdvancementClientUpdate, + queries: &'a SingleAdvancementUpdateQuery<'w, 's>, +} + +impl<'w, 's, 'a> Encode for AdvancementUpdateEncodeS2c<'w, 's, 'a> { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + let SingleAdvancementUpdateQuery { + advancement_bytes_query, + advancement_id_query, + criteria_query, + parent_query, + } = self.queries; + + let AdvancementClientUpdate { + new_advancements, + remove_advancements, + progress, + force_tab_update: _, + reset, + } = &self.client_update; + + let mut pkt = packet::GenericAdvancementUpdateS2c { + reset: *reset, + advancement_mapping: vec![], + identifiers: vec![], + progress_mapping: vec![], + }; + + for new_advancement in new_advancements { + let a_cached_bytes = advancement_bytes_query.get(*new_advancement)?; + pkt.advancement_mapping + .push(RawBytes(a_cached_bytes.0.as_slice())); + } + + for remove_advancement in remove_advancements { + let a_identifier = advancement_id_query.get(*remove_advancement)?; + pkt.identifiers.push(a_identifier.0.borrowed()); + } + + let mut progress_mapping: FxHashMap)>> = + FxHashMap::default(); + for progress in progress { + let a = parent_query.get(progress.0)?; + progress_mapping + .entry(a.get()) + .and_modify(|v| v.push(*progress)) + .or_insert(vec![*progress]); + } + + for (a, c_progresses) in progress_mapping { + let a_identifier = advancement_id_query.get(a)?; + let mut c_progresses_p = vec![]; + for (c, c_progress) in c_progresses { + let c_identifier = criteria_query.get(c)?; + c_progresses_p.push(packet::AdvancementCriteria { + criterion_identifier: c_identifier.0.borrowed(), + criterion_progress: c_progress, + }); + } + pkt.progress_mapping + .push((a_identifier.0.borrowed(), c_progresses_p)); + } + + pkt.encode(w) + } +} + +impl<'w, 's, 'a> Packet for AdvancementUpdateEncodeS2c<'w, 's, 'a> { + const ID: i32 = packet_id::ADVANCEMENT_UPDATE_S2C; + const NAME: &'static str = "AdvancementUpdateEncodeS2c"; + const SIDE: PacketSide = PacketSide::Clientbound; + const STATE: PacketState = PacketState::Play; +} + +#[allow(clippy::type_complexity)] +fn send_advancement_update_packet( + mut client: Query<(&mut AdvancementClientUpdate, &mut Client)>, + update_single_query: SingleAdvancementUpdateQuery, +) { + for (mut advancement_client_update, mut client) in client.iter_mut() { + match advancement_client_update.force_tab_update { + ForceTabUpdate::None => {} + ForceTabUpdate::First => { + client.write_packet(&SelectAdvancementTabS2c { identifier: None }) + } + ForceTabUpdate::Spec(spec) => { + if let Ok(a_identifier) = update_single_query.advancement_id_query.get(spec) { + client.write_packet(&SelectAdvancementTabS2c { + identifier: Some(a_identifier.0.borrowed()), + }); + } + } + } + + if ForceTabUpdate::None != advancement_client_update.force_tab_update { + advancement_client_update.force_tab_update = ForceTabUpdate::None; + } + + if advancement_client_update.new_advancements.is_empty() + && advancement_client_update.progress.is_empty() + && advancement_client_update.remove_advancements.is_empty() + && !advancement_client_update.reset + { + continue; + } + + let advancement_client_update = std::mem::replace( + advancement_client_update.as_mut(), + AdvancementClientUpdate { + reset: false, + ..Default::default() + }, + ); + + client.write_packet(&AdvancementUpdateEncodeS2c { + queries: &update_single_query, + client_update: advancement_client_update, + }); + } +} + +/// Advancement's id. May not be updated. +#[derive(Component, Deref)] +pub struct Advancement(Ident); + +impl Advancement { + pub fn new(ident: Ident) -> Advancement { + Self(ident) + } + + pub fn get(&self) -> &Ident { + &self.0 + } +} + +#[derive(Clone, Copy)] +pub enum AdvancementFrameType { + Task, + Challenge, + Goal, +} + +/// Advancement display. Optional component +#[derive(Component)] +pub struct AdvancementDisplay { + pub title: Text, + pub description: Text, + pub icon: ItemStack, + pub frame_type: AdvancementFrameType, + pub show_toast: bool, + pub hidden: bool, + pub background_texture: Option, + pub x_coord: f32, + pub y_coord: f32, +} + +impl AdvancementDisplay { + pub(crate) fn flags(&self) -> i32 { + let mut flags = 0; + flags |= self.background_texture.is_some() as i32; + flags |= (self.show_toast as i32) << 1; + flags |= (self.hidden as i32) << 2; + flags + } +} + +/// Criteria's identifier. May not be updated +#[derive(Component, Deref)] +pub struct AdvancementCriteria(Ident); + +impl AdvancementCriteria { + pub fn new(ident: Ident) -> Self { + Self(ident) + } + + pub fn get(&self) -> &Ident { + &self.0 + } +} + +/// Requirements for advancement to be completed. +/// All columns should be completed, column is completed when any of criteria in +/// this column is completed. +#[derive(Component, Default, Deref, DerefMut)] +pub struct AdvancementRequirements(pub Vec>); + +#[derive(Component, Default)] +pub struct AdvancementCachedBytes(pub(crate) Vec); + +#[derive(Default, Debug, PartialEq)] +pub enum ForceTabUpdate { + #[default] + None, + First, + /// Should contain only root advancement otherwise the first will be chosen + Spec(Entity), +} + +#[derive(Component, Debug)] +pub struct AdvancementClientUpdate { + /// Which advancement's descriptions send to client + pub new_advancements: Vec, + /// Which advancements remove from client + pub remove_advancements: Vec, + /// Criteria progress update. + /// If None then criteria is not done otherwise it is done + pub progress: Vec<(Entity, Option)>, + /// Forces client to open a tab + pub force_tab_update: ForceTabUpdate, + /// Defines if other advancements should be removed. + /// Also with this flag, client will not show a toast for advancements, + /// which are completed. When the packet is sent, turns to false + pub reset: bool, +} + +impl Default for AdvancementClientUpdate { + fn default() -> Self { + Self { + new_advancements: vec![], + remove_advancements: vec![], + progress: vec![], + force_tab_update: ForceTabUpdate::default(), + reset: true, + } + } +} + +impl AdvancementClientUpdate { + pub(crate) fn walk_advancements( + root: Entity, + children_query: &Query<&Children>, + advancement_check_query: &Query<(), With>, + func: &mut impl FnMut(Entity), + ) { + func(root); + if let Ok(children) = children_query.get(root) { + for child in children.iter() { + let child = *child; + if advancement_check_query.get(child).is_ok() { + Self::walk_advancements(child, children_query, advancement_check_query, func); + } + } + } + } + + /// Sends all advancements from the root + pub fn send_advancements( + &mut self, + root: Entity, + children_query: &Query<&Children>, + advancement_check_query: &Query<(), With>, + ) { + Self::walk_advancements(root, children_query, advancement_check_query, &mut |e| { + self.new_advancements.push(e) + }); + } + + /// Removes all advancements from the root + pub fn remove_advancements( + &mut self, + root: Entity, + children_query: &Query<&Children>, + advancement_check_query: &Query<(), With>, + ) { + Self::walk_advancements(root, children_query, advancement_check_query, &mut |e| { + self.remove_advancements.push(e) + }); + } + + /// Marks criteria as done + pub fn criteria_done(&mut self, criteria: Entity) { + self.progress.push(( + criteria, + Some( + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_millis() as i64, + ), + )) + } + + /// Marks criteria as undone + pub fn criteria_undone(&mut self, criteria: Entity) { + self.progress.push((criteria, None)) + } +} diff --git a/vendor/valence/crates/valence_anvil/Cargo.toml b/vendor/valence/crates/valence_anvil/Cargo.toml new file mode 100644 index 00000000..8d8abd24 --- /dev/null +++ b/vendor/valence/crates/valence_anvil/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "valence_anvil" +description = "Anvil file format support for Valence" +readme = "README.md" +keywords = ["anvil", "minecraft", "deserialization"] +version = "0.1.0" +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[features] +bevy_plugin = ["dep:bevy_app", "dep:bevy_ecs", "dep:flume", "parsing"] +parsing = ["dep:valence_server"] + +[dependencies] +bevy_app = { workspace = true, optional = true } +bevy_ecs = { workspace = true, optional = true } +bitfield-struct.workspace = true +bitvec.workspace = true +byteorder.workspace = true +flate2.workspace = true +flume = { workspace = true, optional = true } +lru.workspace = true +thiserror.workspace = true +valence_bytes.workspace = true +valence_nbt = { workspace = true, features = ["binary"] } +valence_server = { workspace = true, optional = true } diff --git a/vendor/valence/crates/valence_anvil/README.md b/vendor/valence/crates/valence_anvil/README.md new file mode 100644 index 00000000..21c9a515 --- /dev/null +++ b/vendor/valence/crates/valence_anvil/README.md @@ -0,0 +1,3 @@ +# valence_anvil + +Support for Minecraft's [anvil file format](https://minecraft.wiki/w/Anvil_file_format). diff --git a/vendor/valence/crates/valence_anvil/src/bevy.rs b/vendor/valence/crates/valence_anvil/src/bevy.rs new file mode 100644 index 00000000..97b4fea6 --- /dev/null +++ b/vendor/valence/crates/valence_anvil/src/bevy.rs @@ -0,0 +1,270 @@ +use std::collections::hash_map::Entry; +use std::collections::{HashMap, HashSet}; +use std::path::PathBuf; +use std::thread; + +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use flume::{Receiver, Sender}; +use valence_server::client::{Client, OldView, View}; +use valence_server::entity::{EntityLayerId, OldEntityLayerId}; +use valence_server::layer::UpdateLayersPreClientSet; +use valence_server::protocol::anyhow; +use valence_server::registry::BiomeRegistry; +use valence_server::{ChunkLayer, ChunkPos}; + +use crate::parsing::{DimensionFolder, ParsedChunk}; + +type WorkerResult = anyhow::Result>; + +/// The order in which chunks should be processed by the anvil worker. Smaller +/// values are sent first. +type Priority = u64; + +#[derive(Component, Debug)] +pub struct AnvilLevel { + /// Chunk worker state to be moved to another thread. + worker_state: Option, + /// The set of chunk positions that should not be loaded or unloaded by + /// the anvil system. + /// + /// This set is empty by default, but you can modify it at any time. + pub ignored_chunks: HashSet, + /// Chunks that need to be loaded. Chunks with `None` priority have already + /// been sent to the anvil thread. + pending: HashMap>, + /// Sender for the chunk worker thread. + sender: Sender, + /// Receiver for the chunk worker thread. + receiver: Receiver<(ChunkPos, WorkerResult)>, +} + +impl AnvilLevel { + pub fn new(world_root: impl Into, biomes: &BiomeRegistry) -> Self { + let (pending_sender, pending_receiver) = flume::unbounded(); + let (finished_sender, finished_receiver) = flume::bounded(4096); + + Self { + worker_state: Some(ChunkWorkerState { + dimension_folder: DimensionFolder::new(world_root, biomes), + sender: finished_sender, + receiver: pending_receiver, + }), + ignored_chunks: HashSet::new(), + pending: HashMap::new(), + sender: pending_sender, + receiver: finished_receiver, + } + } + + /// Forces a chunk to be loaded at a specific position in this world. This + /// will bypass [`AnvilLevel::ignored_chunks`]. + /// Note that the chunk will be unloaded next tick unless it has been added + /// to [`AnvilLevel::ignored_chunks`] or it is in view of a client. + /// + /// This has no effect if a chunk at the position is already present. + pub fn force_chunk_load(&mut self, pos: ChunkPos) { + match self.pending.entry(pos) { + Entry::Occupied(oe) => { + // If the chunk is already scheduled to load but hasn't been sent to the chunk + // worker yet, then give it the highest priority. + if let Some(priority) = oe.into_mut() { + *priority = 0; + } + } + Entry::Vacant(ve) => { + ve.insert(Some(0)); + } + } + } +} + +#[derive(Debug)] +struct ChunkWorkerState { + /// The world folder containing the region folder where chunks are loaded + /// from. + dimension_folder: DimensionFolder, + /// Sender of finished chunks. + sender: Sender<(ChunkPos, WorkerResult)>, + /// Receiver of pending chunks. + receiver: Receiver, +} + +pub struct AnvilPlugin; + +impl Plugin for AnvilPlugin { + fn build(&self, app: &mut App) { + app.add_event::() + .add_event::() + .add_systems(PreUpdate, remove_unviewed_chunks) + .add_systems( + PostUpdate, + (init_anvil, update_client_views, send_recv_chunks) + .chain() + .before(UpdateLayersPreClientSet), + ); + } +} + +fn init_anvil(mut query: Query<&mut AnvilLevel, (Added, With)>) { + for mut level in &mut query { + if let Some(state) = level.worker_state.take() { + thread::spawn(move || anvil_worker(state)); + } + } +} + +/// Removes all chunks no longer viewed by clients. +/// +/// This needs to run in `PreUpdate` where the chunk viewer counts have been +/// updated from the previous tick. +fn remove_unviewed_chunks( + mut chunk_layers: Query<(Entity, &mut ChunkLayer, &AnvilLevel)>, + mut unload_events: EventWriter, +) { + for (entity, mut layer, anvil) in &mut chunk_layers { + layer.retain_chunks(|pos, chunk| { + if chunk.viewer_count_mut() > 0 || anvil.ignored_chunks.contains(&pos) { + true + } else { + unload_events.send(ChunkUnloadEvent { + chunk_layer: entity, + pos, + }); + false + } + }); + } +} + +fn update_client_views( + clients: Query<(&EntityLayerId, Ref, View, OldView), With>, + mut chunk_layers: Query<(&ChunkLayer, &mut AnvilLevel)>, +) { + for (loc, old_loc, view, old_view) in &clients { + let view = view.get(); + let old_view = old_view.get(); + + if loc != &*old_loc || view != old_view || old_loc.is_added() { + let Ok((layer, mut anvil)) = chunk_layers.get_mut(loc.0) else { + continue; + }; + + let queue_pos = |pos| { + if !anvil.ignored_chunks.contains(&pos) && layer.chunk(pos).is_none() { + // Chunks closer to clients are prioritized. + match anvil.pending.entry(pos) { + Entry::Occupied(mut oe) => { + if let Some(priority) = oe.get_mut() { + let dist = view.pos.distance_squared(pos); + *priority = (*priority).min(dist); + } + } + Entry::Vacant(ve) => { + let dist = view.pos.distance_squared(pos); + ve.insert(Some(dist)); + } + } + } + }; + + // Queue all the new chunks in the view to be sent to the anvil worker. + if old_loc.is_added() { + view.iter().for_each(queue_pos); + } else { + view.diff(old_view).for_each(queue_pos); + } + } + } +} + +fn send_recv_chunks( + mut layers: Query<(Entity, &mut ChunkLayer, &mut AnvilLevel)>, + mut to_send: Local>, + mut load_events: EventWriter, +) { + for (entity, mut layer, anvil) in &mut layers { + let anvil = anvil.into_inner(); + + // Insert the chunks that are finished loading into the chunk layer and send + // load events. + for (pos, res) in anvil.receiver.drain() { + anvil.pending.remove(&pos); + + let status = match res { + Ok(Some(ParsedChunk { chunk, timestamp })) => { + layer.insert_chunk(pos, chunk); + ChunkLoadStatus::Success { timestamp } + } + Ok(None) => ChunkLoadStatus::Empty, + Err(e) => ChunkLoadStatus::Failed(e), + }; + + load_events.send(ChunkLoadEvent { + chunk_layer: entity, + pos, + status, + }); + } + + // Collect all the new chunks that need to be loaded this tick. + for (pos, priority) in &mut anvil.pending { + if let Some(pri) = priority.take() { + to_send.push((pri, *pos)); + } + } + + // Sort chunks by ascending priority. + to_send.sort_unstable_by_key(|(pri, _)| *pri); + + // Send the sorted chunks to be loaded. + for (_, pos) in to_send.drain(..) { + let _ = anvil.sender.try_send(pos); + } + } +} + +fn anvil_worker(mut state: ChunkWorkerState) { + while let Ok(pos) = state.receiver.recv() { + let res = state + .dimension_folder + .get_chunk(pos) + .map_err(anyhow::Error::from); + + let _ = state.sender.send((pos, res)); + } +} + +/// An event sent by `valence_anvil` after an attempt to load a chunk is made. +#[derive(Event, Debug)] +pub struct ChunkLoadEvent { + /// The [`ChunkLayer`] where the chunk is located. + pub chunk_layer: Entity, + /// The position of the chunk in the layer. + pub pos: ChunkPos, + pub status: ChunkLoadStatus, +} + +#[derive(Debug)] +pub enum ChunkLoadStatus { + /// A new chunk was successfully loaded and inserted into the layer. + Success { + /// The time this chunk was last modified, measured in seconds since the + /// epoch. + timestamp: u32, + }, + /// The Anvil level does not have a chunk at the position. No chunk was + /// loaded. + Empty, + /// An attempt was made to load the chunk, but something went wrong. + Failed(anyhow::Error), +} + +/// An event sent by `valence_anvil` when a chunk is unloaded from an layer. +#[derive(Event, Debug)] +pub struct ChunkUnloadEvent { + /// The [`ChunkLayer`] where the chunk was unloaded. + pub chunk_layer: Entity, + /// The position of the chunk that was unloaded. + pub pos: ChunkPos, +} diff --git a/vendor/valence/crates/valence_anvil/src/lib.rs b/vendor/valence/crates/valence_anvil/src/lib.rs new file mode 100644 index 00000000..b50507c4 --- /dev/null +++ b/vendor/valence/crates/valence_anvil/src/lib.rs @@ -0,0 +1,760 @@ +#![doc = include_str!("../README.md")] +#![deny( + rustdoc::broken_intra_doc_links, + rustdoc::private_intra_doc_links, + rustdoc::missing_crate_level_docs, + rustdoc::invalid_codeblock_attributes, + rustdoc::invalid_rust_codeblocks, + rustdoc::bare_urls, + rustdoc::invalid_html_tags +)] +#![warn( + trivial_casts, + trivial_numeric_casts, + unused_lifetimes, + unused_import_braces, + unreachable_pub, + clippy::dbg_macro +)] + +use std::fs::{DirEntry, File}; +use std::hash::Hash; +use std::io::{Cursor, ErrorKind, Read, Seek, SeekFrom, Write}; +use std::num::NonZeroUsize; +use std::path::{Path, PathBuf}; +use std::time::{SystemTime, UNIX_EPOCH}; + +#[cfg(feature = "bevy_plugin")] +pub use bevy::*; +use bitfield_struct::bitfield; +use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt}; +use flate2::bufread::{GzDecoder, ZlibDecoder}; +use flate2::write::{GzEncoder, ZlibEncoder}; +use lru::LruCache; +use thiserror::Error; +use valence_nbt::binary::{FromModifiedUtf8, ToModifiedUtf8}; +use valence_nbt::Compound; + +#[cfg(feature = "bevy_plugin")] +mod bevy; +#[cfg(feature = "parsing")] +pub mod parsing; + +const LRU_CACHE_SIZE: NonZeroUsize = match NonZeroUsize::new(256) { + Some(n) => n, + None => unreachable!(), +}; + +#[derive(Debug, Error)] +#[non_exhaustive] +pub enum RegionError { + #[error("an I/O error occurred: {0}")] + Io(#[from] std::io::Error), + #[error("failed to convert OsString")] + OsStringConv, + #[error("chunk is allocated, but stream is missing")] + MissingChunkStream, + #[error("invalid chunk sector offset")] + InvalidChunkSectorOffset, + #[error("invalid chunk size")] + InvalidChunkSize, + #[error("invalid compression scheme number of {0}")] + InvalidCompressionScheme(u8), + #[error("failed to parse NBT: {0}")] + Nbt(#[from] valence_nbt::binary::Error), + #[error("not all chunk NBT data was read")] + TrailingNbtData, + #[error("oversized chunk")] + OversizedChunk, +} + +#[derive(Copy, Clone, Debug, Default, PartialEq, Eq, Hash)] +#[repr(u8)] +#[non_exhaustive] +pub enum Compression { + Gzip = 1, + #[default] + Zlib = 2, + None = 3, +} + +impl Compression { + fn from_u8(compression: u8) -> Option { + match compression { + 1 => Some(Compression::Gzip), + 2 => Some(Compression::Zlib), + 3 => Some(Compression::None), + _ => None, + } + } +} + +#[derive(Copy, Clone, Debug, Default)] +#[non_exhaustive] +pub struct WriteOptions { + /// Set the compression method used to write chunks. This can be useful to + /// change in order to write anvil files compatible with older Minecraft + /// versions. + pub compression: Compression, + + /// Set whether to skip writing oversized chunks (>1MiB after compression). + /// Versions older than 1.15 (19w36a) cannot read oversized chunks, so this + /// may be useful for writing region files compatible with those + /// versions. + pub skip_oversized_chunks: bool, +} + +#[derive(Debug)] +pub struct RegionFolder { + /// Region files. An LRU cache is used to limit the number of open file + /// handles. + regions: LruCache, + /// Path to the directory containing the region files and chunk files. + region_root: PathBuf, + /// Scratch buffer for (de)compression. + compression_buf: Vec, + /// Options to use for writing the chunk. + pub write_options: WriteOptions, +} + +impl RegionFolder { + pub fn new(region_root: impl Into) -> Self { + Self { + regions: LruCache::new(LRU_CACHE_SIZE), + region_root: region_root.into(), + compression_buf: Vec::new(), + write_options: WriteOptions::default(), + } + } + + fn region<'a>( + regions: &'a mut LruCache, + region_root: &Path, + region_x: i32, + region_z: i32, + ) -> Result, RegionError> { + // Need to double get the entry from the cache to make the borrow checker happy. + // Polonius will fix this eventually. + if regions.get_mut(&(region_x, region_z)).is_some() { + match regions.get_mut(&(region_x, region_z)) { + Some(RegionEntry::Occupied(region)) => return Ok(Some(region)), + Some(RegionEntry::Vacant) => return Ok(None), + None => unreachable!(), + } + } + + let path = region_root.join(format!("r.{region_x}.{region_z}.mca")); + + let file = match File::options().read(true).write(true).open(path) { + Ok(file) => file, + Err(e) if e.kind() == ErrorKind::NotFound => { + regions.put((region_x, region_z), RegionEntry::Vacant); + return Ok(None); + } + Err(e) => return Err(e.into()), + }; + + // TODO: this is ugly. + // TODO: try_get_or_insert_mut + regions.try_get_or_insert((region_x, region_z), || { + Region::open(file).map(|region| RegionEntry::Occupied(Box::new(region))) + })?; + let Some(RegionEntry::Occupied(res)) = regions.get_mut(&(region_x, region_z)) else { + unreachable!() + }; + Ok(Some(res)) + } + + /// Gets the raw chunk at the given chunk position. + /// + /// Returns `Ok(Some(chunk))` if the chunk exists and no errors occurred + /// loading it. Returns `Ok(None)` if the chunk does not exist and no + /// errors occurred attempting to load it. Returns `Err(_)` if an error + /// occurred attempting to load the chunk. + pub fn get_chunk( + &mut self, + pos_x: i32, + pos_z: i32, + ) -> Result>, RegionError> + where + S: for<'a> FromModifiedUtf8<'a> + Hash + Ord, + { + let region_x = pos_x.div_euclid(32); + let region_z = pos_z.div_euclid(32); + + let Some(region) = Self::region(&mut self.regions, &self.region_root, region_x, region_z)? + else { + return Ok(None); + }; + + region.get_chunk(pos_x, pos_z, &mut self.compression_buf, &self.region_root) + } + + /// Deletes the chunk at the given chunk position, returning whether the + /// chunk existed before it was deleted. + /// + /// Note that this only marks the chunk as deleted so that it cannot be + /// retrieved, and can be overwritten by other chunks later. It does not + /// decrease the size of the region file. + pub fn delete_chunk(&mut self, pos_x: i32, pos_z: i32) -> Result { + let region_x = pos_x.div_euclid(32); + let region_z = pos_z.div_euclid(32); + + let Some(region) = Self::region(&mut self.regions, &self.region_root, region_x, region_z)? + else { + return Ok(false); + }; + + region.delete_chunk(pos_x, pos_z, true, &self.region_root) + } + + /// Sets the raw chunk at the given position, overwriting the old chunk if + /// it exists. + pub fn set_chunk( + &mut self, + pos_x: i32, + pos_z: i32, + chunk: &Compound, + ) -> Result<(), RegionError> + where + S: ToModifiedUtf8 + Hash + Ord, + { + let region_x = pos_x.div_euclid(32); + let region_z = pos_z.div_euclid(32); + + let region = match Self::region(&mut self.regions, &self.region_root, region_x, region_z)? { + Some(region) => region, + None => { + let path = self + .region_root + .join(format!("r.{region_x}.{region_z}.mca")); + + let file = File::options() + .read(true) + .write(true) + .create(true) + .open(path)?; + + // TODO: try_get_or_insert_mut + self.regions.put( + (region_x, region_z), + RegionEntry::Occupied(Box::new(Region::create(file)?)), + ); + let Some(RegionEntry::Occupied(region)) = + self.regions.get_mut(&(region_x, region_z)) + else { + unreachable!() + }; + region + } + }; + + region.set_chunk( + pos_x, + pos_z, + chunk, + self.write_options, + &mut self.compression_buf, + &self.region_root, + ) + } + + /// Returns an iterator over all existing chunks in all regions. + pub fn all_chunk_positions( + &mut self, + ) -> Result> + '_, RegionError> { + fn extract_region_coordinates( + file: std::io::Result, + ) -> Result, RegionError> { + let file = file?; + + if !file.file_type()?.is_file() { + return Ok(None); + } + + let file_name = file + .file_name() + .into_string() + .map_err(|_| RegionError::OsStringConv)?; + + // read the file name as r.x.z.mca + let mut split = file_name.splitn(4, '.'); + if split.next() != Some("r") { + return Ok(None); + } + let Some(Ok(x)) = split.next().map(str::parse) else { + return Ok(None); + }; + let Some(Ok(z)) = split.next().map(str::parse) else { + return Ok(None); + }; + if split.next() != Some("mca") { + return Ok(None); + } + + Ok(Some((x, z))) + } + + fn region_chunks( + this: &mut RegionFolder, + pos: Result<(i32, i32), RegionError>, + ) -> impl Iterator> { + let positions = match pos { + Ok((region_x, region_z)) => { + match RegionFolder::region( + &mut this.regions, + &this.region_root, + region_x, + region_z, + ) { + Ok(Some(region)) => region.chunk_positions(region_x, region_z), + Ok(None) => Vec::new(), + Err(err) => vec![Err(err)], + } + } + Err(err) => vec![Err(err)], + }; + positions.into_iter() + } + + Ok(std::fs::read_dir(&self.region_root)? + .filter_map(|file| extract_region_coordinates(file).transpose()) + .flat_map(|pos| region_chunks(self, pos))) + } +} + +/// A chunk represented by the raw compound data. +pub struct RawChunk { + pub data: Compound, + pub timestamp: u32, +} + +/// X and Z positions of a region. +type RegionPos = (i32, i32); + +#[derive(Debug)] +enum RegionEntry { + /// There is a region file loaded here. + Occupied(Box), + /// There is no region file at this position. Don't try to read it from the + /// filesystem again. + Vacant, +} + +#[bitfield(u32)] +struct Location { + count: u8, + #[bits(24)] + offset: u32, +} + +impl Location { + fn is_none(self) -> bool { + self.0 == 0 + } + + fn offset_and_count(self) -> (u64, usize) { + (self.offset() as u64, self.count() as usize) + } +} + +#[derive(Debug)] +struct Region { + file: File, + locations: [Location; 1024], + timestamps: [u32; 1024], + used_sectors: bitvec::vec::BitVec, +} + +impl Region { + fn create(mut file: File) -> Result { + let header = [0; SECTOR_SIZE * 2]; + file.write_all(&header)?; + + Ok(Self { + file, + locations: [Location::default(); 1024], + timestamps: [0; 1024], + used_sectors: bitvec::vec::BitVec::repeat(true, 2), + }) + } + + fn open(mut file: File) -> Result { + let mut header = [0; SECTOR_SIZE * 2]; + file.read_exact(&mut header)?; + + let locations = std::array::from_fn(|i| { + Location(u32::from_be_bytes( + header[i * 4..i * 4 + 4].try_into().unwrap(), + )) + }); + let timestamps = std::array::from_fn(|i| { + u32::from_be_bytes( + header[i * 4 + SECTOR_SIZE..i * 4 + SECTOR_SIZE + 4] + .try_into() + .unwrap(), + ) + }); + + let mut used_sectors = bitvec::vec::BitVec::repeat(true, 2); + for location in locations { + if location.is_none() { + // No chunk exists at this position. + continue; + } + + let (sector_offset, sector_count) = location.offset_and_count(); + if sector_offset < 2 { + // skip locations pointing inside the header + continue; + } + if sector_count == 0 { + continue; + } + if sector_offset * SECTOR_SIZE as u64 > file.metadata()?.len() { + // this would go past the end of the file, which is impossible + continue; + } + + Self::reserve_sectors(&mut used_sectors, sector_offset, sector_count); + } + + Ok(Self { + file, + locations, + timestamps, + used_sectors, + }) + } + + fn get_chunk( + &mut self, + pos_x: i32, + pos_z: i32, + decompress_buf: &mut Vec, + region_root: &Path, + ) -> Result>, RegionError> + where + S: for<'a> FromModifiedUtf8<'a> + Hash + Ord, + { + let chunk_idx = Self::chunk_idx(pos_x, pos_z); + + let location = self.locations[chunk_idx]; + let timestamp = self.timestamps[chunk_idx]; + + if location.is_none() { + // No chunk exists at this position. + return Ok(None); + } + + let (sector_offset, sector_count) = location.offset_and_count(); + + // If the sector offset was <2, then the chunk data would be inside the region + // header. That doesn't make any sense. + if sector_offset < 2 { + return Err(RegionError::InvalidChunkSectorOffset); + } + + // Seek to the beginning of the chunk's data. + self.file + .seek(SeekFrom::Start(sector_offset * SECTOR_SIZE as u64))?; + + let exact_chunk_size = self.file.read_u32::()? as usize; + if exact_chunk_size == 0 { + return Err(RegionError::MissingChunkStream); + } + + // size of this chunk in sectors must always be >= the exact size. + if sector_count * SECTOR_SIZE < exact_chunk_size { + return Err(RegionError::InvalidChunkSize); + } + + let mut compression = self.file.read_u8()?; + + let data_buf = if Self::is_external_stream_chunk(compression) { + compression = Self::external_chunk_version(compression); + let mut external_file = + File::open(Self::external_chunk_file(pos_x, pos_z, region_root))?; + let mut buf = Vec::new(); + external_file.read_to_end(&mut buf)?; + buf.into_boxed_slice() + } else { + // the size includes the version of the stream, but we have already read that + let mut data_buf = vec![0; exact_chunk_size - 1].into_boxed_slice(); + self.file.read_exact(&mut data_buf)?; + data_buf + }; + + let r = data_buf.as_ref(); + + decompress_buf.clear(); + + // What compression does the chunk use? + let mut nbt_slice = match Compression::from_u8(compression) { + Some(Compression::Gzip) => { + let mut z = GzDecoder::new(r); + z.read_to_end(decompress_buf)?; + decompress_buf.as_slice() + } + Some(Compression::Zlib) => { + let mut z = ZlibDecoder::new(r); + z.read_to_end(decompress_buf)?; + decompress_buf.as_slice() + } + // Uncompressed + Some(Compression::None) => r, + // Unknown + None => return Err(RegionError::InvalidCompressionScheme(compression)), + }; + + let (data, _) = valence_nbt::from_binary(&mut nbt_slice)?; + + if !nbt_slice.is_empty() { + return Err(RegionError::TrailingNbtData); + } + + Ok(Some(RawChunk { data, timestamp })) + } + + fn delete_chunk( + &mut self, + pos_x: i32, + pos_z: i32, + delete_on_disk: bool, + region_root: &Path, + ) -> Result { + let chunk_idx = Self::chunk_idx(pos_x, pos_z); + + let location = self.locations[chunk_idx]; + if location.is_none() { + // chunk already missing, nothing to delete + return Ok(false); + } + + if delete_on_disk { + self.file.seek(SeekFrom::Start(chunk_idx as u64 * 4))?; + self.file.write_u32::(0)?; + + Self::delete_external_chunk_file(pos_x, pos_z, region_root)?; + } + + let (sector_offset, sector_count) = location.offset_and_count(); + if sector_offset >= 2 { + let start_index = sector_offset as usize; + let end_index = start_index + sector_count; + let len = self.used_sectors.len(); + self.used_sectors[start_index.min(len)..end_index.min(len)].fill(false); + } + + self.locations[chunk_idx] = Location::new(); + + Ok(true) + } + + fn set_chunk( + &mut self, + pos_x: i32, + pos_z: i32, + chunk: &Compound, + options: WriteOptions, + compress_buf: &mut Vec, + region_root: &Path, + ) -> Result<(), RegionError> + where + S: ToModifiedUtf8 + Hash + Ord, + { + // erase the chunk from allocated chunks (not from disk) + self.delete_chunk(pos_x, pos_z, false, region_root)?; + + // write the chunk into NBT and compress it according to the compression method + compress_buf.clear(); + let mut compress_cursor = Cursor::new(compress_buf); + match options.compression { + Compression::Gzip => valence_nbt::to_binary( + chunk, + GzEncoder::new(&mut compress_cursor, flate2::Compression::default()), + "", + )?, + Compression::Zlib => valence_nbt::to_binary( + chunk, + ZlibEncoder::new(&mut compress_cursor, flate2::Compression::default()), + "", + )?, + Compression::None => valence_nbt::to_binary(chunk, &mut compress_cursor, "")?, + } + let compress_buf = compress_cursor.into_inner(); + + // additional 5 bytes for exact chunk size + compression type, then add + // SECTOR_SIZE - 1 for rounding up + let num_sectors_needed = (compress_buf.len() + 5 + SECTOR_SIZE - 1) / SECTOR_SIZE; + let (start_sector, num_sectors) = if num_sectors_needed >= 256 { + if options.skip_oversized_chunks { + return Err(RegionError::OversizedChunk); + } + + // write oversized chunk to external file + File::create(Self::external_chunk_file(pos_x, pos_z, region_root))? + .write_all(&*compress_buf)?; + + let start_sector = self.allocate_sectors(1); + self.file + .seek(SeekFrom::Start(start_sector * SECTOR_SIZE as u64))?; + + // write the exact chunk size, which includes *only* the compression version + // (the rest of the chunk is external) + self.file.write_u32::(1)?; + // write the compression, with the marker which says our chunk is oversized + self.file.write_u8((options.compression as u8) | 0x80)?; + + (start_sector, 1) + } else { + // delete the oversized chunk if it existed before + Self::delete_external_chunk_file(pos_x, pos_z, region_root)?; + + let start_sector = self.allocate_sectors(num_sectors_needed); + self.file + .seek(SeekFrom::Start(start_sector * SECTOR_SIZE as u64))?; + + // write the exact chunk size, which accounts for the compression version which + // is not in our compress_buf + self.file + .write_u32::((compress_buf.len() + 1) as u32)?; + // write the compression + self.file.write_u8(options.compression as u8)?; + // write the data + self.file.write_all(&*compress_buf)?; + + (start_sector, num_sectors_needed) + }; + + let location = Location::new() + .with_offset(start_sector as u32) + .with_count(num_sectors as u8); + let timestamp = SystemTime::now() + .duration_since(UNIX_EPOCH) + .map(|duration| duration.as_secs() as u32) + .unwrap_or(0); + + // write changed header information to file + let chunk_idx = Self::chunk_idx(pos_x, pos_z); + self.file.seek(SeekFrom::Start(chunk_idx as u64 * 4))?; + self.file.write_u32::(location.0)?; + self.file + .seek(SeekFrom::Start(chunk_idx as u64 * 4 + SECTOR_SIZE as u64))?; + self.file.write_u32::(timestamp)?; + + // write changed header information to our header + self.locations[chunk_idx] = location; + self.timestamps[chunk_idx] = timestamp; + + // pad file to multiple of SECTOR_SIZE + let file_length = self.file.seek(SeekFrom::End(0))?; + let rem = file_length as usize % SECTOR_SIZE; + if rem != 0 { + self.file + .write_all(&[0; SECTOR_SIZE][..SECTOR_SIZE - rem])?; + } + + Ok(()) + } + + fn chunk_positions( + &self, + region_x: i32, + region_z: i32, + ) -> Vec> { + self.locations + .iter() + .enumerate() + .filter_map(move |(index, location)| { + if location.is_none() { + None + } else { + Some(( + region_x * 32 + (index % 32) as i32, + region_z * 32 + (index / 32) as i32, + )) + } + }) + .map(Ok) + .collect() + } + + fn external_chunk_file(pos_x: i32, pos_z: i32, region_root: &Path) -> PathBuf { + region_root + .to_path_buf() + .join(format!("c.{pos_x}.{pos_z}.mcc")) + } + + fn delete_external_chunk_file( + pos_x: i32, + pos_z: i32, + region_root: &Path, + ) -> Result<(), RegionError> { + match std::fs::remove_file(Self::external_chunk_file(pos_x, pos_z, region_root)) { + Ok(()) => Ok(()), + Err(err) if err.kind() == ErrorKind::NotFound => Ok(()), + Err(err) => Err(err.into()), + } + } + + fn reserve_sectors( + used_sectors: &mut bitvec::vec::BitVec, + sector_offset: u64, + sector_count: usize, + ) { + let start_index = sector_offset as usize; + let end_index = sector_offset as usize + sector_count; + if used_sectors.len() < end_index { + used_sectors.resize(start_index, false); + used_sectors.resize(end_index, true); + } else { + used_sectors[start_index..end_index].fill(true); + } + } + + fn allocate_sectors(&mut self, num_sectors: usize) -> u64 { + // find the first set of consecutive free sectors of length num_sectors + let mut index = 0; + let free_space_start = loop { + let Some(mut free_space_start) = self.used_sectors[index..].first_zero() else { + // we have reached a sequence of 1's at the end of the list, so next free space + // is at the end of the file + break self.used_sectors.len(); + }; + free_space_start += index; + + let Some(mut free_space_end) = self.used_sectors[free_space_start..].first_one() else { + // there is no 1 after this 0, so we have enough space here (even if we have to + // increase the file size) + break free_space_start; + }; + free_space_end += free_space_start; + + if free_space_end - free_space_start >= num_sectors { + // if the free space end is far enough from the free space start, we have enough + // space + break free_space_start; + } + + index = free_space_end; + }; + + Self::reserve_sectors(&mut self.used_sectors, free_space_start as u64, num_sectors); + free_space_start as u64 + } + + fn chunk_idx(pos_x: i32, pos_z: i32) -> usize { + (pos_x.rem_euclid(32) + pos_z.rem_euclid(32) * 32) as usize + } + + fn is_external_stream_chunk(stream_version: u8) -> bool { + (stream_version & 0x80) != 0 + } + + fn external_chunk_version(stream_version: u8) -> u8 { + stream_version & !0x80 + } +} + +const SECTOR_SIZE: usize = 4096; diff --git a/vendor/valence/crates/valence_anvil/src/parsing.rs b/vendor/valence/crates/valence_anvil/src/parsing.rs new file mode 100644 index 00000000..4971c5d9 --- /dev/null +++ b/vendor/valence/crates/valence_anvil/src/parsing.rs @@ -0,0 +1,380 @@ +use std::borrow::Cow; +use std::collections::BTreeMap; +use std::path::PathBuf; + +use thiserror::Error; +use valence_bytes::Utf8Bytes; +use valence_server::block::{PropName, PropValue}; +use valence_server::layer::chunk::{Chunk, UnloadedChunk}; +use valence_server::nbt::{Compound, List, Value}; +use valence_server::protocol::BlockKind; +use valence_server::registry::biome::BiomeId; +use valence_server::registry::BiomeRegistry; +use valence_server::{ChunkPos, Ident}; + +use crate::{RegionError, RegionFolder}; + +#[derive(Debug)] +pub struct DimensionFolder { + region: RegionFolder, + /// Mapping of biome names to their biome ID. + biome_to_id: BTreeMap, +} + +impl DimensionFolder { + pub fn new(dimension_root: impl Into, biomes: &BiomeRegistry) -> Self { + let mut region_root = dimension_root.into(); + region_root.push("region"); + + Self { + region: RegionFolder::new(region_root), + biome_to_id: biomes.iter().map(|(id, name, _)| (name, id)).collect(), + } + } + + /// Gets the parsed chunk at the given chunk position. + /// + /// Returns `Ok(Some(chunk))` if the chunk exists and no errors occurred + /// loading it. Returns `Ok(None)` if the chunk does not exist and no + /// errors occurred attempting to load it. Returns `Err(_)` if an error + /// occurred attempting to load the chunk. + pub fn get_chunk(&mut self, pos: ChunkPos) -> Result, ParseChunkError> { + let Some(raw_chunk) = self.region.get_chunk(pos.x, pos.z)? else { + return Ok(None); + }; + let parsed = parse_chunk(raw_chunk.data, &self.biome_to_id)?; + Ok(Some(ParsedChunk { + chunk: parsed, + timestamp: raw_chunk.timestamp, + })) + } +} + +/// A chunk parsed to show block information, biome information etc. +pub struct ParsedChunk { + pub chunk: UnloadedChunk, + pub timestamp: u32, +} + +#[derive(Debug, Error)] +#[non_exhaustive] +pub enum ParseChunkError { + #[error("region error: {0}")] + Region(#[from] RegionError), + #[error("missing chunk sections")] + MissingSections, + #[error("missing chunk section Y")] + MissingSectionY, + #[error("section Y is out of bounds")] + SectionYOutOfBounds, + #[error("missing block states")] + MissingBlockStates, + #[error("missing block palette")] + MissingBlockPalette, + #[error("invalid block palette length")] + BadBlockPaletteLen, + #[error("missing block name in palette")] + MissingBlockName, + #[error("unknown block name of \"{0}\"")] + UnknownBlockName(String), + #[error("unknown property name of \"{0}\"")] + UnknownPropName(String), + #[error("property value of block is not a string")] + BadPropValueType, + #[error("unknown property value of \"{0}\"")] + UnknownPropValue(String), + #[error("missing packed block state data in section")] + MissingBlockStateData, + #[error("unexpected number of longs in block state data")] + BadBlockLongCount, + #[error("invalid block palette index")] + BadBlockPaletteIndex, + #[error("missing biomes")] + MissingBiomes, + #[error("missing biome palette")] + MissingBiomePalette, + #[error("invalid biome palette length")] + BadBiomePaletteLen, + #[error("biome name is not a valid resource identifier")] + BadBiomeName, + #[error("missing packed biome data in section")] + MissingBiomeData, + #[error("unexpected number of longs in biome data")] + BadBiomeLongCount, + #[error("invalid biome palette index")] + BadBiomePaletteIndex, + #[error("missing block entities")] + MissingBlockEntities, + #[error("missing block entity ident")] + MissingBlockEntityIdent, + #[error("invalid block entity ident of \"{0}\"")] + InvalidBlockEntityName(Utf8Bytes), + #[error("invalid block entity position")] + InvalidBlockEntityPosition, +} + +pub fn parse_chunk( + mut nbt: Compound, + biome_map: &BTreeMap, // TODO: replace with biome registry arg. +) -> Result { + let Some(Value::List(List::Compound(sections))) = nbt.remove("sections") else { + return Err(ParseChunkError::MissingSections); + }; + + if sections.is_empty() { + return Ok(UnloadedChunk::new()); + } + + let mut chunk = + UnloadedChunk::with_height((sections.len() * 16).try_into().unwrap_or(u32::MAX)); + + let min_sect_y = sections + .iter() + .flat_map(|sect| { + if let Some(Value::Byte(sect_y)) = sect.get("Y") { + Some(*sect_y) + } else { + None + } + }) + .min() + .unwrap() as i32; + + let mut converted_block_palette = vec![]; + let mut converted_biome_palette = vec![]; + + for mut section in sections { + let Some(Value::Byte(sect_y)) = section.remove("Y") else { + return Err(ParseChunkError::MissingSectionY); + }; + + let sect_y = (sect_y as i32 - min_sect_y) as u32; + + if sect_y >= chunk.height() / 16 { + return Err(ParseChunkError::SectionYOutOfBounds); + } + + let Some(Value::Compound(mut block_states)) = section.remove("block_states") else { + return Err(ParseChunkError::MissingBlockStates); + }; + + let Some(Value::List(List::Compound(palette))) = block_states.remove("palette") else { + return Err(ParseChunkError::MissingBlockPalette); + }; + + if !(1..BLOCKS_PER_SECTION).contains(&palette.len()) { + return Err(ParseChunkError::BadBlockPaletteLen); + } + + converted_block_palette.clear(); + + for mut block in palette { + let Some(Value::String(name)) = block.remove("Name") else { + return Err(ParseChunkError::MissingBlockName); + }; + + let Some(block_kind) = BlockKind::from_str(ident_path(&name)) else { + return Err(ParseChunkError::UnknownBlockName(name)); + }; + + let mut state = block_kind.to_state(); + + if let Some(Value::Compound(properties)) = block.remove("Properties") { + for (key, value) in properties { + let Value::String(value) = value else { + return Err(ParseChunkError::BadPropValueType); + }; + + let Some(prop_name) = PropName::from_str(&key) else { + return Err(ParseChunkError::UnknownPropName(key)); + }; + + let Some(prop_value) = PropValue::from_str(&value) else { + return Err(ParseChunkError::UnknownPropValue(value)); + }; + + state = state.set(prop_name, prop_value); + } + } + + converted_block_palette.push(state); + } + + if converted_block_palette.len() == 1 { + chunk.fill_block_state_section(sect_y, converted_block_palette[0]); + } else { + debug_assert!(converted_block_palette.len() > 1); + + let Some(Value::LongArray(data)) = block_states.remove("data") else { + return Err(ParseChunkError::MissingBlockStateData); + }; + + let bits_per_idx = bit_width(converted_block_palette.len() - 1).max(4); + let idxs_per_long = 64 / bits_per_idx; + let long_count = BLOCKS_PER_SECTION.div_ceil(idxs_per_long); + let mask = 2_u64.pow(bits_per_idx as u32) - 1; + + if long_count != data.len() { + return Err(ParseChunkError::BadBlockLongCount); + }; + + let mut i: u32 = 0; + for long in data { + let u64 = long as u64; + + for j in 0..idxs_per_long { + if i >= BLOCKS_PER_SECTION as u32 { + break; + } + + let idx = (u64 >> (bits_per_idx * j)) & mask; + + let Some(block) = converted_block_palette.get(idx as usize).cloned() else { + return Err(ParseChunkError::BadBlockPaletteIndex); + }; + + let x = i % 16; + let z = i / 16 % 16; + let y = i / (16 * 16); + + chunk.set_block_state(x, sect_y * 16 + y, z, block); + + i += 1; + } + } + } + + let Some(Value::Compound(biomes)) = section.get("biomes") else { + return Err(ParseChunkError::MissingBiomes); + }; + + let Some(Value::List(List::String(palette))) = biomes.get("palette") else { + return Err(ParseChunkError::MissingBiomePalette); + }; + + if !(1..BIOMES_PER_SECTION).contains(&palette.len()) { + return Err(ParseChunkError::BadBiomePaletteLen); + } + + converted_biome_palette.clear(); + + for biome_name in palette { + if !Ident::is_valid(&biome_name) { + return Err(ParseChunkError::BadBiomeName); + }; + + converted_biome_palette.push( + biome_map + .get(biome_name.as_str()) + .copied() + .unwrap_or_default(), + ); + } + + if converted_biome_palette.len() == 1 { + chunk.fill_biome_section(sect_y, converted_biome_palette[0]); + } else { + debug_assert!(converted_biome_palette.len() > 1); + + let Some(Value::LongArray(data)) = biomes.get("data") else { + return Err(ParseChunkError::MissingBiomeData); + }; + + let bits_per_idx = bit_width(converted_biome_palette.len() - 1); + let idxs_per_long = 64 / bits_per_idx; + let long_count = BIOMES_PER_SECTION.div_ceil(idxs_per_long); + let mask = 2_u64.pow(bits_per_idx as u32) - 1; + + if long_count != data.len() { + return Err(ParseChunkError::BadBiomeLongCount); + }; + + let mut i: u32 = 0; + for &long in data.iter() { + let u64 = long as u64; + + for j in 0..idxs_per_long { + if i >= BIOMES_PER_SECTION as u32 { + break; + } + + let idx = (u64 >> (bits_per_idx * j)) & mask; + + let Some(biome) = converted_biome_palette.get(idx as usize).cloned() else { + return Err(ParseChunkError::BadBiomePaletteIndex); + }; + + let x = i % 4; + let z = i / 4 % 4; + let y = i / (4 * 4); + + chunk.set_biome(x, sect_y * 4 + y, z, biome); + + i += 1; + } + } + } + } + + let Some(Value::List(block_entities)) = nbt.remove("block_entities") else { + return Err(ParseChunkError::MissingBlockEntities); + }; + + if let List::Compound(block_entities) = block_entities { + for mut comp in block_entities { + let Some(Value::String(ident)) = comp.remove("id") else { + return Err(ParseChunkError::MissingBlockEntityIdent); + }; + + if let Err(e) = Ident::new(ident) { + return Err(ParseChunkError::InvalidBlockEntityName(e.0)); + } + + let Some(Value::Int(x)) = comp.remove("x") else { + return Err(ParseChunkError::InvalidBlockEntityPosition); + }; + + let x = x.rem_euclid(16) as u32; + + let Some(Value::Int(y)) = comp.remove("y") else { + return Err(ParseChunkError::InvalidBlockEntityPosition); + }; + + let Ok(y) = u32::try_from(y.wrapping_sub(min_sect_y * 16)) else { + return Err(ParseChunkError::InvalidBlockEntityPosition); + }; + + if y >= chunk.height() { + return Err(ParseChunkError::InvalidBlockEntityPosition); + } + + let Some(Value::Int(z)) = comp.remove("z") else { + return Err(ParseChunkError::InvalidBlockEntityPosition); + }; + + let z = z.rem_euclid(16) as u32; + + comp.remove("keepPacked"); + + chunk.set_block_entity(x, y, z, Some(comp)); + } + } + + Ok(chunk) +} + +const BLOCKS_PER_SECTION: usize = 16 * 16 * 16; +const BIOMES_PER_SECTION: usize = 4 * 4 * 4; + +/// Gets the path part of a resource identifier. +fn ident_path(ident: &str) -> &str { + match ident.rsplit_once(':') { + Some((_, after)) => after, + None => ident, + } +} + +/// Returns the minimum number of bits needed to represent the integer `n`. +const fn bit_width(n: usize) -> usize { + (usize::BITS - n.leading_zeros()) as _ +} diff --git a/vendor/valence/crates/valence_boss_bar/Cargo.toml b/vendor/valence/crates/valence_boss_bar/Cargo.toml new file mode 100644 index 00000000..7960ffe8 --- /dev/null +++ b/vendor/valence/crates/valence_boss_bar/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "valence_boss_bar" +description = "Boss bar API for Valence" +readme = "README.md" +keywords = ["minecraft", "bossbar", "api"] +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[dependencies] +valence_entity.workspace = true +valence_server.workspace = true +bitfield-struct.workspace = true +bevy_app.workspace = true +bevy_ecs.workspace = true +derive_more.workspace = true diff --git a/vendor/valence/crates/valence_boss_bar/README.md b/vendor/valence/crates/valence_boss_bar/README.md new file mode 100644 index 00000000..f5ce42d7 --- /dev/null +++ b/vendor/valence/crates/valence_boss_bar/README.md @@ -0,0 +1,3 @@ +# valence_boss_bar + +Manages Minecraft's boss bar which is the bar seen at the top of the screen when a boss mob is present. \ No newline at end of file diff --git a/vendor/valence/crates/valence_boss_bar/src/components.rs b/vendor/valence/crates/valence_boss_bar/src/components.rs new file mode 100644 index 00000000..6548fff5 --- /dev/null +++ b/vendor/valence/crates/valence_boss_bar/src/components.rs @@ -0,0 +1,65 @@ +use std::borrow::Cow; + +use bevy_ecs::prelude::{Bundle, Component}; +use derive_more::{Deref, DerefMut}; +use valence_entity::EntityLayerId; +use valence_server::protocol::packets::play::boss_bar_s2c::{ + BossBarAction, BossBarColor, BossBarDivision, BossBarFlags, +}; +use valence_server::{Text, UniqueId}; + +/// The bundle of components that make up a boss bar. +#[derive(Bundle, Default)] +pub struct BossBarBundle { + pub id: UniqueId, + pub title: BossBarTitle, + pub health: BossBarHealth, + pub style: BossBarStyle, + pub flags: BossBarFlags, + pub layer: EntityLayerId, +} + +/// The title of a boss bar. +#[derive(Component, Clone, Default, Deref, DerefMut)] +pub struct BossBarTitle(pub Text); + +impl ToPacketAction for BossBarTitle { + fn to_packet_action(&self) -> BossBarAction { + BossBarAction::UpdateTitle(Cow::Borrowed(&self.0)) + } +} + +/// The health of a boss bar. +#[derive(Component, Default, Deref, DerefMut)] +pub struct BossBarHealth(pub f32); + +impl ToPacketAction for BossBarHealth { + fn to_packet_action(&self) -> BossBarAction { + BossBarAction::UpdateHealth(self.0) + } +} + +/// The style of a boss bar. This includes the color and division of the boss +/// bar. +#[derive(Component, Default)] +pub struct BossBarStyle { + pub color: BossBarColor, + pub division: BossBarDivision, +} + +impl ToPacketAction for BossBarStyle { + fn to_packet_action(&self) -> BossBarAction { + BossBarAction::UpdateStyle(self.color, self.division) + } +} + +impl ToPacketAction for BossBarFlags { + fn to_packet_action(&self) -> BossBarAction { + BossBarAction::UpdateFlags(*self) + } +} + +/// Trait for converting a component to a boss bar action. +pub(crate) trait ToPacketAction { + fn to_packet_action(&self) -> BossBarAction; +} diff --git a/vendor/valence/crates/valence_boss_bar/src/lib.rs b/vendor/valence/crates/valence_boss_bar/src/lib.rs new file mode 100644 index 00000000..ea4b9ec2 --- /dev/null +++ b/vendor/valence/crates/valence_boss_bar/src/lib.rs @@ -0,0 +1,257 @@ +#![doc = include_str!("../README.md")] +#![allow(clippy::type_complexity)] +#![deny( + rustdoc::broken_intra_doc_links, + rustdoc::private_intra_doc_links, + rustdoc::missing_crate_level_docs, + rustdoc::invalid_codeblock_attributes, + rustdoc::invalid_rust_codeblocks, + rustdoc::bare_urls, + rustdoc::invalid_html_tags +)] +#![warn( + trivial_casts, + trivial_numeric_casts, + unused_lifetimes, + unused_import_braces, + unreachable_pub, + clippy::dbg_macro +)] + +use std::borrow::Cow; + +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use valence_server::client::{ + Client, OldViewDistance, OldVisibleEntityLayers, ViewDistance, VisibleEntityLayers, +}; +use valence_server::layer::UpdateLayersPreClientSet; +pub use valence_server::protocol::packets::play::boss_bar_s2c::{ + BossBarAction, BossBarColor, BossBarDivision, BossBarFlags, +}; +use valence_server::protocol::packets::play::BossBarS2c; +use valence_server::protocol::WritePacket; +use valence_server::{ChunkView, Despawned, EntityLayer, Layer, UniqueId}; + +mod components; +pub use components::*; +use valence_entity::{EntityLayerId, OldPosition, Position}; + +pub struct BossBarPlugin; + +impl Plugin for BossBarPlugin { + fn build(&self, app: &mut bevy_app::App) { + app.add_systems( + PostUpdate, + ( + update_boss_bar::, + update_boss_bar::, + update_boss_bar::, + update_boss_bar::, + update_boss_bar_layer_view, + update_boss_bar_chunk_view, + boss_bar_despawn, + ) + .before(UpdateLayersPreClientSet), + ); + } +} + +fn update_boss_bar( + boss_bars_query: Query<(&UniqueId, &T, &EntityLayerId, Option<&Position>), Changed>, + mut entity_layers_query: Query<&mut EntityLayer>, +) { + for (id, part, entity_layer_id, pos) in boss_bars_query.iter() { + if let Ok(mut entity_layer) = entity_layers_query.get_mut(entity_layer_id.0) { + let packet = BossBarS2c { + id: id.0, + action: part.to_packet_action(), + }; + if let Some(pos) = pos { + entity_layer.view_writer(pos.0).write_packet(&packet); + } else { + entity_layer.write_packet(&packet); + } + } + } +} + +fn update_boss_bar_layer_view( + mut clients_query: Query< + ( + &mut Client, + &VisibleEntityLayers, + &OldVisibleEntityLayers, + &Position, + &OldPosition, + &ViewDistance, + &OldViewDistance, + ), + Changed, + >, + boss_bars_query: Query<( + &UniqueId, + &BossBarTitle, + &BossBarHealth, + &BossBarStyle, + &BossBarFlags, + &EntityLayerId, + Option<&Position>, + )>, +) { + for ( + mut client, + visible_entity_layers, + old_visible_entity_layers, + position, + _old_position, + view_distance, + _old_view_distance, + ) in clients_query.iter_mut() + { + let view = ChunkView::new(position.0.into(), view_distance.get()); + + let old_layers = old_visible_entity_layers.get(); + let current_layers = &visible_entity_layers.0; + + for &added_layer in current_layers.difference(old_layers) { + for (id, title, health, style, flags, _, boss_bar_position) in boss_bars_query + .iter() + .filter(|(_, _, _, _, _, layer_id, _)| layer_id.0 == added_layer) + { + if let Some(position) = boss_bar_position { + if view.contains(position.0.into()) { + client.write_packet(&BossBarS2c { + id: id.0, + action: BossBarAction::Add { + title: Cow::Borrowed(&title.0), + health: health.0, + color: style.color, + division: style.division, + flags: *flags, + }, + }); + } + } else { + client.write_packet(&BossBarS2c { + id: id.0, + action: BossBarAction::Add { + title: Cow::Borrowed(&title.0), + health: health.0, + color: style.color, + division: style.division, + flags: *flags, + }, + }); + } + } + } + + for &removed_layer in old_layers.difference(current_layers) { + for (id, _, _, _, _, _, boss_bar_position) in boss_bars_query + .iter() + .filter(|(_, _, _, _, _, layer_id, _)| layer_id.0 == removed_layer) + { + if let Some(position) = boss_bar_position { + if view.contains(position.0.into()) { + client.write_packet(&BossBarS2c { + id: id.0, + action: BossBarAction::Remove, + }); + } + } else { + client.write_packet(&BossBarS2c { + id: id.0, + action: BossBarAction::Remove, + }); + } + } + } + } +} + +fn update_boss_bar_chunk_view( + mut clients_query: Query< + ( + &mut Client, + &VisibleEntityLayers, + &OldVisibleEntityLayers, + &Position, + &OldPosition, + &ViewDistance, + &OldViewDistance, + ), + Changed, + >, + boss_bars_query: Query<( + &UniqueId, + &BossBarTitle, + &BossBarHealth, + &BossBarStyle, + &BossBarFlags, + &EntityLayerId, + &Position, + )>, +) { + for ( + mut client, + visible_entity_layers, + _old_visible_entity_layers, + position, + old_position, + view_distance, + old_view_distance, + ) in clients_query.iter_mut() + { + let view = ChunkView::new(position.0.into(), view_distance.get()); + let old_view = ChunkView::new(old_position.get().into(), old_view_distance.get()); + + for layer in visible_entity_layers.0.iter() { + for (id, title, health, style, flags, _, boss_bar_position) in boss_bars_query + .iter() + .filter(|(_, _, _, _, _, layer_id, _)| layer_id.0 == *layer) + { + if view.contains(boss_bar_position.0.into()) + && !old_view.contains(boss_bar_position.0.into()) + { + client.write_packet(&BossBarS2c { + id: id.0, + action: BossBarAction::Add { + title: Cow::Borrowed(&title.0), + health: health.0, + color: style.color, + division: style.division, + flags: *flags, + }, + }); + } else if !view.contains(boss_bar_position.0.into()) + && old_view.contains(boss_bar_position.0.into()) + { + client.write_packet(&BossBarS2c { + id: id.0, + action: BossBarAction::Remove, + }); + } + } + } + } +} + +fn boss_bar_despawn( + boss_bars_query: Query<(&UniqueId, &EntityLayerId, Option<&Position>), With>, + mut entity_layer_query: Query<&mut EntityLayer>, +) { + for (id, entity_layer_id, position) in boss_bars_query.iter() { + if let Ok(mut entity_layer) = entity_layer_query.get_mut(entity_layer_id.0) { + let packet = BossBarS2c { + id: id.0, + action: BossBarAction::Remove, + }; + if let Some(pos) = position { + entity_layer.view_writer(pos.0).write_packet(&packet); + } else { + entity_layer.write_packet(&packet); + } + } + } +} diff --git a/vendor/valence/crates/valence_build_utils/Cargo.toml b/vendor/valence/crates/valence_build_utils/Cargo.toml new file mode 100644 index 00000000..7a928faa --- /dev/null +++ b/vendor/valence/crates/valence_build_utils/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "valence_build_utils" +description = "Common build script utilities for Valence" +readme = "README.md" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[dependencies] +anyhow.workspace = true +syn.workspace = true +proc-macro2.workspace = true diff --git a/vendor/valence/crates/valence_build_utils/README.md b/vendor/valence/crates/valence_build_utils/README.md new file mode 100644 index 00000000..fa275e1a --- /dev/null +++ b/vendor/valence/crates/valence_build_utils/README.md @@ -0,0 +1,3 @@ +# valence_build_utils + +Common code used in build scripts. diff --git a/vendor/valence/crates/valence_build_utils/src/lib.rs b/vendor/valence/crates/valence_build_utils/src/lib.rs new file mode 100644 index 00000000..775f82a7 --- /dev/null +++ b/vendor/valence/crates/valence_build_utils/src/lib.rs @@ -0,0 +1,62 @@ +#![doc = include_str!("../README.md")] +#![deny( + rustdoc::broken_intra_doc_links, + rustdoc::private_intra_doc_links, + rustdoc::missing_crate_level_docs, + rustdoc::invalid_codeblock_attributes, + rustdoc::invalid_rust_codeblocks, + rustdoc::bare_urls, + rustdoc::invalid_html_tags +)] +#![warn( + trivial_casts, + trivial_numeric_casts, + unused_lifetimes, + unused_import_braces, + unreachable_pub, + clippy::dbg_macro +)] + +use std::path::Path; +use std::process::Command; +use std::{env, fs}; + +use anyhow::Context; +use proc_macro2::{Ident, Span, TokenStream}; + +pub fn write_generated_file(content: TokenStream, out_file: &str) -> anyhow::Result<()> { + let out_dir = env::var_os("OUT_DIR").context("failed to get OUT_DIR env var")?; + let path = Path::new(&out_dir).join(out_file); + let code = content.to_string(); + + fs::write(&path, code)?; + + // Try to format the output for debugging purposes. + // Doesn't matter if rustfmt is unavailable. + let _ = Command::new("rustfmt").arg(path).output(); + + Ok(()) +} + +/// Parses a [`proc_macro2::Ident`] from a `str`. Rust keywords are prepended +/// with underscores to make them valid identifiers. +pub fn ident(s: impl AsRef) -> Ident { + let s = s.as_ref().trim(); + + // Parse the ident from a str. If the string is a Rust keyword, stick an + // underscore in front. + syn::parse_str::(s) + .unwrap_or_else(|_| Ident::new(format!("_{s}").as_str(), Span::call_site())) +} + +#[track_caller] +pub fn rerun_if_changed(files: [&str; N]) { + for file in files { + assert!( + Path::new(file).exists(), + "File \"{file}\" does not exist. Did you forget to update the path?" + ); + + println!("cargo:rerun-if-changed={file}"); + } +} diff --git a/vendor/valence/crates/valence_bytes/Cargo.toml b/vendor/valence/crates/valence_bytes/Cargo.toml new file mode 100644 index 00000000..db9142a5 --- /dev/null +++ b/vendor/valence/crates/valence_bytes/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "valence_bytes" +description = "Storing reference counted bytes" +readme = "README.md" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[dependencies] +bytes.workspace = true diff --git a/vendor/valence/crates/valence_bytes/README.md b/vendor/valence/crates/valence_bytes/README.md new file mode 100644 index 00000000..13de0a51 --- /dev/null +++ b/vendor/valence/crates/valence_bytes/README.md @@ -0,0 +1,3 @@ +# valence_bytes + +A library for storing reference-counted bytes diff --git a/vendor/valence/crates/valence_bytes/src/cow_bytes.rs b/vendor/valence/crates/valence_bytes/src/cow_bytes.rs new file mode 100644 index 00000000..08a9c87b --- /dev/null +++ b/vendor/valence/crates/valence_bytes/src/cow_bytes.rs @@ -0,0 +1,91 @@ +use std::ops::{Deref, RangeBounds}; + +use crate::Bytes; + +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub enum CowBytes<'a> { + Borrowed(&'a [u8]), + Owned(Bytes), +} + +impl<'a> CowBytes<'a> { + pub fn into_owned(self) -> Bytes { + match self { + Self::Borrowed(bytes) => Bytes::copy_from_slice(bytes), + Self::Owned(bytes) => bytes, + } + } + + pub fn clear(&mut self) { + match self { + Self::Borrowed(bytes) => { + *bytes = &bytes[0..0]; + } + Self::Owned(bytes) => bytes.clear(), + } + } + + pub fn slice(&self, range: impl RangeBounds) -> Self { + match self { + Self::Borrowed(bytes) => { + Self::Borrowed(&bytes[(range.start_bound().cloned(), range.end_bound().cloned())]) + } + Self::Owned(bytes) => Self::Owned(bytes.slice(range)), + } + } + + pub fn split_off(&mut self, at: usize) -> Self { + assert!(at <= self.len()); + let result = self.slice(at..); + self.truncate(at); + result + } + + pub fn split_to(&mut self, at: usize) -> Self { + assert!(at <= self.len()); + let mut result = self.clone(); + result.truncate(at); + *self = self.slice(at..); + result + } + + pub fn truncate(&mut self, len: usize) { + match self { + Self::Borrowed(bytes) => { + if let Some(truncated) = bytes.get(0..len) { + *bytes = truncated; + } + } + Self::Owned(bytes) => bytes.truncate(len), + } + } +} + +impl<'a> Default for CowBytes<'a> { + fn default() -> Self { + Bytes::default().into() + } +} + +impl<'a> Deref for CowBytes<'a> { + type Target = [u8]; + + fn deref(&self) -> &[u8] { + match self { + Self::Borrowed(bytes) => bytes, + Self::Owned(bytes) => bytes, + } + } +} + +impl<'a> From<&'a [u8]> for CowBytes<'a> { + fn from(bytes: &'a [u8]) -> Self { + Self::Borrowed(bytes) + } +} + +impl<'a> From for CowBytes<'a> { + fn from(bytes: Bytes) -> Self { + Self::Owned(bytes) + } +} diff --git a/vendor/valence/crates/valence_bytes/src/cow_fixed_bytes.rs b/vendor/valence/crates/valence_bytes/src/cow_fixed_bytes.rs new file mode 100644 index 00000000..823a6e13 --- /dev/null +++ b/vendor/valence/crates/valence_bytes/src/cow_fixed_bytes.rs @@ -0,0 +1,41 @@ +use std::ops::Deref; + +use crate::FixedBytes; + +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub enum CowFixedBytes<'a, const N: usize> { + Borrowed(&'a [u8; N]), + Owned(FixedBytes), +} + +impl<'a, const N: usize> CowFixedBytes<'a, N> { + pub fn into_owned(self) -> FixedBytes { + match self { + Self::Borrowed(bytes) => FixedBytes::copy_from_array(bytes), + Self::Owned(bytes) => bytes, + } + } +} + +impl<'a, const N: usize> Deref for CowFixedBytes<'a, N> { + type Target = [u8; N]; + + fn deref(&self) -> &[u8; N] { + match self { + Self::Borrowed(bytes) => bytes, + Self::Owned(bytes) => bytes, + } + } +} + +impl<'a, const N: usize> From<&'a [u8; N]> for CowFixedBytes<'a, N> { + fn from(bytes: &'a [u8; N]) -> Self { + Self::Borrowed(bytes) + } +} + +impl<'a, const N: usize> From> for CowFixedBytes<'a, N> { + fn from(bytes: FixedBytes) -> Self { + Self::Owned(bytes) + } +} diff --git a/vendor/valence/crates/valence_bytes/src/cow_utf8_bytes.rs b/vendor/valence/crates/valence_bytes/src/cow_utf8_bytes.rs new file mode 100644 index 00000000..50568d72 --- /dev/null +++ b/vendor/valence/crates/valence_bytes/src/cow_utf8_bytes.rs @@ -0,0 +1,58 @@ +use std::fmt::{Display, Formatter}; +use std::ops::Deref; + +use crate::Utf8Bytes; + +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub enum CowUtf8Bytes<'a> { + Borrowed(&'a str), + Owned(Utf8Bytes), +} + +impl<'a> CowUtf8Bytes<'a> { + pub fn into_owned(self) -> Utf8Bytes { + match self { + Self::Borrowed(bytes) => Utf8Bytes::copy_from_str(bytes), + Self::Owned(bytes) => bytes, + } + } + + pub fn as_str(&self) -> &str { + self + } +} + +impl<'a> Display for CowUtf8Bytes<'a> { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + Display::fmt(self.as_str(), f) + } +} + +impl<'a> Default for CowUtf8Bytes<'a> { + fn default() -> Self { + Utf8Bytes::default().into() + } +} + +impl<'a> Deref for CowUtf8Bytes<'a> { + type Target = str; + + fn deref(&self) -> &str { + match self { + Self::Borrowed(bytes) => bytes, + Self::Owned(bytes) => bytes, + } + } +} + +impl<'a> From<&'a str> for CowUtf8Bytes<'a> { + fn from(bytes: &'a str) -> Self { + Self::Borrowed(bytes) + } +} + +impl<'a> From for CowUtf8Bytes<'a> { + fn from(bytes: Utf8Bytes) -> Self { + Self::Owned(bytes) + } +} diff --git a/vendor/valence/crates/valence_bytes/src/fixed_bytes.rs b/vendor/valence/crates/valence_bytes/src/fixed_bytes.rs new file mode 100644 index 00000000..c1c53a27 --- /dev/null +++ b/vendor/valence/crates/valence_bytes/src/fixed_bytes.rs @@ -0,0 +1,102 @@ +use std::convert::AsRef; +use std::error::Error; +use std::fmt::{Display, Formatter}; +use std::ops::Deref; + +use bytes::Bytes; + +/// Wrapper around [`bytes::Bytes`] which guarantees that the bytes are exactly +/// `N` length +#[derive(Clone, PartialOrd, Ord, PartialEq, Eq, Hash, Debug)] +pub struct FixedBytes(Bytes); + +impl FixedBytes { + pub fn new(value: Bytes) -> Option { + if value.len() == N { + // SAFETY: The length of the bytes has been checked + Some(unsafe { FixedBytes::new_unchecked(value) }) + } else { + None + } + } + + /// # Safety + /// `bytes` must have a length of exactly `N` + pub const unsafe fn new_unchecked(bytes: Bytes) -> Self { + FixedBytes(bytes) + } + + pub const fn from_static(value: &'static [u8; N]) -> Self { + // SAFETY: Length is guaranteed to be `N` + unsafe { Self::new_unchecked(Bytes::from_static(value)) } + } + + pub fn copy_from_array(value: &[u8; N]) -> Self { + // SAFETY: Length is guaranteed to be `N` + unsafe { Self::new_unchecked(Bytes::copy_from_slice(value)) } + } +} + +impl Deref for FixedBytes { + type Target = [u8; N]; + + fn deref(&self) -> &[u8; N] { + let data: &[u8] = &self.0; + // SAFETY: FixedBytes is guaranteed to have a length of exactly `N` bytes + let data: &[u8; N] = unsafe { data.try_into().unwrap_unchecked() }; + data + } +} + +impl AsRef<[u8; N]> for FixedBytes { + fn as_ref(&self) -> &[u8; N] { + self + } +} + +impl AsRef<[u8]> for FixedBytes { + fn as_ref(&self) -> &[u8] { + let value: &[u8; N] = self; + value + } +} + +impl AsRef for FixedBytes { + fn as_ref(&self) -> &Bytes { + &self.0 + } +} + +#[derive(Debug, Copy, Clone)] +pub struct TryFromBytesError(()); + +impl Display for TryFromBytesError { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!( + f, + "could not convert Bytes to FixedBytes because it is the wrong length" + ) + } +} + +impl Error for TryFromBytesError {} + +impl TryFrom for FixedBytes { + type Error = TryFromBytesError; + + fn try_from(value: Bytes) -> Result { + Self::new(value).ok_or(TryFromBytesError(())) + } +} + +impl From<[u8; N]> for FixedBytes { + fn from(value: [u8; N]) -> Self { + FixedBytes::copy_from_array(&value) + } +} + +impl From<&'static [u8; N]> for FixedBytes { + fn from(value: &'static [u8; N]) -> Self { + Self::from_static(value) + } +} diff --git a/vendor/valence/crates/valence_bytes/src/lib.rs b/vendor/valence/crates/valence_bytes/src/lib.rs new file mode 100644 index 00000000..21e8cb7c --- /dev/null +++ b/vendor/valence/crates/valence_bytes/src/lib.rs @@ -0,0 +1,12 @@ +pub use bytes::Bytes; +pub use cow_bytes::CowBytes; +pub use cow_fixed_bytes::CowFixedBytes; +pub use cow_utf8_bytes::CowUtf8Bytes; +pub use fixed_bytes::FixedBytes; +pub use utf8::Utf8Bytes; + +pub mod cow_bytes; +pub mod cow_fixed_bytes; +pub mod cow_utf8_bytes; +pub mod fixed_bytes; +pub mod utf8; diff --git a/vendor/valence/crates/valence_bytes/src/utf8.rs b/vendor/valence/crates/valence_bytes/src/utf8.rs new file mode 100644 index 00000000..35dd2a02 --- /dev/null +++ b/vendor/valence/crates/valence_bytes/src/utf8.rs @@ -0,0 +1,101 @@ +use std::convert::AsRef; +use std::fmt::{Debug, Display, Formatter}; +use std::ops::Deref; + +use bytes::Bytes; + +/// Wrapper around [`bytes::Bytes`] which guarantees that the bytes are UTF-8 +#[derive(Default, Clone, PartialOrd, Ord, PartialEq, Eq, Hash)] +pub struct Utf8Bytes(Bytes); + +impl Utf8Bytes { + pub fn new(value: Bytes) -> Result { + // Check that the bytes are UTF-8 + std::str::from_utf8(&value)?; + + // SAFETY: Bytes have been confirmed to be UTF-8 + Ok(unsafe { Utf8Bytes::new_unchecked(value) }) + } + + /// # Safety + /// `bytes` must be UTF-8 + pub const unsafe fn new_unchecked(bytes: Bytes) -> Self { + Utf8Bytes(bytes) + } + + pub const fn from_static(value: &'static str) -> Self { + // SAFETY: str guarantees UTF-8 + unsafe { Self::new_unchecked(Bytes::from_static(value.as_bytes())) } + } + + pub fn copy_from_str(value: &str) -> Self { + // SAFETY: str guarantees UTF-8 + unsafe { Self::new_unchecked(Bytes::copy_from_slice(value.as_bytes())) } + } + + pub fn as_str(&self) -> &str { + self + } +} + +impl Deref for Utf8Bytes { + type Target = str; + + fn deref(&self) -> &str { + // SAFETY: Utf8Bytes is guaranteed to be UTF-8 + unsafe { std::str::from_utf8_unchecked(&self.0) } + } +} + +impl AsRef for Utf8Bytes { + fn as_ref(&self) -> &str { + self + } +} + +impl AsRef<[u8]> for Utf8Bytes { + fn as_ref(&self) -> &[u8] { + &self.0 + } +} + +impl AsRef for Utf8Bytes { + fn as_ref(&self) -> &Bytes { + &self.0 + } +} + +impl TryFrom for Utf8Bytes { + type Error = std::str::Utf8Error; + + fn try_from(value: Bytes) -> Result { + Self::new(value) + } +} + +impl From for Utf8Bytes { + fn from(value: String) -> Self { + // SAFETY: String guarantees UTF-8 + unsafe { Utf8Bytes::new_unchecked(value.into()) } + } +} + +impl From<&'static str> for Utf8Bytes { + fn from(value: &'static str) -> Self { + Self::from_static(value) + } +} + +impl Debug for Utf8Bytes { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + let value: &str = self; + Debug::fmt(value, f) + } +} + +impl Display for Utf8Bytes { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + let value: &str = self; + Display::fmt(value, f) + } +} diff --git a/vendor/valence/crates/valence_command/Cargo.toml b/vendor/valence/crates/valence_command/Cargo.toml new file mode 100644 index 00000000..125f68e9 --- /dev/null +++ b/vendor/valence/crates/valence_command/Cargo.toml @@ -0,0 +1,23 @@ +[package] +name = "valence_command" +description = "Command management for Valence" +readme = "README.md" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[dependencies] +anyhow.workspace = true +bevy_app.workspace = true +bevy_derive.workspace = true +bevy_ecs.workspace = true +byteorder.workspace = true +ordered-float.workspace = true +petgraph.workspace = true +thiserror.workspace = true +tracing.workspace = true + +valence_server.workspace = true +valence_text.workspace = true diff --git a/vendor/valence/crates/valence_command/README.md b/vendor/valence/crates/valence_command/README.md new file mode 100644 index 00000000..82c2ce7c --- /dev/null +++ b/vendor/valence/crates/valence_command/README.md @@ -0,0 +1,13 @@ +# Valence Command + +This plugin manages the command system for a valence server. It is responsible for parsing, storing, managing and +dispatching commands. + +#### This plugin manages the following: + +- Registering commands to a Command Graph which is used parse commands. +- Receiving commands from the client and turning them into events. +- Parsing commands and dispatching them in the registered executable format. +- Sending the command graph to clients. + +See the module level documentation for more information. diff --git a/vendor/valence/crates/valence_command/src/graph.rs b/vendor/valence/crates/valence_command/src/graph.rs new file mode 100644 index 00000000..239a6f14 --- /dev/null +++ b/vendor/valence/crates/valence_command/src/graph.rs @@ -0,0 +1,533 @@ +//! # Command graph implementation +//! +//! This is the core of the command system. It is a graph of `CommandNode`s that +//! are connected by the `CommandEdgeType`. The graph is used to determine what +//! command to run when a command is entered. The graph is also used to generate +//! the command tree that is sent to the client. +//! +//! ### The graph is a directed graph with 3 types of nodes: +//! * Root node ([NodeData::Root]) - This is the root of the graph. It is used +//! to connect all the +//! other nodes to the graph. It is always present and there should only be one. +//! * Literal node ([NodeData::Literal]) - This is a literal part of a command. +//! It is a string that +//! must be matched exactly by the client to trigger the validity of the node. +//! For example, the command `/teleport` would have a literal node with the name +//! `teleport` which is a child of the root node. +//! * Argument node ([NodeData::Argument]) - This is a node that represents an +//! argument in a +//! command. It is a string that is matched by the client and checked by the +//! server. For example, the command `/teleport 0 0 0` would have 1 argument +//! node with the name "" and the parser [Parser::Vec3] +//! which is a child of the literal node with the name `teleport`. +//! +//! #### and 2 types of edges: +//! * Child edge ([CommandEdgeType::Child]) - This is an edge that connects a +//! parent node to a +//! child node. It is used to determine what nodes are valid children of a +//! parent node. for example, the literal node with the name `teleport` would +//! have a child edge to the argument node with the name +//! "". This means that the argument node is a valid child +//! of the literal node. +//! * Redirect edge ([CommandEdgeType::Redirect]) - This edge is special. It is +//! used to redirect the +//! client to another node. For example, the literal node with the name `tp` +//! would have a Redirect edge to the literal node with the name `teleport`. +//! This means that if the client enters the command `/tp` the server will +//! redirect the client to the literal node with the name `teleport`. Making the +//! command `/tp` functionally equivalent to `/teleport`. +//! +//! # Cool Example Graph For Possible Implementation Of Teleport Command (made with graphviz) +//! ```text +//! ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” +//! │ Root │ ─┐ +//! ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ │ +//! │ │ +//! │ Child │ +//! ā–¼ │ +//! ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” │ +//! │ Literal: tp │ │ +//! ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ │ +//! │ │ +//! │ Redirect │ Child +//! ā–¼ ā–¼ +//! ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” Child ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” +//! │ Argument: │ ◀─────── │ Literal: teleport │ +//! ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ +//! │ │ +//! │ Child │ Child +//! ā–¼ ā–¼ +//! ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” Child ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” +//! │ Argument: │ ◀─────── │ Argument: │ │ Argument: │ +//! ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ +//! │ +//! │ Child +//! ā–¼ +//! ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” +//! │ Argument: │ +//! ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ +//! ``` +//! If you want a cool graph of your own command graph you can use the display +//! trait on the [CommandGraph] struct. Then you can use a tool like +//! [Graphviz Online](https://dreampuf.github.io/GraphvizOnline) to look at the graph. + +use std::collections::HashMap; +use std::fmt::{Display, Formatter}; + +use petgraph::dot::Dot; +use petgraph::prelude::*; +use valence_server::protocol::packets::play::command_tree_s2c::{ + Node, NodeData, Parser, StringArg, +}; +use valence_server::protocol::packets::play::CommandTreeS2c; +use valence_server::protocol::VarInt; + +use crate::modifier_value::ModifierValue; +use crate::parsers::{CommandArg, ParseInput}; +use crate::{CommandRegistry, CommandScopeRegistry}; + +/// This struct is used to store the command graph. (see module level docs for +/// more info) +#[derive(Debug, Clone)] +pub struct CommandGraph { + pub graph: Graph, + pub root: NodeIndex, +} + +impl Default for CommandGraph { + fn default() -> Self { + Self::new() + } +} + +/// Output the graph in graphviz dot format to do visual debugging. (this was +/// used to make the cool graph in the module level docs) +impl Display for CommandGraph { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", Dot::new(&self.graph)) + } +} + +impl CommandGraph { + pub fn new() -> Self { + let mut graph = Graph::::new(); + let root = graph.add_node(CommandNode { + executable: false, + data: NodeData::Root, + scopes: vec![], + }); + + Self { graph, root } + } +} + +/// Data for the nodes in the graph (see module level docs for more info) +#[derive(Clone, Debug, PartialEq)] +pub struct CommandNode { + pub executable: bool, + pub data: NodeData, + pub scopes: Vec, +} + +impl Display for CommandNode { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match &self.data { + NodeData::Root => write!(f, "Root"), + NodeData::Literal { name } => write!(f, "Literal: {}", name), + NodeData::Argument { name, .. } => write!(f, "Argument: <{}>", name), + } + } +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Hash)] +pub enum CommandEdgeType { + Redirect, + Child, +} + +impl Display for CommandEdgeType { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match self { + CommandEdgeType::Redirect => write!(f, "Redirect"), + CommandEdgeType::Child => write!(f, "Child"), + } + } +} + +impl From for CommandTreeS2c { + fn from(command_graph: CommandGraph) -> Self { + let graph = command_graph.graph; + let nodes_and_edges = graph.into_nodes_edges(); + + let mut nodes: Vec = nodes_and_edges + .0 + .into_iter() + .map(|node| Node { + children: Vec::new(), + data: node.weight.data, + executable: node.weight.executable, + redirect_node: None, + }) + .collect(); + + let edges = nodes_and_edges.1; + + for edge in edges { + match edge.weight { + CommandEdgeType::Child => { + nodes[edge.source().index()] + .children + .push(VarInt::from(edge.target().index() as i32)); + } + CommandEdgeType::Redirect => { + nodes[edge.source().index()].redirect_node = + Some(VarInt::from(edge.target().index() as i32)); + } + } + } + + CommandTreeS2c { + commands: nodes, + root_index: VarInt::from(command_graph.root.index() as i32), + } + } +} + +/// Ergonomic builder pattern for adding executables, literals and arguments to +/// a command graph. See the derive macro for a more ergonomic way of doing this +/// for a basic command with an enum. +/// +/// # Type Parameters +/// * `T` - the type that should be constructed by an executable when the +/// command is executed +/// +/// # Example +/// ``` +/// use std::collections::HashMap; +/// use petgraph::visit::{EdgeCount, NodeCount}; +/// use valence_command::graph::{ +/// CommandGraph, CommandGraphBuilder +/// }; +/// use valence_command::{CommandRegistry}; +/// use valence_command::parsers::CommandArg; +/// +/// struct TestCommand { +/// test: i32, +/// } +/// +/// let mut command_graph = CommandRegistry::default(); +/// let mut executable_map = HashMap::new(); +/// let mut parser_map = HashMap::new(); +/// let mut modifier_map = HashMap::new(); +/// let mut command_graph_builder = CommandGraphBuilder::::new(&mut command_graph, &mut executable_map, &mut parser_map, &mut modifier_map); +/// +/// // simple command +/// let simple_command = command_graph_builder +/// .root() // transition to the root node +/// .literal("test") // add a literal node then transition to it +/// .argument("test") +/// // a player needs one of these scopes to execute the command +/// //(note: if you want an admin scope you should use the link method on the scope registry.) +/// .with_scopes(vec!["test:admin", "command:test"]) +/// .with_parser::() +/// // it is reasonably safe to unwrap here because we know that the argument is an integer +/// .with_executable(|args| TestCommand { test: i32::parse_arg(args).unwrap() }) +/// .id(); +/// +/// // complex command (redirects back to the simple command) +/// command_graph_builder +/// .root() +/// .literal("test") +/// .literal("command") +/// .redirect_to(simple_command); +/// +/// assert_eq!(command_graph.graph.graph.node_count(), 5); // root, test, command, , test +/// // 5 edges, 2 for the simple command, 2 for the complex command and 1 for the redirect +/// assert_eq!(command_graph.graph.graph.edge_count(), 5); +/// ``` +/// +/// in this example we can execute either of the following commands for the same +/// result: +/// - `/test test 1` +/// - `/test command test 1` +/// +/// the executables from these commands will both return a `TestCommand` with +/// the value `1` +#[allow(clippy::type_complexity)] +pub struct CommandGraphBuilder<'a, T> { + // We do not own the graph, we just have a mutable reference to it + graph: &'a mut CommandGraph, + current_node: NodeIndex, + executables: &'a mut HashMap T>, + parsers: &'a mut HashMap bool>, + modifiers: &'a mut HashMap)>, + scopes_added: Vec, /* we need to keep track of added scopes so we can add them to + * the registry later */ +} + +impl<'a, T> CommandGraphBuilder<'a, T> { + /// Creates a new command graph builder + /// + /// # Arguments + /// * registry - the command registry to add the commands to + /// * executables - the map of node indices to executable parser functions + #[allow(clippy::type_complexity)] + pub fn new( + registry: &'a mut CommandRegistry, + executables: &'a mut HashMap T>, + parsers: &'a mut HashMap bool>, + modifiers: &'a mut HashMap< + NodeIndex, + fn(String, &mut HashMap), + >, + ) -> Self { + CommandGraphBuilder { + current_node: registry.graph.root, + graph: &mut registry.graph, + executables, + parsers, + modifiers, + scopes_added: Vec::new(), + } + } + + /// Transitions to the root node. Use this to start building a new command + /// from root. + pub fn root(&mut self) -> &mut Self { + self.current_node = self.graph.root; + self + } + + /// Creates a new literal node and transitions to it. + /// + /// # Default Values + /// * executable - `false` + /// * scopes - `Vec::new()` + pub fn literal(&mut self, literal: impl Into) -> &mut Self { + let graph = &mut self.graph.graph; + let current_node = &mut self.current_node; + + let literal_node = graph.add_node(CommandNode { + executable: false, + data: NodeData::Literal { + name: literal.into(), + }, + scopes: Vec::new(), + }); + + graph.add_edge(*current_node, literal_node, CommandEdgeType::Child); + + *current_node = literal_node; + + self + } + + /// Creates a new argument node and transitions to it. + /// + /// # Default Values + /// * executable - `false` + /// * scopes - `Vec::new()` + /// * parser - `StringArg::SingleWord` + /// * suggestion - `None` + pub fn argument(&mut self, argument: impl Into) -> &mut Self { + let graph = &mut self.graph.graph; + let current_node = &mut self.current_node; + + let argument_node = graph.add_node(CommandNode { + executable: false, + data: NodeData::Argument { + name: argument.into(), + parser: Parser::String(StringArg::SingleWord), + suggestion: None, + }, + scopes: Vec::new(), + }); + + graph.add_edge(*current_node, argument_node, CommandEdgeType::Child); + + *current_node = argument_node; + + self + } + + /// Creates a new redirect edge from the current node to the node specified. + /// For info on what a redirect edge is, see the module level documentation. + /// + /// # Example + /// ``` + /// use std::collections::HashMap; + /// + /// use valence_command::graph::CommandGraphBuilder; + /// use valence_command::CommandRegistry; + /// + /// struct TestCommand; + /// + /// let mut command_graph = CommandRegistry::default(); + /// let mut executable_map = HashMap::new(); + /// let mut parser_map = HashMap::new(); + /// let mut modifier_map = HashMap::new(); + /// let mut command_graph_builder = CommandGraphBuilder::::new( + /// &mut command_graph, + /// &mut executable_map, + /// &mut parser_map, + /// &mut modifier_map, + /// ); + /// + /// let simple_command = command_graph_builder + /// .root() // transition to the root node + /// .literal("test") // add a literal node then transition to it + /// .id(); // get the id of the literal node + /// + /// command_graph_builder + /// .root() // transition to the root node + /// .literal("test") // add a literal node then transition to it + /// .literal("command") // add a literal node then transition to it + /// .redirect_to(simple_command); // redirect to the simple command + /// ``` + pub fn redirect_to(&mut self, node: NodeIndex) -> &mut Self { + let graph = &mut self.graph.graph; + let current_node = &mut self.current_node; + + graph.add_edge(*current_node, node, CommandEdgeType::Redirect); + + *current_node = node; + + self + } + + /// Sets up the executable function for the current node. This function will + /// be called when the command is executed and should parse the args and + /// return the `T` type. + /// + /// # Arguments + /// * executable - the executable function to add + /// + /// # Example + /// have a look at the example for [CommandGraphBuilder] + pub fn with_executable(&mut self, executable: fn(&mut ParseInput) -> T) -> &mut Self { + let graph = &mut self.graph.graph; + let current_node = &mut self.current_node; + + let node = graph.node_weight_mut(*current_node).unwrap(); + + node.executable = true; + self.executables.insert(*current_node, executable); + + self + } + + /// Adds a modifier to the current node + /// + /// # Arguments + /// * modifier - the modifier function to add + /// + /// # Example + /// ``` + /// use std::collections::HashMap; + /// + /// use valence_command::graph::CommandGraphBuilder; + /// use valence_command::CommandRegistry; + /// + /// struct TestCommand; + /// + /// let mut command_graph = CommandRegistry::default(); + /// let mut executable_map = HashMap::new(); + /// let mut parser_map = HashMap::new(); + /// let mut modifier_map = HashMap::new(); + /// let mut command_graph_builder = + /// CommandGraphBuilder::::new(&mut command_graph, &mut executable_map, &mut parser_map, &mut modifier_map); + /// + /// command_graph_builder + /// .root() // transition to the root node + /// .literal("test") // add a literal node then transition to it + /// .with_modifier(|_, modifiers| { + /// modifiers.insert("test".into(), "test".into()); // this will trigger when the node is passed + /// }) + /// .literal("command") // add a literal node then transition to it + /// .with_executable(|_| TestCommand); + /// ``` + pub fn with_modifier( + &mut self, + modifier: fn(String, &mut HashMap), + ) -> &mut Self { + let current_node = &mut self.current_node; + + self.modifiers.insert(*current_node, modifier); + + self + } + + /// Sets the required scopes for the current node + /// + /// # Arguments + /// * scopes - a list of scopes for that are aloud to access a command node + /// and its children (list of strings following the system described in + /// [command_scopes](crate::scopes)) + pub fn with_scopes(&mut self, scopes: Vec>) -> &mut Self { + let graph = &mut self.graph.graph; + let current_node = &mut self.current_node; + + let node = graph.node_weight_mut(*current_node).unwrap(); + + node.scopes = scopes.into_iter().map(|s| s.into()).collect(); + self.scopes_added.extend(node.scopes.clone()); + + self + } + + /// Applies the scopes to the registry + /// + /// # Arguments + /// * registry - the registry to apply the scopes to + pub fn apply_scopes(&mut self, registry: &mut CommandScopeRegistry) -> &mut Self { + for scope in self.scopes_added.clone() { + registry.add_scope(scope); + } + self.scopes_added.clear(); + self + } + + /// Sets the parser for the current node. This will decide how the argument + /// is parsed client side and will be used to check the argument before + /// it is passed to the executable. The node should be an argument node + /// or nothing will happen. + /// + /// # Type Parameters + /// * `P` - the parser to use for the current node (must be [CommandArg]) + pub fn with_parser(&mut self) -> &mut Self { + let graph = &mut self.graph.graph; + let current_node = self.current_node; + + let node = graph.node_weight_mut(current_node).unwrap(); + self.parsers + .insert(current_node, |input| P::parse_arg(input).is_ok()); + + let parser = P::display(); + + node.data = match node.data.clone() { + NodeData::Argument { + name, suggestion, .. + } => NodeData::Argument { + name, + parser, + suggestion, + }, + NodeData::Literal { name } => NodeData::Literal { name }, + NodeData::Root => NodeData::Root, + }; + + self + } + + /// Transitions to the node specified. + pub fn at(&mut self, node: NodeIndex) -> &mut Self { + self.current_node = node; + self + } + + /// Gets the id of the current node (useful for commands that have multiple + /// children). + pub fn id(&self) -> NodeIndex { + self.current_node + } +} diff --git a/vendor/valence/crates/valence_command/src/handler.rs b/vendor/valence/crates/valence_command/src/handler.rs new file mode 100644 index 00000000..59bfda3e --- /dev/null +++ b/vendor/valence/crates/valence_command/src/handler.rs @@ -0,0 +1,126 @@ +use std::collections::HashMap; +use std::marker::PhantomData; + +use bevy_app::{App, Plugin, PostStartup}; +use bevy_ecs::change_detection::ResMut; +use bevy_ecs::event::{Event, EventReader, EventWriter}; +use bevy_ecs::prelude::{Entity, IntoSystemConfigs, Resource}; +use petgraph::prelude::NodeIndex; +use valence_server::EventLoopPreUpdate; + +use crate::graph::CommandGraphBuilder; +use crate::modifier_value::ModifierValue; +use crate::parsers::ParseInput; +use crate::{ + Command, CommandProcessedEvent, CommandRegistry, CommandScopeRegistry, CommandSystemSet, +}; + +impl Plugin for CommandHandlerPlugin +where + T: Command + Send + Sync + 'static, +{ + fn build(&self, app: &mut App) { + app.add_event::>() + .insert_resource(CommandResource::::new()) + .add_systems(PostStartup, command_startup_system::) + .add_systems( + EventLoopPreUpdate, + command_event_system::.after(CommandSystemSet), + ); + } +} + +pub struct CommandHandlerPlugin +where + T: Command, +{ + command: PhantomData, +} + +impl Default for CommandHandlerPlugin { + fn default() -> Self { + Self::new() + } +} + +impl CommandHandlerPlugin +where + T: Command, +{ + pub fn new() -> Self { + CommandHandlerPlugin { + command: PhantomData, + } + } +} + +#[derive(Resource)] +struct CommandResource { + command: PhantomData, + executables: HashMap T>, +} + +impl CommandResource { + pub fn new() -> Self { + CommandResource { + command: PhantomData, + executables: HashMap::new(), + } + } +} + +#[derive(Event)] +pub struct CommandResultEvent +where + T: Command, + T: Send + Sync + 'static, +{ + pub result: T, + pub executor: Entity, + pub modifiers: HashMap, +} + +fn command_startup_system( + mut registry: ResMut, + mut scope_registry: ResMut, + mut command: ResMut>, +) where + T: Command + Send + Sync + 'static, +{ + let mut executables = HashMap::new(); + let mut parsers = HashMap::new(); + let mut modifiers = HashMap::new(); + let graph_builder = &mut CommandGraphBuilder::new( + &mut registry, + &mut executables, + &mut parsers, + &mut modifiers, + ); + T::assemble_graph(graph_builder); + graph_builder.apply_scopes(&mut scope_registry); + + command.executables.extend(executables.clone()); + registry.parsers.extend(parsers); + registry.modifiers.extend(modifiers); + registry.executables.extend(executables.keys()); +} + +/// This system reads incoming command events. +fn command_event_system( + mut commands_executed: EventReader, + mut events: EventWriter>, + command: ResMut>, +) where + T: Command + Send + Sync, +{ + for command_event in commands_executed.read() { + if let Some(executable) = command.executables.get(&command_event.node) { + let result = executable(&mut ParseInput::new(&command_event.command)); + events.send(CommandResultEvent { + result, + executor: command_event.executor, + modifiers: command_event.modifiers.clone(), + }); + } + } +} diff --git a/vendor/valence/crates/valence_command/src/lib.rs b/vendor/valence/crates/valence_command/src/lib.rs new file mode 100644 index 00000000..03c1017d --- /dev/null +++ b/vendor/valence/crates/valence_command/src/lib.rs @@ -0,0 +1,48 @@ +pub mod graph; +pub mod handler; +pub mod manager; +mod modifier_value; +pub mod parsers; +pub mod scopes; + +use std::collections::{HashMap, HashSet}; +use std::fmt::Debug; + +use bevy_app::App; +use bevy_ecs::prelude::{Resource, SystemSet}; +pub use manager::{CommandExecutionEvent, CommandProcessedEvent}; +pub use modifier_value::ModifierValue; +use petgraph::prelude::NodeIndex; +pub use scopes::CommandScopeRegistry; + +use crate::graph::{CommandGraph, CommandGraphBuilder}; +use crate::handler::CommandHandlerPlugin; +use crate::parsers::ParseInput; + +#[derive(SystemSet, Clone, PartialEq, Eq, Hash, Debug)] +pub struct CommandSystemSet; + +#[derive(Resource, Default)] +#[allow(clippy::type_complexity)] +pub struct CommandRegistry { + pub graph: CommandGraph, + pub parsers: HashMap bool>, + pub modifiers: HashMap)>, + pub executables: HashSet, +} + +pub trait Command { + fn assemble_graph(graph: &mut CommandGraphBuilder) + where + Self: Sized; +} + +pub trait AddCommand { + fn add_command(&mut self) -> &mut Self; +} + +impl AddCommand for App { + fn add_command(&mut self) -> &mut Self { + self.add_plugins(CommandHandlerPlugin::::new()) + } +} diff --git a/vendor/valence/crates/valence_command/src/manager.rs b/vendor/valence/crates/valence_command/src/manager.rs new file mode 100644 index 00000000..bea073a7 --- /dev/null +++ b/vendor/valence/crates/valence_command/src/manager.rs @@ -0,0 +1,418 @@ +use std::collections::{HashMap, HashSet}; + +use bevy_app::{App, Plugin, PreUpdate}; +use bevy_ecs::entity::Entity; +use bevy_ecs::prelude::{ + Added, Changed, Commands, DetectChanges, Event, EventReader, EventWriter, IntoSystemConfigs, + Mut, Or, Query, Res, +}; +use petgraph::graph::NodeIndex; +use petgraph::prelude::EdgeRef; +use petgraph::{Direction, Graph}; +use tracing::{debug, warn}; +use valence_server::client::{Client, SpawnClientsSet}; +use valence_server::event_loop::PacketEvent; +use valence_server::protocol::packets::play::command_tree_s2c::NodeData; +use valence_server::protocol::packets::play::{CommandExecutionC2s, CommandTreeS2c}; +use valence_server::protocol::WritePacket; +use valence_server::EventLoopPreUpdate; + +use crate::graph::{CommandEdgeType, CommandGraph, CommandNode}; +use crate::parsers::ParseInput; +use crate::scopes::{CommandScopePlugin, CommandScopes}; +use crate::{CommandRegistry, CommandScopeRegistry, CommandSystemSet, ModifierValue}; + +pub struct CommandPlugin; + +impl Plugin for CommandPlugin { + fn build(&self, app: &mut App) { + app.add_plugins(CommandScopePlugin) + .add_event::() + .add_event::() + .add_systems(PreUpdate, insert_scope_component.after(SpawnClientsSet)) + .add_systems( + EventLoopPreUpdate, + ( + update_command_tree, + command_tree_update_with_client, + read_incoming_packets.before(CommandSystemSet), + parse_incoming_commands.in_set(CommandSystemSet), + ), + ); + + let graph: CommandGraph = CommandGraph::new(); + let modifiers = HashMap::new(); + let parsers = HashMap::new(); + let executables = HashSet::new(); + + app.insert_resource(CommandRegistry { + graph, + modifiers, + parsers, + executables, + }); + } +} + +/// This event is sent when a command is sent (you can send this with any +/// entity) +#[derive(Debug, Clone, PartialEq, Eq, Hash, Event)] +pub struct CommandExecutionEvent { + /// the command that was executed eg. "teleport @p 0 ~ 0" + pub command: String, + /// usually the Client entity but it could be a command block or something + /// (whatever the library user wants) + pub executor: Entity, +} + +/// This will only be sent if the command was successfully parsed and an +/// executable was found +#[derive(Debug, Clone, PartialEq, Eq, Event)] +pub struct CommandProcessedEvent { + /// the command that was executed eg. "teleport @p 0 ~ 0" + pub command: String, + /// usually the Client entity but it could be a command block or something + /// (whatever the library user wants) + pub executor: Entity, + /// the modifiers that were applied to the command + pub modifiers: HashMap, + /// the node that was executed + pub node: NodeIndex, +} + +fn insert_scope_component(mut clients: Query>, mut commands: Commands) { + for client in clients.iter_mut() { + commands.entity(client).insert(CommandScopes::new()); + } +} + +fn read_incoming_packets( + mut packets: EventReader, + mut event_writer: EventWriter, +) { + for packet in packets.read() { + let client = packet.client; + if let Some(packet) = packet.decode::() { + event_writer.send(CommandExecutionEvent { + command: packet.command.to_string(), + executor: client, + }); + } + } +} + +#[allow(clippy::type_complexity)] +fn command_tree_update_with_client( + command_registry: Res, + scope_registry: Res, + mut updated_clients: Query< + (&mut Client, &CommandScopes), + Or<(Added, Changed)>, + >, +) { + update_client_command_tree( + &command_registry, + scope_registry, + &mut updated_clients.iter_mut().collect(), + ); +} + +fn update_command_tree( + command_registry: Res, + scope_registry: Res, + mut clients: Query<(&mut Client, &CommandScopes)>, +) { + if command_registry.is_changed() { + update_client_command_tree( + &command_registry, + scope_registry, + &mut clients.iter_mut().collect(), + ); + } +} + +fn update_client_command_tree( + command_registry: &Res, + scope_registry: Res, + updated_clients: &mut Vec<(Mut, &CommandScopes)>, +) { + for (ref mut client, client_scopes) in updated_clients { + let time = std::time::Instant::now(); + + let old_graph = &command_registry.graph; + let mut new_graph = Graph::new(); + + // collect a new graph into only nodes that are allowed to be executed + let root = old_graph.root; + + let mut to_visit = vec![(None, root)]; + let mut already_visited = HashSet::new(); // prevent recursion + let mut old_to_new = HashMap::new(); + let mut new_root = None; + + while let Some((parent, node)) = to_visit.pop() { + if already_visited.contains(&(parent.map(|(_, edge)| edge), node)) { + continue; + } + already_visited.insert((parent.map(|(_, edge)| edge), node)); + let node_scopes = &old_graph.graph[node].scopes; + if !node_scopes.is_empty() { + let mut has_scope = false; + for scope in node_scopes { + if scope_registry.any_grants( + &client_scopes.0.iter().map(|scope| scope.as_str()).collect(), + scope, + ) { + has_scope = true; + break; + } + } + if !has_scope { + continue; + } + } + + let new_node = *old_to_new + .entry(node) + .or_insert_with(|| new_graph.add_node(old_graph.graph[node].clone())); + + for neighbor in old_graph.graph.edges_directed(node, Direction::Outgoing) { + to_visit.push((Some((new_node, neighbor.weight())), neighbor.target())); + } + + if let Some(parent) = parent { + new_graph.add_edge(parent.0, new_node, *parent.1); + } else { + new_root = Some(new_node); + } + } + + match new_root { + Some(new_root) => { + let command_graph = CommandGraph { + graph: new_graph, + root: new_root, + }; + let packet: CommandTreeS2c = command_graph.into(); + + client.write_packet(&packet); + } + None => { + warn!( + "Client has no permissions to execute any commands so we sent them nothing. \ + It is generally a bad idea to scope the root node of the command graph as it \ + can cause undefined behavior. For example, if the player has permission to \ + execute a command before you change the scope of the root node, the packet \ + will not be sent to the client and so the client will still think they can \ + execute the command." + ) + } + } + + debug!("command tree update took {:?}", time.elapsed()); + } +} + +fn parse_incoming_commands( + mut event_reader: EventReader, + mut event_writer: EventWriter, + command_registry: Res, + scope_registry: Res, + entity_scopes: Query<&CommandScopes>, +) { + for command_event in event_reader.read() { + let executor = command_event.executor; + // these are the leafs of the graph that are executable under this command + // group + let executable_leafs = command_registry + .executables + .iter() + .collect::>(); + let root = command_registry.graph.root; + + let command_input = &*command_event.command; + let graph = &command_registry.graph.graph; + let input = ParseInput::new(command_input); + + let mut to_be_executed = Vec::new(); + + let mut args = Vec::new(); + let mut modifiers_to_be_executed = Vec::new(); + + parse_command_args( + &mut args, + &mut modifiers_to_be_executed, + input, + graph, + &executable_leafs, + command_registry.as_ref(), + &mut to_be_executed, + root, + executor, + &entity_scopes, + scope_registry.as_ref(), + false, + ); + + let mut modifiers = HashMap::new(); + for (node, modifier) in modifiers_to_be_executed { + command_registry.modifiers.get(&node).unwrap()(modifier, &mut modifiers); + } + + debug!("Command processed: /{}", command_event.command); + + for node in to_be_executed { + println!("executing node: {:?}", node); + event_writer.send(CommandProcessedEvent { + command: args.join(" "), + executor, + modifiers: modifiers.clone(), + node, + }); + } + } +} + +#[allow(clippy::too_many_arguments)] +/// recursively parse the command args. +fn parse_command_args( + command_args: &mut Vec, + modifiers_to_be_executed: &mut Vec<(NodeIndex, String)>, + mut input: ParseInput, + graph: &Graph, + executable_leafs: &[&NodeIndex], + command_registry: &CommandRegistry, + to_be_executed: &mut Vec, + current_node: NodeIndex, + executor: Entity, + scopes: &Query<&CommandScopes>, + scope_registry: &CommandScopeRegistry, + coming_from_redirect: bool, +) -> bool { + let node_scopes = &graph[current_node].scopes; + let default_scopes = CommandScopes::new(); + let client_scopes: Vec<&str> = scopes + .get(executor) + .unwrap_or(&default_scopes) + .0 + .iter() + .map(|scope| scope.as_str()) + .collect(); + // if empty, we assume the node is global + if !node_scopes.is_empty() { + let mut has_scope = false; + for scope in node_scopes { + if scope_registry.any_grants(&client_scopes, scope) { + has_scope = true; + break; + } + } + if !has_scope { + return false; + } + } + + if !coming_from_redirect { + // we want to skip whitespace before matching the node + input.skip_whitespace(); + match &graph[current_node].data { + // no real need to check for root node + NodeData::Root => { + if command_registry.modifiers.contains_key(¤t_node) { + modifiers_to_be_executed.push((current_node, String::new())); + } + } + // if the node is a literal, we want to match the name of the literal + // to the input + NodeData::Literal { name } => { + match input.match_next(name) { + true => { + if !input.match_next(" ") && !input.is_done() { + return false; + } // we want to pop the whitespace after the literal + if command_registry.modifiers.contains_key(¤t_node) { + modifiers_to_be_executed.push((current_node, String::new())); + } + } + false => return false, + } + } + // if the node is an argument, we want to parse the argument + NodeData::Argument { .. } => { + let parser = match command_registry.parsers.get(¤t_node) { + Some(parser) => parser, + None => { + return false; + } + }; + // we want to save the input before and after parsing + // this is so we can save the argument to the command args + let pre_input = input.clone().into_inner(); + let valid = parser(&mut input); + if valid { + // If input.len() > pre_input.len() the parser replaced the input + let Some(arg) = pre_input + .get(..pre_input.len().wrapping_sub(input.len())) + .map(|s| s.to_string()) + else { + panic!( + "Parser replaced input with another string. This is not allowed. \ + Attempting to parse: {}", + input.into_inner() + ); + }; + + if command_registry.modifiers.contains_key(¤t_node) { + modifiers_to_be_executed.push((current_node, arg.clone())); + } + command_args.push(arg); + } else { + return false; + } + } + } + } else { + command_args.clear(); + } + + input.skip_whitespace(); + if input.is_done() && executable_leafs.contains(&¤t_node) { + to_be_executed.push(current_node); + return true; + } + + let mut all_invalid = true; + for neighbor in graph.neighbors(current_node) { + let pre_input = input.clone(); + let mut args = command_args.clone(); + let mut modifiers = modifiers_to_be_executed.clone(); + let valid = parse_command_args( + &mut args, + &mut modifiers, + input.clone(), + graph, + executable_leafs, + command_registry, + to_be_executed, + neighbor, + executor, + scopes, + scope_registry, + { + let edge = graph.find_edge(current_node, neighbor).unwrap(); + matches!(&graph[edge], CommandEdgeType::Redirect) + }, + ); + if valid { + *command_args = args; + *modifiers_to_be_executed = modifiers; + all_invalid = false; + } else { + input = pre_input; + } + } + if all_invalid { + return false; + } + true +} diff --git a/vendor/valence/crates/valence_command/src/modifier_value.rs b/vendor/valence/crates/valence_command/src/modifier_value.rs new file mode 100644 index 00000000..811e6e96 --- /dev/null +++ b/vendor/valence/crates/valence_command/src/modifier_value.rs @@ -0,0 +1,219 @@ +use std::cmp::Ordering; +use std::collections::{BTreeMap, HashMap}; +use std::hash::{Hash, Hasher}; + +use ordered_float::OrderedFloat; + +/// Used to store keys values for command modifiers. Heavily inspired by +/// serde-value. +#[derive(Clone, Debug)] +pub enum ModifierValue { + Bool(bool), + + U8(u8), + U16(u16), + U32(u32), + U64(u64), + + I8(i8), + I16(i16), + I32(i32), + I64(i64), + + F32(f32), + F64(f64), + + Char(char), + String(String), + + Unit, + Option(Option>), + Seq(Vec), + Map(BTreeMap), +} + +#[allow(clippy::unit_hash)] +impl Hash for ModifierValue { + fn hash(&self, hasher: &mut H) + where + H: Hasher, + { + self.discriminant().hash(hasher); + match *self { + ModifierValue::Bool(v) => v.hash(hasher), + ModifierValue::U8(v) => v.hash(hasher), + ModifierValue::U16(v) => v.hash(hasher), + ModifierValue::U32(v) => v.hash(hasher), + ModifierValue::U64(v) => v.hash(hasher), + ModifierValue::I8(v) => v.hash(hasher), + ModifierValue::I16(v) => v.hash(hasher), + ModifierValue::I32(v) => v.hash(hasher), + ModifierValue::I64(v) => v.hash(hasher), + ModifierValue::F32(v) => OrderedFloat(v).hash(hasher), + ModifierValue::F64(v) => OrderedFloat(v).hash(hasher), + ModifierValue::Char(v) => v.hash(hasher), + ModifierValue::String(ref v) => v.hash(hasher), + ModifierValue::Unit => ().hash(hasher), + ModifierValue::Option(ref v) => v.hash(hasher), + ModifierValue::Seq(ref v) => v.hash(hasher), + ModifierValue::Map(ref v) => v.hash(hasher), + } + } +} + +impl PartialEq for ModifierValue { + fn eq(&self, rhs: &Self) -> bool { + match (self, rhs) { + (&ModifierValue::Bool(v0), &ModifierValue::Bool(v1)) if v0 == v1 => true, + (&ModifierValue::U8(v0), &ModifierValue::U8(v1)) if v0 == v1 => true, + (&ModifierValue::U16(v0), &ModifierValue::U16(v1)) if v0 == v1 => true, + (&ModifierValue::U32(v0), &ModifierValue::U32(v1)) if v0 == v1 => true, + (&ModifierValue::U64(v0), &ModifierValue::U64(v1)) if v0 == v1 => true, + (&ModifierValue::I8(v0), &ModifierValue::I8(v1)) if v0 == v1 => true, + (&ModifierValue::I16(v0), &ModifierValue::I16(v1)) if v0 == v1 => true, + (&ModifierValue::I32(v0), &ModifierValue::I32(v1)) if v0 == v1 => true, + (&ModifierValue::I64(v0), &ModifierValue::I64(v1)) if v0 == v1 => true, + (&ModifierValue::F32(v0), &ModifierValue::F32(v1)) + if OrderedFloat(v0) == OrderedFloat(v1) => + { + true + } + (&ModifierValue::F64(v0), &ModifierValue::F64(v1)) + if OrderedFloat(v0) == OrderedFloat(v1) => + { + true + } + (&ModifierValue::Char(v0), &ModifierValue::Char(v1)) if v0 == v1 => true, + (ModifierValue::String(v0), ModifierValue::String(v1)) if v0 == v1 => true, + (ModifierValue::Unit, ModifierValue::Unit) => true, + (ModifierValue::Option(v0), ModifierValue::Option(v1)) if v0 == v1 => true, + (ModifierValue::Seq(v0), ModifierValue::Seq(v1)) if v0 == v1 => true, + (ModifierValue::Map(v0), ModifierValue::Map(v1)) if v0 == v1 => true, + _ => false, + } + } +} + +impl Ord for ModifierValue { + fn cmp(&self, rhs: &Self) -> Ordering { + match (self, rhs) { + (&ModifierValue::Bool(v0), ModifierValue::Bool(v1)) => v0.cmp(v1), + (&ModifierValue::U8(v0), ModifierValue::U8(v1)) => v0.cmp(v1), + (&ModifierValue::U16(v0), ModifierValue::U16(v1)) => v0.cmp(v1), + (&ModifierValue::U32(v0), ModifierValue::U32(v1)) => v0.cmp(v1), + (&ModifierValue::U64(v0), ModifierValue::U64(v1)) => v0.cmp(v1), + (&ModifierValue::I8(v0), ModifierValue::I8(v1)) => v0.cmp(v1), + (&ModifierValue::I16(v0), ModifierValue::I16(v1)) => v0.cmp(v1), + (&ModifierValue::I32(v0), ModifierValue::I32(v1)) => v0.cmp(v1), + (&ModifierValue::I64(v0), ModifierValue::I64(v1)) => v0.cmp(v1), + (&ModifierValue::F32(v0), &ModifierValue::F32(v1)) => { + OrderedFloat(v0).cmp(&OrderedFloat(v1)) + } + (&ModifierValue::F64(v0), &ModifierValue::F64(v1)) => { + OrderedFloat(v0).cmp(&OrderedFloat(v1)) + } + (ModifierValue::Char(v0), ModifierValue::Char(ref v1)) => v0.cmp(v1), + (ModifierValue::String(ref v0), ModifierValue::String(ref v1)) => v0.cmp(v1), + (ModifierValue::Unit, &ModifierValue::Unit) => Ordering::Equal, + (ModifierValue::Option(ref v0), ModifierValue::Option(ref v1)) => v0.cmp(v1), + (ModifierValue::Seq(ref v0), ModifierValue::Seq(ref v1)) => v0.cmp(v1), + (ModifierValue::Map(ref v0), ModifierValue::Map(ref v1)) => v0.cmp(v1), + (v0, v1) => v0.discriminant().cmp(&v1.discriminant()), + } + } +} + +impl ModifierValue { + fn discriminant(&self) -> usize { + match *self { + ModifierValue::Bool(..) => 0, + ModifierValue::U8(..) => 1, + ModifierValue::U16(..) => 2, + ModifierValue::U32(..) => 3, + ModifierValue::U64(..) => 4, + ModifierValue::I8(..) => 5, + ModifierValue::I16(..) => 6, + ModifierValue::I32(..) => 7, + ModifierValue::I64(..) => 8, + ModifierValue::F32(..) => 9, + ModifierValue::F64(..) => 10, + ModifierValue::Char(..) => 11, + ModifierValue::String(..) => 12, + ModifierValue::Unit => 13, + ModifierValue::Option(..) => 14, + ModifierValue::Seq(..) => 16, + ModifierValue::Map(..) => 17, + } + } +} + +impl Eq for ModifierValue {} +impl PartialOrd for ModifierValue { + fn partial_cmp(&self, rhs: &Self) -> Option { + Some(self.cmp(rhs)) + } +} + +macro_rules! impl_from { + ($ty:ty, $variant:ident) => { + impl From<$ty> for ModifierValue { + fn from(v: $ty) -> Self { + ModifierValue::$variant(v) + } + } + }; +} + +impl_from!(bool, Bool); + +impl_from!(u8, U8); +impl_from!(u16, U16); +impl_from!(u32, U32); +impl_from!(u64, U64); + +impl_from!(i8, I8); +impl_from!(i16, I16); +impl_from!(i32, I32); +impl_from!(i64, I64); + +impl_from!(f32, F32); +impl_from!(f64, F64); + +impl_from!(char, Char); +impl_from!(String, String); + +impl From<&str> for ModifierValue { + fn from(v: &str) -> Self { + ModifierValue::String(v.to_owned()) + } +} + +impl From<()> for ModifierValue { + fn from(_: ()) -> Self { + ModifierValue::Unit + } +} + +impl From> for ModifierValue { + fn from(v: Option) -> Self { + ModifierValue::Option(v.map(Box::new)) + } +} + +impl> From> for ModifierValue { + fn from(v: Vec) -> Self { + ModifierValue::Seq(v.into_iter().map(Into::into).collect()) + } +} + +impl, V: Into> From> for ModifierValue { + fn from(v: BTreeMap) -> Self { + ModifierValue::Map(v.into_iter().map(|(k, v)| (k.into(), v.into())).collect()) + } +} + +impl, V: Into> From> for ModifierValue { + fn from(v: HashMap) -> Self { + ModifierValue::Map(v.into_iter().map(|(k, v)| (k.into(), v.into())).collect()) + } +} diff --git a/vendor/valence/crates/valence_command/src/parsers.rs b/vendor/valence/crates/valence_command/src/parsers.rs new file mode 100644 index 00000000..956b70ee --- /dev/null +++ b/vendor/valence/crates/valence_command/src/parsers.rs @@ -0,0 +1,309 @@ +//! A collection of parses for use in command argument nodes. +pub mod angle; +pub mod block_pos; +pub mod bool; +pub mod color; +pub mod column_pos; +pub mod entity_anchor; +pub mod entity_selector; +pub mod gamemode; +pub mod inventory_slot; +pub mod numbers; +pub mod rotation; +pub mod score_holder; +pub mod strings; +pub mod swizzle; +pub mod time; +pub mod vec2; +pub mod vec3; + +use std::ops::Add; + +pub use block_pos::BlockPos; +pub use column_pos::ColumnPos; +pub use entity_anchor::EntityAnchor; +pub use entity_selector::EntitySelector; +pub use inventory_slot::InventorySlot; +pub use rotation::Rotation; +pub use score_holder::ScoreHolder; +pub use strings::{GreedyString, QuotableString}; +pub use swizzle::Swizzle; +use thiserror::Error; +pub use time::Time; +use tracing::error; +pub(crate) use valence_server::protocol::packets::play::command_tree_s2c::Parser; +pub use vec2::Vec2; +pub use vec3::Vec3; + +pub trait CommandArg: Sized { + fn arg_from_str(string: &str) -> Result { + Self::parse_arg(&mut ParseInput::new(string)) + } + + fn parse_arg(input: &mut ParseInput) -> Result; + /// what will the client be sent + fn display() -> Parser; +} + +/// +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ParseInput<'a>(&'a str); + +impl<'a> ParseInput<'a> { + fn advance(&mut self) { + self.advance_n_chars(1); + } + + fn advance_n_chars(&mut self, n: usize) { + if self.is_done() { + return; + } + match self.0.char_indices().nth(n) { + Some((len, _)) => { + self.0 = &self.0[len..]; + } + None => { + self.0 = &self.0[self.0.len()..]; + } + } + } + + fn advance_n_bytes(&mut self, n: usize) { + if self.is_done() { + return; + } + self.0 = &self.0[n..]; + } + pub fn new(input: &'a str) -> Self { + ParseInput(input) + } + + /// Returns the next character without advancing the input + pub fn peek(&self) -> Option { + self.0.chars().next() + } + + /// Returns the next n characters without advancing the input + pub fn peek_n(&self, n: usize) -> &'a str { + self.0 + .char_indices() + .nth(n) + .map(|(idx, _)| &self.0[..idx]) + .unwrap_or(self.0) + } + + /// Returns the next word without advancing the input + pub fn peek_word(&self) -> &'a str { + self.0 + .char_indices() + .find(|(_, c)| c.is_whitespace()) + .map(|(idx, _)| &self.0[..idx]) + .unwrap_or(self.0) + } + + /// Checks if the input is empty + pub fn is_done(&self) -> bool { + self.0.is_empty() + } + + /// Returns the next character and advances the input + pub fn pop(&mut self) -> Option { + let c = self.peek()?; + self.advance(); + Some(c) + } + + /// Returns the next n characters and advances the input + pub fn pop_n(&mut self, n: usize) -> &str { + let s = self.peek_n(n); + self.advance_n_bytes(s.len()); + s + } + + /// Returns the next word and advances the input + pub fn pop_word(&mut self) -> &str { + let s = self.peek_word(); + self.advance_n_bytes(s.len()); + s + } + + /// Returns the rest of the input and advances the input + pub fn pop_all(&mut self) -> Option<&str> { + let s = self.0; + self.advance_n_bytes(self.0.len()); + Some(s) + } + + /// Returns the next word and advances the input + pub fn pop_to_next(&mut self, c: char) -> Option<&str> { + let pos = self.0.find(c)?; + let s = &self.0[..pos]; + self.advance_n_bytes(pos); + Some(s) + } + + /// Matches the case-insensitive string and advances the input if it matches + pub fn match_next(&mut self, string: &str) -> bool { + if self + .0 + .to_lowercase() + .starts_with(string.to_lowercase().as_str()) + { + self.advance_n_bytes(string.len()); + true + } else { + false + } + } + + /// Skip all whitespace at the front of the input + pub fn skip_whitespace(&mut self) { + while let Some(c) = self.peek() { + if c.is_whitespace() { + self.advance(); + } else { + break; + } + } + } + + /// Set the inner string + pub fn into_inner(self) -> &'a str { + self.0 + } + + #[allow(clippy::len_without_is_empty)] + pub fn len(&self) -> usize { + self.0.len() + } +} + +#[test] +fn test_parse_input() { + let mut input = ParseInput::new("The QuIck brown FOX jumps over the lazy dog"); + assert_eq!(input.peek(), Some('T')); + assert_eq!(input.peek_n(0), ""); + assert_eq!(input.peek_n(1), "T"); + assert_eq!(input.peek_n(2), "Th"); + assert_eq!(input.peek_n(3), "The"); + + assert_eq!(input.peek_word(), "The"); + input.pop_word(); + input.skip_whitespace(); + assert_eq!(input.peek_word(), "QuIck"); + + assert!(input.match_next("quick")); + input.pop(); + assert_eq!(input.peek_word(), "brown"); + + assert!(input.match_next("brown fox")); + assert_eq!(input.pop_all(), Some(" jumps over the lazy dog")); +} + +#[derive(Debug, Error)] +pub enum CommandArgParseError { + // these should be player facing and not disclose internal information + #[error("invalid argument, expected {expected} got {got}")] // e.g. "integer" number + InvalidArgument { expected: String, got: String }, + #[error("invalid argument length")] + InvalidArgLength, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum AbsoluteOrRelative { + Absolute(T), + Relative(T), // current value + T +} + +impl AbsoluteOrRelative +where + T: Add + Copy, +{ + pub fn get(&self, original: T) -> T { + match self { + Self::Absolute(num) => *num, + Self::Relative(num) => *num + original, + } + } +} + +impl CommandArg for AbsoluteOrRelative +where + T: CommandArg + Default, +{ + fn parse_arg(input: &mut ParseInput) -> Result { + input.skip_whitespace(); + if input.peek() == Some('~') { + input.advance(); + if input.peek() == Some(' ') || input.peek().is_none() { + Ok(AbsoluteOrRelative::Relative(T::default())) + } else { + Ok(AbsoluteOrRelative::Relative(T::parse_arg(input)?)) + } + } else if input.peek() == Some(' ') || input.peek().is_none() { + Err(CommandArgParseError::InvalidArgLength) + } else { + Ok(AbsoluteOrRelative::Absolute(T::parse_arg(input)?)) + } + } + + fn display() -> Parser { + T::display() + } +} + +#[test] +fn test_absolute_or_relative() { + let mut input = ParseInput::new("~"); + assert_eq!( + AbsoluteOrRelative::::parse_arg(&mut input).unwrap(), + AbsoluteOrRelative::Relative(0) + ); + assert!(input.is_done()); + + let mut input = ParseInput::new("~1"); + assert_eq!( + AbsoluteOrRelative::::parse_arg(&mut input).unwrap(), + AbsoluteOrRelative::Relative(1) + ); + assert!(input.is_done()); + + let mut input = ParseInput::new("~1.5"); + assert_eq!( + AbsoluteOrRelative::::parse_arg(&mut input).unwrap(), + AbsoluteOrRelative::Relative(1.5) + ); + assert!(input.is_done()); + + let mut input = ParseInput::new("1"); + assert_eq!( + AbsoluteOrRelative::::parse_arg(&mut input).unwrap(), + AbsoluteOrRelative::Absolute(1) + ); + assert!(input.is_done()); + + let mut input = ParseInput::new("1.5 "); + assert_eq!( + AbsoluteOrRelative::::parse_arg(&mut input).unwrap(), + AbsoluteOrRelative::Absolute(1.5) + ); + assert!(!input.is_done()); + + let mut input = ParseInput::new("1.5 2"); + assert_eq!( + AbsoluteOrRelative::::parse_arg(&mut input).unwrap(), + AbsoluteOrRelative::Absolute(1.5) + ); + assert!(!input.is_done()); + assert_eq!( + AbsoluteOrRelative::::parse_arg(&mut input).unwrap(), + AbsoluteOrRelative::Absolute(2.0) + ); + assert!(input.is_done()); +} + +impl Default for AbsoluteOrRelative { + fn default() -> Self { + AbsoluteOrRelative::Absolute(T::default()) + } +} diff --git a/vendor/valence/crates/valence_command/src/parsers/angle.rs b/vendor/valence/crates/valence_command/src/parsers/angle.rs new file mode 100644 index 00000000..f2c69fee --- /dev/null +++ b/vendor/valence/crates/valence_command/src/parsers/angle.rs @@ -0,0 +1,20 @@ +use bevy_derive::Deref; + +use super::Parser; +use crate::parsers::{CommandArg, CommandArgParseError, ParseInput}; + +#[derive(Debug, Clone, Copy, PartialEq, Default, Deref)] +pub struct Angle(pub f32); + +impl CommandArg for Angle { + fn parse_arg(input: &mut ParseInput) -> Result { + input.skip_whitespace(); + let angle = f32::parse_arg(input)?; + + Ok(Angle(angle)) + } + + fn display() -> Parser { + Parser::Angle + } +} diff --git a/vendor/valence/crates/valence_command/src/parsers/block_pos.rs b/vendor/valence/crates/valence_command/src/parsers/block_pos.rs new file mode 100644 index 00000000..700b443a --- /dev/null +++ b/vendor/valence/crates/valence_command/src/parsers/block_pos.rs @@ -0,0 +1,62 @@ +use super::Parser; +use crate::parsers::{AbsoluteOrRelative, CommandArg, CommandArgParseError, ParseInput}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub struct BlockPos { + pub x: AbsoluteOrRelative, + pub y: AbsoluteOrRelative, + pub z: AbsoluteOrRelative, +} + +impl CommandArg for BlockPos { + fn parse_arg(input: &mut ParseInput) -> Result { + input.skip_whitespace(); + let x = AbsoluteOrRelative::::parse_arg(input)?; + input.skip_whitespace(); + let y = AbsoluteOrRelative::::parse_arg(input)?; + input.skip_whitespace(); + let z = AbsoluteOrRelative::::parse_arg(input)?; + + Ok(BlockPos { x, y, z }) + } + + fn display() -> Parser { + Parser::BlockPos + } +} + +#[test] +fn test_block_pos() { + let mut input = ParseInput::new("~-1 2 3"); + assert_eq!( + BlockPos::parse_arg(&mut input).unwrap(), + BlockPos { + x: AbsoluteOrRelative::Relative(-1), + y: AbsoluteOrRelative::Absolute(2), + z: AbsoluteOrRelative::Absolute(3) + } + ); + assert!(input.is_done()); + + let mut input = ParseInput::new("-1 ~2 3 "); + assert_eq!( + BlockPos::parse_arg(&mut input).unwrap(), + BlockPos { + x: AbsoluteOrRelative::Absolute(-1), + y: AbsoluteOrRelative::Relative(2), + z: AbsoluteOrRelative::Absolute(3) + } + ); + assert!(!input.is_done()); + + let mut input = ParseInput::new("-1 2 ~3 4"); + assert_eq!( + BlockPos::parse_arg(&mut input).unwrap(), + BlockPos { + x: AbsoluteOrRelative::Absolute(-1), + y: AbsoluteOrRelative::Absolute(2), + z: AbsoluteOrRelative::Relative(3) + } + ); + assert!(!input.is_done()); +} diff --git a/vendor/valence/crates/valence_command/src/parsers/bool.rs b/vendor/valence/crates/valence_command/src/parsers/bool.rs new file mode 100644 index 00000000..9dd83f54 --- /dev/null +++ b/vendor/valence/crates/valence_command/src/parsers/bool.rs @@ -0,0 +1,42 @@ +use super::Parser; +use crate::parsers::{CommandArg, CommandArgParseError, ParseInput}; + +impl CommandArg for bool { + fn parse_arg(input: &mut ParseInput) -> Result { + input.skip_whitespace(); + if input.match_next("true") { + Ok(true) + } else if input.match_next("false") { + Ok(false) + } else { + Err(CommandArgParseError::InvalidArgument { + expected: "bool".to_string(), + got: input.peek_word().to_string(), + }) + } + } + + fn display() -> Parser { + Parser::Bool + } +} + +#[test] +fn test_bool() { + let mut input = ParseInput::new("true"); + assert!(bool::parse_arg(&mut input).unwrap()); + assert!(input.is_done()); + + let mut input = ParseInput::new("false"); + assert!(!bool::parse_arg(&mut input).unwrap()); + assert!(input.is_done()); + + let mut input = ParseInput::new("false "); + assert!(!bool::parse_arg(&mut input).unwrap()); + assert!(!input.is_done()); + + let mut input = ParseInput::new("falSe trUe"); + assert!(!bool::parse_arg(&mut input).unwrap()); + assert!(bool::parse_arg(&mut input).unwrap()); + assert!(input.is_done()); +} diff --git a/vendor/valence/crates/valence_command/src/parsers/color.rs b/vendor/valence/crates/valence_command/src/parsers/color.rs new file mode 100644 index 00000000..4695f38b --- /dev/null +++ b/vendor/valence/crates/valence_command/src/parsers/color.rs @@ -0,0 +1,54 @@ +use valence_text::Color; + +use super::Parser; +use crate::parsers::{CommandArg, CommandArgParseError, ParseInput}; + +impl CommandArg for Color { + fn parse_arg(input: &mut ParseInput) -> Result { + input.skip_whitespace(); + if input.match_next("black") { + Ok(Self::BLACK) + } else if input.match_next("dark_blue") { + Ok(Self::DARK_BLUE) + } else if input.match_next("dark_green") { + Ok(Self::DARK_GREEN) + } else if input.match_next("dark_aqua") { + Ok(Self::DARK_AQUA) + } else if input.match_next("dark_red") { + Ok(Self::DARK_RED) + } else if input.match_next("dark_purple") { + Ok(Self::DARK_PURPLE) + } else if input.match_next("gold") { + Ok(Self::GOLD) + } else if input.match_next("gray") { + Ok(Self::GRAY) + } else if input.match_next("dark_gray") { + Ok(Self::DARK_GRAY) + } else if input.match_next("blue") { + Ok(Self::BLUE) + } else if input.match_next("green") { + Ok(Self::GREEN) + } else if input.match_next("aqua") { + Ok(Self::AQUA) + } else if input.match_next("red") { + Ok(Self::RED) + } else if input.match_next("light_purple") { + Ok(Self::LIGHT_PURPLE) + } else if input.match_next("yellow") { + Ok(Self::YELLOW) + } else if input.match_next("white") { + Ok(Self::WHITE) + } else if input.match_next("reset") { + Ok(Self::Reset) + } else { + Err(CommandArgParseError::InvalidArgument { + expected: "chat_color".to_string(), + got: "not a valid chat color".to_string(), + }) + } + } + + fn display() -> Parser { + Parser::Color + } +} diff --git a/vendor/valence/crates/valence_command/src/parsers/column_pos.rs b/vendor/valence/crates/valence_command/src/parsers/column_pos.rs new file mode 100644 index 00000000..041c3e3d --- /dev/null +++ b/vendor/valence/crates/valence_command/src/parsers/column_pos.rs @@ -0,0 +1,64 @@ +use super::Parser; +use crate::parsers::{AbsoluteOrRelative, CommandArg, CommandArgParseError, ParseInput}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub struct ColumnPos { + pub x: AbsoluteOrRelative, + pub y: AbsoluteOrRelative, + pub z: AbsoluteOrRelative, +} + +impl CommandArg for ColumnPos { + fn parse_arg(input: &mut ParseInput) -> Result { + input.skip_whitespace(); + let x = AbsoluteOrRelative::::parse_arg(input)?; + input.skip_whitespace(); + let y = AbsoluteOrRelative::::parse_arg(input)?; + input.skip_whitespace(); + let z = AbsoluteOrRelative::::parse_arg(input)?; + + Ok(ColumnPos { x, y, z }) + } + + fn display() -> Parser { + Parser::ColumnPos + } +} + +#[test] +fn test_column_pos() { + let mut input = ParseInput::new("~-1 2 3"); + assert_eq!( + ColumnPos::parse_arg(&mut input).unwrap(), + ColumnPos { + x: AbsoluteOrRelative::Relative(-1), + y: AbsoluteOrRelative::Absolute(2), + z: AbsoluteOrRelative::Absolute(3) + } + ); + assert!(input.is_done()); + + let mut input = ParseInput::new("-1 ~2 3 hello"); + assert_eq!( + ColumnPos::parse_arg(&mut input).unwrap(), + ColumnPos { + x: AbsoluteOrRelative::Absolute(-1), + y: AbsoluteOrRelative::Relative(2), + z: AbsoluteOrRelative::Absolute(3) + } + ); + assert!(!input.is_done()); + input.skip_whitespace(); + assert!(input.match_next("hello")); + + let mut input = ParseInput::new("-1 2 ~3 4"); + assert_eq!( + ColumnPos::parse_arg(&mut input).unwrap(), + ColumnPos { + x: AbsoluteOrRelative::Absolute(-1), + y: AbsoluteOrRelative::Absolute(2), + z: AbsoluteOrRelative::Relative(3) + } + ); + assert!(!input.is_done()); +} diff --git a/vendor/valence/crates/valence_command/src/parsers/entity_anchor.rs b/vendor/valence/crates/valence_command/src/parsers/entity_anchor.rs new file mode 100644 index 00000000..88e42acb --- /dev/null +++ b/vendor/valence/crates/valence_command/src/parsers/entity_anchor.rs @@ -0,0 +1,29 @@ +use super::Parser; +use crate::parsers::{CommandArg, CommandArgParseError, ParseInput}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub enum EntityAnchor { + #[default] + Eyes, + Feet, +} + +impl CommandArg for EntityAnchor { + fn parse_arg(input: &mut ParseInput) -> Result { + input.skip_whitespace(); + if input.match_next("eyes") { + Ok(EntityAnchor::Eyes) + } else if input.match_next("feet") { + Ok(EntityAnchor::Feet) + } else { + Err(CommandArgParseError::InvalidArgument { + expected: "entity_anchor".to_string(), + got: "not a valid entity anchor".to_string(), + }) + } + } + + fn display() -> Parser { + Parser::EntityAnchor + } +} diff --git a/vendor/valence/crates/valence_command/src/parsers/entity_selector.rs b/vendor/valence/crates/valence_command/src/parsers/entity_selector.rs new file mode 100644 index 00000000..af48f76a --- /dev/null +++ b/vendor/valence/crates/valence_command/src/parsers/entity_selector.rs @@ -0,0 +1,136 @@ +use super::Parser; +use crate::parsers::{CommandArg, CommandArgParseError, ParseInput}; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum EntitySelector { + SimpleSelector(EntitySelectors), + ComplexSelector(EntitySelectors, String), +} + +#[derive(Debug, Clone, PartialEq, Eq, Default)] +pub enum EntitySelectors { + AllEntities, + SinglePlayer(String), + #[default] + AllPlayers, + SelfPlayer, + NearestPlayer, + RandomPlayer, +} + +impl CommandArg for EntitySelector { + // we want to get either a simple string [`@e`, `@a`, `@p`, `@r`, + // ``] or a full selector: [`@e[]`, `@a[]`, + // `@p[]`, `@r[]`] the selectors can have spaces in + // them, so we need to be careful + fn parse_arg(input: &mut ParseInput) -> Result { + input.skip_whitespace(); + let mut simple_selector = None; + while let Some(c) = input.peek() { + match c { + '@' => { + input.pop(); // pop the '@' + match input.pop() { + Some('e') => simple_selector = Some(EntitySelectors::AllEntities), + Some('a') => simple_selector = Some(EntitySelectors::AllPlayers), + Some('p') => simple_selector = Some(EntitySelectors::NearestPlayer), + Some('r') => simple_selector = Some(EntitySelectors::RandomPlayer), + Some('s') => simple_selector = Some(EntitySelectors::SelfPlayer), + _ => { + return Err(CommandArgParseError::InvalidArgument { + expected: "entity selector".to_string(), + got: c.to_string(), + }) + } + } + if input.peek() != Some('[') { + // if there's no complex selector, we're done + return Ok(EntitySelector::SimpleSelector(simple_selector.unwrap())); + } + } + '[' => { + input.pop(); + if simple_selector.is_none() { + return Err(CommandArgParseError::InvalidArgument { + expected: "entity selector".to_string(), + got: c.to_string(), + }); + } + let mut s = String::new(); + while let Some(c) = input.pop() { + if c == ']' { + return Ok(EntitySelector::ComplexSelector( + simple_selector.unwrap(), + s.trim().to_string(), + )); + } else { + s.push(c); + } + } + } + _ => { + return Ok(EntitySelector::SimpleSelector( + EntitySelectors::SinglePlayer(String::parse_arg(input)?), + )) + } + } + } + Err(CommandArgParseError::InvalidArgLength) + } + + fn display() -> Parser { + Parser::Entity { + only_players: false, + single: false, + } + } +} + +#[test] +fn test_entity_selector() { + let mut input = ParseInput::new("@e"); + assert_eq!( + EntitySelector::parse_arg(&mut input).unwrap(), + EntitySelector::SimpleSelector(EntitySelectors::AllEntities) + ); + assert!(input.is_done()); + + let mut input = ParseInput::new("@e[distance=..5]"); + assert_eq!( + EntitySelector::parse_arg(&mut input).unwrap(), + EntitySelector::ComplexSelector(EntitySelectors::AllEntities, "distance=..5".to_string()) + ); + assert!(input.is_done()); + + let mut input = ParseInput::new("@s[distance=..5"); + assert!(EntitySelector::parse_arg(&mut input).is_err()); + assert!(input.is_done()); + + let mut input = ParseInput::new("@r[distance=..5] hello"); + assert_eq!( + EntitySelector::parse_arg(&mut input).unwrap(), + EntitySelector::ComplexSelector(EntitySelectors::RandomPlayer, "distance=..5".to_string()) + ); + assert!(!input.is_done()); + + let mut input = ParseInput::new("@p[distance=..5]hello"); + assert_eq!( + EntitySelector::parse_arg(&mut input).unwrap(), + EntitySelector::ComplexSelector(EntitySelectors::NearestPlayer, "distance=..5".to_string()) + ); + assert!(!input.is_done()); + + let mut input = ParseInput::new("@e[distance=..5] hello world"); + assert_eq!( + EntitySelector::parse_arg(&mut input).unwrap(), + EntitySelector::ComplexSelector(EntitySelectors::AllEntities, "distance=..5".to_string()) + ); + assert!(!input.is_done()); + + let mut input = ParseInput::new("@e[distance=..5]hello world"); + assert_eq!( + EntitySelector::parse_arg(&mut input).unwrap(), + EntitySelector::ComplexSelector(EntitySelectors::AllEntities, "distance=..5".to_string()) + ); + assert!(!input.is_done()); +} diff --git a/vendor/valence/crates/valence_command/src/parsers/gamemode.rs b/vendor/valence/crates/valence_command/src/parsers/gamemode.rs new file mode 100644 index 00000000..c2c8a6c6 --- /dev/null +++ b/vendor/valence/crates/valence_command/src/parsers/gamemode.rs @@ -0,0 +1,28 @@ +use valence_server::protocol::packets::play::command_tree_s2c::Parser; +use valence_server::GameMode; + +use crate::parsers::{CommandArg, CommandArgParseError, ParseInput}; + +impl CommandArg for GameMode { + fn parse_arg(input: &mut ParseInput) -> Result { + input.skip_whitespace(); + if input.match_next("survival") { + Ok(GameMode::Survival) + } else if input.match_next("creative") { + Ok(GameMode::Creative) + } else if input.match_next("adventure") { + Ok(GameMode::Adventure) + } else if input.match_next("spectator") { + Ok(GameMode::Spectator) + } else { + Err(CommandArgParseError::InvalidArgument { + expected: "game_mode".to_string(), + got: input.peek_word().to_string(), + }) + } + } + + fn display() -> Parser { + Parser::GameMode + } +} diff --git a/vendor/valence/crates/valence_command/src/parsers/inventory_slot.rs b/vendor/valence/crates/valence_command/src/parsers/inventory_slot.rs new file mode 100644 index 00000000..d9312948 --- /dev/null +++ b/vendor/valence/crates/valence_command/src/parsers/inventory_slot.rs @@ -0,0 +1,20 @@ +use bevy_derive::Deref; + +use super::Parser; +use crate::parsers::{CommandArg, CommandArgParseError, ParseInput}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Deref)] +pub struct InventorySlot(pub u32); + +impl CommandArg for InventorySlot { + fn parse_arg(input: &mut ParseInput) -> Result { + input.skip_whitespace(); + let slot = u32::parse_arg(input)?; + + Ok(InventorySlot(slot)) + } + + fn display() -> Parser { + Parser::ItemSlot + } +} diff --git a/vendor/valence/crates/valence_command/src/parsers/numbers.rs b/vendor/valence/crates/valence_command/src/parsers/numbers.rs new file mode 100644 index 00000000..9f8ad976 --- /dev/null +++ b/vendor/valence/crates/valence_command/src/parsers/numbers.rs @@ -0,0 +1,55 @@ +use super::Parser; +use crate::parsers::{CommandArg, CommandArgParseError, ParseInput}; +macro_rules! impl_parser_for_number { + ($type:ty, $name:expr, $parser:ident) => { + impl CommandArg for $type { + fn parse_arg(input: &mut ParseInput) -> Result { + input.skip_whitespace(); + let s = input.pop_word(); + + let parsed = s.parse::<$type>(); + + parsed.map_err(|_| CommandArgParseError::InvalidArgument { + expected: $name.to_string(), + got: s.to_string(), + }) + } + + fn display() -> Parser { + Parser::$parser { + min: None, + max: None, + } + } + } + }; +} + +impl_parser_for_number!(f32, "float", Float); +impl_parser_for_number!(f64, "double", Double); +impl_parser_for_number!(i32, "integer", Integer); +impl_parser_for_number!(i64, "long", Long); +impl_parser_for_number!(u32, "unsigned integer", Integer); + +#[test] +fn test_number() { + let mut input = ParseInput::new("1"); + assert_eq!(1, i32::parse_arg(&mut input).unwrap()); + assert!(input.is_done()); + + let mut input = ParseInput::new("1"); + assert_eq!(1, i64::parse_arg(&mut input).unwrap()); + assert!(input.is_done()); + + let mut input = ParseInput::new("1.0"); + assert_eq!(1.0, f32::parse_arg(&mut input).unwrap()); + assert!(input.is_done()); + + let mut input = ParseInput::new("1.0"); + assert_eq!(1.0, f64::parse_arg(&mut input).unwrap()); + assert!(input.is_done()); + + let mut input = ParseInput::new("3.40282347e+38 "); + assert_eq!(f32::MAX, f32::parse_arg(&mut input).unwrap()); + assert!(!input.is_done()); +} diff --git a/vendor/valence/crates/valence_command/src/parsers/rotation.rs b/vendor/valence/crates/valence_command/src/parsers/rotation.rs new file mode 100644 index 00000000..5bcb554c --- /dev/null +++ b/vendor/valence/crates/valence_command/src/parsers/rotation.rs @@ -0,0 +1,21 @@ +use bevy_derive::Deref; + +use super::Parser; +use crate::parsers::vec2::Vec2; +use crate::parsers::{CommandArg, CommandArgParseError, ParseInput}; + +#[derive(Debug, Clone, Copy, PartialEq, Default, Deref)] +pub struct Rotation(pub Vec2); + +impl CommandArg for Rotation { + fn parse_arg(input: &mut ParseInput) -> Result { + input.skip_whitespace(); + let vec2 = Vec2::parse_arg(input)?; + + Ok(Rotation(vec2)) + } + + fn display() -> Parser { + Parser::Rotation + } +} diff --git a/vendor/valence/crates/valence_command/src/parsers/score_holder.rs b/vendor/valence/crates/valence_command/src/parsers/score_holder.rs new file mode 100644 index 00000000..654a5d3e --- /dev/null +++ b/vendor/valence/crates/valence_command/src/parsers/score_holder.rs @@ -0,0 +1,27 @@ +use super::Parser; +use crate::parsers::entity_selector::EntitySelector; +use crate::parsers::{CommandArg, CommandArgParseError, ParseInput}; + +#[derive(Debug, Clone, PartialEq, Eq, Default)] +pub enum ScoreHolder { + Entity(EntitySelector), + #[default] + All, +} + +impl CommandArg for ScoreHolder { + fn parse_arg(input: &mut ParseInput) -> Result { + input.skip_whitespace(); + if input.peek() == Some('*') { + Ok(ScoreHolder::All) + } else { + Ok(ScoreHolder::Entity(EntitySelector::parse_arg(input)?)) + } + } + + fn display() -> Parser { + Parser::ScoreHolder { + allow_multiple: false, + } + } +} diff --git a/vendor/valence/crates/valence_command/src/parsers/strings.rs b/vendor/valence/crates/valence_command/src/parsers/strings.rs new file mode 100644 index 00000000..ceeabe15 --- /dev/null +++ b/vendor/valence/crates/valence_command/src/parsers/strings.rs @@ -0,0 +1,107 @@ +use bevy_derive::Deref; +use valence_server::protocol::packets::play::command_tree_s2c::StringArg; + +use super::Parser; +use crate::parsers::{CommandArg, CommandArgParseError, ParseInput}; + +impl CommandArg for String { + fn parse_arg(input: &mut ParseInput) -> Result { + input.skip_whitespace(); + Ok(input.pop_word().to_string()) + } + + fn display() -> Parser { + Parser::String(StringArg::SingleWord) + } +} + +#[test] +fn test_string() { + let mut input = ParseInput::new("hello world"); + assert_eq!("hello", String::parse_arg(&mut input).unwrap()); + assert_eq!("world", String::parse_arg(&mut input).unwrap()); + assert!(input.is_done()); +} + +#[derive(Debug, Clone, PartialEq, Eq, Default, Deref)] +pub struct GreedyString(pub String); + +impl CommandArg for GreedyString { + fn parse_arg(input: &mut ParseInput) -> Result { + input.skip_whitespace(); + Ok(GreedyString( + match input.pop_all() { + Some(s) => s, + None => return Err(CommandArgParseError::InvalidArgLength), + } + .to_string(), + )) + } + + fn display() -> Parser { + Parser::String(StringArg::GreedyPhrase) + } +} + +#[test] +fn test_greedy_string() { + let mut input = ParseInput::new("hello world"); + assert_eq!( + "hello world", + GreedyString::parse_arg(&mut input).unwrap().0 + ); + assert!(input.is_done()); +} + +#[derive(Debug, Clone, PartialEq, Eq, Default, Deref)] +pub struct QuotableString(pub String); + +impl CommandArg for QuotableString { + fn parse_arg(input: &mut ParseInput) -> Result { + input.skip_whitespace(); + match input.peek() { + Some('"') => { + input.pop(); + let mut s = String::new(); + let mut escaped = false; + while let Some(c) = input.pop() { + if escaped { + s.push(c); + escaped = false; + } else if c == '\\' { + escaped = true; + } else if c == '"' { + return Ok(QuotableString(s)); + } else { + s.push(c); + } + } + Err(CommandArgParseError::InvalidArgLength) + } + Some(_) => Ok(QuotableString(String::parse_arg(input)?)), + None => Err(CommandArgParseError::InvalidArgLength), + } + } + + fn display() -> Parser { + Parser::String(StringArg::QuotablePhrase) + } +} + +#[test] +fn test_quotable_string() { + let mut input = ParseInput::new("\"hello world\""); + assert_eq!( + "hello world", + QuotableString::parse_arg(&mut input).unwrap().0 + ); + assert!(input.is_done()); + + let mut input = ParseInput::new("\"hello w\"orld"); + assert_eq!("hello w", QuotableString::parse_arg(&mut input).unwrap().0); + assert!(!input.is_done()); + + let mut input = ParseInput::new("hello world\""); + assert_eq!("hello", QuotableString::parse_arg(&mut input).unwrap().0); + assert!(!input.is_done()); +} diff --git a/vendor/valence/crates/valence_command/src/parsers/swizzle.rs b/vendor/valence/crates/valence_command/src/parsers/swizzle.rs new file mode 100644 index 00000000..161c94dd --- /dev/null +++ b/vendor/valence/crates/valence_command/src/parsers/swizzle.rs @@ -0,0 +1,117 @@ +use super::Parser; +use crate::parsers::{CommandArg, CommandArgParseError, ParseInput}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub struct Swizzle { + pub x: bool, + pub y: bool, + pub z: bool, +} + +impl CommandArg for Swizzle { + fn parse_arg(input: &mut ParseInput) -> Result { + input.skip_whitespace(); + let mut swizzle = Swizzle::default(); + while let Some(c) = input.peek() { + match c { + 'x' => swizzle.x = true, + 'y' => swizzle.y = true, + 'z' => swizzle.z = true, + _ => break, + } + input.pop(); + } + + Ok(swizzle) + } + + fn display() -> Parser { + Parser::Swizzle + } +} + +#[test] +fn test_swizzle() { + let mut input = ParseInput::new("xyzzzz"); + let swizzle = Swizzle::parse_arg(&mut input).unwrap(); + assert_eq!( + swizzle, + Swizzle { + x: true, + y: true, + z: true + } + ); + assert!(input.is_done()); + + let mut input = ParseInput::new("xzy"); + let swizzle = Swizzle::parse_arg(&mut input).unwrap(); + assert_eq!( + swizzle, + Swizzle { + x: true, + y: true, + z: true + } + ); + assert!(input.is_done()); + + let mut input = ParseInput::new("x"); + let swizzle = Swizzle::parse_arg(&mut input).unwrap(); + assert_eq!( + swizzle, + Swizzle { + x: true, + y: false, + z: false + } + ); + assert!(input.is_done()); + + let mut input = ParseInput::new("x y z zy xyz"); + let swizzle_a = Swizzle::parse_arg(&mut input).unwrap(); + let swizzle_b = Swizzle::parse_arg(&mut input).unwrap(); + let swizzle_c = Swizzle::parse_arg(&mut input).unwrap(); + let swizzle_d = Swizzle::parse_arg(&mut input).unwrap(); + let swizzle_e = Swizzle::parse_arg(&mut input).unwrap(); + assert_eq!( + swizzle_a, + Swizzle { + x: true, + y: false, + z: false + } + ); + assert_eq!( + swizzle_b, + Swizzle { + x: false, + y: true, + z: false + } + ); + assert_eq!( + swizzle_c, + Swizzle { + x: false, + y: false, + z: true + } + ); + assert_eq!( + swizzle_d, + Swizzle { + x: false, + y: true, + z: true + } + ); + assert_eq!( + swizzle_e, + Swizzle { + x: true, + y: true, + z: true + } + ); +} diff --git a/vendor/valence/crates/valence_command/src/parsers/time.rs b/vendor/valence/crates/valence_command/src/parsers/time.rs new file mode 100644 index 00000000..d1eff8cc --- /dev/null +++ b/vendor/valence/crates/valence_command/src/parsers/time.rs @@ -0,0 +1,83 @@ +use super::Parser; +use crate::parsers::{CommandArg, CommandArgParseError, ParseInput}; + +#[derive(Debug, Clone, Copy, PartialEq)] +pub enum Time { + Ticks(f32), + Seconds(f32), + Days(f32), +} + +impl CommandArg for Time { + fn parse_arg(input: &mut ParseInput) -> Result { + input.skip_whitespace(); + let mut number_str = String::new(); + while let Some(c) = input.pop() { + match c { + 't' => { + return Ok(Time::Ticks(number_str.parse::().map_err(|_| { + CommandArgParseError::InvalidArgument { + expected: "time".to_string(), + got: "not a valid time".to_string(), + } + })?)); + } + 's' => { + return Ok(Time::Seconds(number_str.parse::().map_err(|_| { + CommandArgParseError::InvalidArgument { + expected: "time".to_string(), + got: "not a valid time".to_string(), + } + })?)); + } + 'd' => { + return Ok(Time::Days(number_str.parse::().map_err(|_| { + CommandArgParseError::InvalidArgument { + expected: "time".to_string(), + got: "not a valid time".to_string(), + } + })?)); + } + _ => { + number_str.push(c); + } + } + } + if !number_str.is_empty() { + return Ok(Time::Ticks(number_str.parse::().map_err(|_| { + CommandArgParseError::InvalidArgument { + expected: "time".to_string(), + got: "not a valid time".to_string(), + } + })?)); + } + + Err(CommandArgParseError::InvalidArgument { + expected: "time".to_string(), + got: "not a valid time".to_string(), + }) + } + + fn display() -> Parser { + Parser::Time + } +} + +#[test] +fn test_time() { + let mut input = ParseInput::new("42.31t"); + let time = Time::parse_arg(&mut input).unwrap(); + assert_eq!(time, Time::Ticks(42.31)); + + let mut input = ParseInput::new("42.31"); + let time = Time::parse_arg(&mut input).unwrap(); + assert_eq!(time, Time::Ticks(42.31)); + + let mut input = ParseInput::new("1239.72s"); + let time = Time::parse_arg(&mut input).unwrap(); + assert_eq!(time, Time::Seconds(1239.72)); + + let mut input = ParseInput::new("133.1d"); + let time = Time::parse_arg(&mut input).unwrap(); + assert_eq!(time, Time::Days(133.1)); +} diff --git a/vendor/valence/crates/valence_command/src/parsers/vec2.rs b/vendor/valence/crates/valence_command/src/parsers/vec2.rs new file mode 100644 index 00000000..02235a8c --- /dev/null +++ b/vendor/valence/crates/valence_command/src/parsers/vec2.rs @@ -0,0 +1,56 @@ +use super::Parser; +use crate::parsers::{AbsoluteOrRelative, CommandArg, CommandArgParseError, ParseInput}; + +#[derive(Debug, Clone, Copy, PartialEq, Default)] +pub struct Vec2 { + pub x: AbsoluteOrRelative, + pub y: AbsoluteOrRelative, +} + +impl CommandArg for Vec2 { + fn parse_arg(input: &mut ParseInput) -> Result { + input.skip_whitespace(); + let x = AbsoluteOrRelative::::parse_arg(input)?; + input.skip_whitespace(); + let y = AbsoluteOrRelative::::parse_arg(input)?; + + Ok(Vec2 { x, y }) + } + + fn display() -> Parser { + Parser::Vec2 + } +} + +#[test] +fn test_vec2() { + let mut input = ParseInput::new("~-1.5 2.5"); + assert_eq!( + Vec2::parse_arg(&mut input).unwrap(), + Vec2 { + x: AbsoluteOrRelative::Relative(-1.5), + y: AbsoluteOrRelative::Absolute(2.5), + } + ); + assert!(input.is_done()); + + let mut input = ParseInput::new("-1.5 ~2.5 "); + assert_eq!( + Vec2::parse_arg(&mut input).unwrap(), + Vec2 { + x: AbsoluteOrRelative::Absolute(-1.5), + y: AbsoluteOrRelative::Relative(2.5), + } + ); + assert!(!input.is_done()); + + let mut input = ParseInput::new("-1.5 2.5 3.5"); + assert_eq!( + Vec2::parse_arg(&mut input).unwrap(), + Vec2 { + x: AbsoluteOrRelative::Absolute(-1.5), + y: AbsoluteOrRelative::Absolute(2.5), + } + ); + assert!(!input.is_done()); +} diff --git a/vendor/valence/crates/valence_command/src/parsers/vec3.rs b/vendor/valence/crates/valence_command/src/parsers/vec3.rs new file mode 100644 index 00000000..f5befdbe --- /dev/null +++ b/vendor/valence/crates/valence_command/src/parsers/vec3.rs @@ -0,0 +1,59 @@ +use super::Parser; +use crate::parsers::{AbsoluteOrRelative, CommandArg, CommandArgParseError, ParseInput}; + +#[derive(Debug, Clone, Copy, PartialEq, Default)] +pub struct Vec3 { + pub x: AbsoluteOrRelative, + pub y: AbsoluteOrRelative, + pub z: AbsoluteOrRelative, +} + +impl CommandArg for Vec3 { + fn parse_arg(input: &mut ParseInput) -> Result { + let x = AbsoluteOrRelative::::parse_arg(input)?; + let y = AbsoluteOrRelative::::parse_arg(input)?; + let z = AbsoluteOrRelative::::parse_arg(input)?; + + Ok(Vec3 { x, y, z }) + } + + fn display() -> Parser { + Parser::Vec3 + } +} + +#[test] +fn test_vec3() { + let mut input = ParseInput::new("~-1.5 2.5 3.5"); + assert_eq!( + Vec3::parse_arg(&mut input).unwrap(), + Vec3 { + x: AbsoluteOrRelative::Relative(-1.5), + y: AbsoluteOrRelative::Absolute(2.5), + z: AbsoluteOrRelative::Absolute(3.5) + } + ); + assert!(input.is_done()); + + let mut input = ParseInput::new("-1.5 ~2.5 3.5 "); + assert_eq!( + Vec3::parse_arg(&mut input).unwrap(), + Vec3 { + x: AbsoluteOrRelative::Absolute(-1.5), + y: AbsoluteOrRelative::Relative(2.5), + z: AbsoluteOrRelative::Absolute(3.5) + } + ); + assert!(!input.is_done()); + + let mut input = ParseInput::new("-1.5 2.5 ~3.5 4.5"); + assert_eq!( + Vec3::parse_arg(&mut input).unwrap(), + Vec3 { + x: AbsoluteOrRelative::Absolute(-1.5), + y: AbsoluteOrRelative::Absolute(2.5), + z: AbsoluteOrRelative::Relative(3.5) + } + ); + assert!(!input.is_done()); +} diff --git a/vendor/valence/crates/valence_command/src/scopes.rs b/vendor/valence/crates/valence_command/src/scopes.rs new file mode 100644 index 00000000..ddfcca5c --- /dev/null +++ b/vendor/valence/crates/valence_command/src/scopes.rs @@ -0,0 +1,298 @@ +//! Scope graph for the Valence Command system. +//! +//! ## Breakdown +//! Each scope is a node in a graph. A path from one node to another indicates +//! that the first scope implies the second. A dot in the scope name indicates +//! a sub-scope. You can use this to create a hierarchy of scopes. For example, +//! the scope "valence.command" implies "valence.command.tp". this means that if +//! a player has the "valence.command" scope, they can use the "tp" command. +//! +//! You may also link scopes together in the registry. This is useful for admin +//! scope umbrellas. For example, if the scope "valence.admin" is linked to +//! "valence.command", It means that if a player has the "valence.admin" scope, +//! they can use all commands under the command scope. +//! +//! # Example +//! ``` +//! use valence_command::scopes::CommandScopeRegistry; +//! +//! let mut registry = CommandScopeRegistry::new(); +//! +//! // add a scope to the registry +//! registry.add_scope("valence.command.teleport"); +//! +//! // we added 4 scopes to the registry. "valence", "valence.command", "valence.command.teleport", +//! // and the root scope. +//! assert_eq!(registry.scope_count(), 4); +//! +//! registry.add_scope("valence.admin"); +//! +//! // add a scope to the registry with a link to another scope +//! registry.link("valence.admin", "valence.command.teleport"); +//! +//! // the "valence.admin" scope implies the "valence.command.teleport" scope +//! assert_eq!( +//! registry.grants("valence.admin", "valence.command.teleport"), +//! true +//! ); +//! ``` + +use std::collections::{BTreeSet, HashMap}; +use std::fmt::{Debug, Formatter}; + +use bevy_app::{App, Plugin, Update}; +use bevy_derive::{Deref, DerefMut}; +use bevy_ecs::prelude::{Component, ResMut}; +use bevy_ecs::query::Changed; +use bevy_ecs::system::{Query, Resource}; +use petgraph::dot; +use petgraph::dot::Dot; +use petgraph::prelude::*; + +pub struct CommandScopePlugin; + +impl Plugin for CommandScopePlugin { + fn build(&self, app: &mut App) { + app.init_resource::() + .add_systems(Update, add_new_scopes); + } +} + +/// Command scope Component for players. This is a list of scopes that a player +/// has. If a player has a scope, they can use any command that requires +/// that scope. +#[derive( + Debug, Clone, PartialEq, Eq, Hash, Ord, PartialOrd, Component, Default, Deref, DerefMut, +)] +pub struct CommandScopes(pub BTreeSet); + +/// This system makes it a bit easier to add new scopes to the registry without +/// having to explicitly add them to the registry on app startup. +fn add_new_scopes( + mut registry: ResMut, + scopes: Query<&CommandScopes, Changed>, +) { + for scopes in scopes.iter() { + for scope in scopes.iter() { + if !registry.string_to_node.contains_key(scope) { + registry.add_scope(scope); + } + } + } +} + +impl CommandScopes { + /// create a new scope component + pub fn new() -> Self { + Self::default() + } + + /// add a scope to this component + pub fn add(&mut self, scope: &str) { + self.0.insert(scope.into()); + } +} + +/// Store the scope graph and provide methods for querying it. +#[derive(Clone, Resource)] +pub struct CommandScopeRegistry { + graph: Graph, + string_to_node: HashMap, + root: NodeIndex, +} + +impl Default for CommandScopeRegistry { + fn default() -> Self { + let mut graph = Graph::new(); + let root = graph.add_node("root".to_string()); + Self { + graph, + string_to_node: HashMap::from([("root".to_string(), root)]), + root, + } + } +} + +impl Debug for CommandScopeRegistry { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!( + f, + "{:?}", + Dot::with_config(&self.graph, &[dot::Config::EdgeNoLabel]) + )?; + Ok(()) + } +} + +impl CommandScopeRegistry { + /// Create a new scope registry. + pub fn new() -> Self { + Self::default() + } + + /// Add a scope to the registry. + /// + /// # Example + /// ``` + /// use valence_command::CommandScopeRegistry; + /// + /// let mut registry = CommandScopeRegistry::new(); + /// + /// // creates two nodes. "valence" and "command" with an edge from "valence" to "command" + /// registry.add_scope("valence.command"); + /// // creates one node. "valence.command.tp" with an edge from "valence.command" to + /// // "valence.command.tp" + /// registry.add_scope("valence.command.tp"); + /// + /// // the root node is always present + /// assert_eq!(registry.scope_count(), 4); + /// ``` + pub fn add_scope(&mut self, scope: impl Into) { + let scope = scope.into(); + if self.string_to_node.contains_key(&scope) { + return; + } + let mut current_node = self.root; + let mut prefix = String::new(); + for part in scope.split('.') { + let node = self + .string_to_node + .entry(prefix.clone() + part) + .or_insert_with(|| { + let node = self.graph.add_node(part.to_string()); + self.graph.add_edge(current_node, node, ()); + node + }); + current_node = *node; + + prefix = prefix + part + "."; + } + } + + /// Remove a scope from the registry. + /// + /// # Example + /// ``` + /// use valence_command::CommandScopeRegistry; + /// + /// let mut registry = CommandScopeRegistry::new(); + /// + /// registry.add_scope("valence.command"); + /// registry.add_scope("valence.command.tp"); + /// + /// assert_eq!(registry.scope_count(), 4); + /// + /// registry.remove_scope("valence.command.tp"); + /// + /// assert_eq!(registry.scope_count(), 3); + /// ``` + pub fn remove_scope(&mut self, scope: &str) { + if let Some(node) = self.string_to_node.remove(scope) { + self.graph.remove_node(node); + }; + } + + /// Check if a scope grants another scope. + /// + /// # Example + /// ``` + /// use valence_command::CommandScopeRegistry; + /// + /// let mut registry = CommandScopeRegistry::new(); + /// + /// registry.add_scope("valence.command"); + /// registry.add_scope("valence.command.tp"); + /// + /// assert!(registry.grants("valence.command", "valence.command.tp")); // command implies tp + /// assert!(!registry.grants("valence.command.tp", "valence.command")); // tp does not imply command + /// ``` + pub fn grants(&self, scope: &str, other: &str) -> bool { + if scope == other { + return true; + } + + let scope_idx = match self.string_to_node.get(scope) { + None => { + return false; + } + Some(idx) => *idx, + }; + let other_idx = match self.string_to_node.get(other) { + None => { + return false; + } + Some(idx) => *idx, + }; + + if scope_idx == self.root { + return true; + } + + // if we can reach the other scope from the scope, then the scope + // grants the other scope + let mut dfs = Dfs::new(&self.graph, scope_idx); + while let Some(node) = dfs.next(&self.graph) { + if node == other_idx { + return true; + } + } + false + } + + /// do any of the scopes in the list grant the other scope? + /// + /// # Example + /// ``` + /// use valence_command::CommandScopeRegistry; + /// + /// let mut registry = CommandScopeRegistry::new(); + /// + /// registry.add_scope("valence.command"); + /// registry.add_scope("valence.command.tp"); + /// registry.add_scope("valence.admin"); + /// + /// assert!(registry.any_grants( + /// &vec!["valence.admin", "valence.command"], + /// "valence.command.tp" + /// )); + /// ``` + pub fn any_grants(&self, scopes: &Vec<&str>, other: &str) -> bool { + for scope in scopes { + if self.grants(scope, other) { + return true; + } + } + false + } + + /// Create a link between two scopes so that one implies the other. It will + /// add them if they don't exist. + /// + /// # Example + /// ``` + /// use valence_command::CommandScopeRegistry; + /// + /// let mut registry = CommandScopeRegistry::new(); + /// + /// registry.add_scope("valence.command.tp"); + /// + /// registry.link("valence.admin", "valence.command"); + /// + /// assert!(registry.grants("valence.admin", "valence.command")); + /// assert!(registry.grants("valence.admin", "valence.command.tp")); + /// ``` + pub fn link(&mut self, scope: &str, other: &str) { + self.add_scope(scope); + self.add_scope(other); + + let scope_idx = self.string_to_node.get(scope).unwrap(); + let other_idx = self.string_to_node.get(other).unwrap(); + + self.graph.add_edge(*scope_idx, *other_idx, ()); + } + + /// Get the number of scopes in the registry. + pub fn scope_count(&self) -> usize { + self.graph.node_count() + } +} diff --git a/vendor/valence/crates/valence_command_macros/Cargo.toml b/vendor/valence/crates/valence_command_macros/Cargo.toml new file mode 100644 index 00000000..60657a4f --- /dev/null +++ b/vendor/valence/crates/valence_command_macros/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "valence_command_macros" +description = "Simplify the creation of Valence commands with a derive macro." +readme = "README.md" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[lib] +proc-macro = true + +[dependencies] +syn = { version = "2.0", features = ["full"] } +quote = "1.0" +proc-macro2 = "1.0" + diff --git a/vendor/valence/crates/valence_command_macros/README.md b/vendor/valence/crates/valence_command_macros/README.md new file mode 100644 index 00000000..26391900 --- /dev/null +++ b/vendor/valence/crates/valence_command_macros/README.md @@ -0,0 +1,143 @@ +Simplify the creation of Valence commands with a derive macro. + +## Usage + +```rust +#[derive(Command, Debug, Clone)] +#[paths("teleport", "tp")] +#[scopes("valence.command.teleport")] +enum TeleportCommand { + #[paths = "{location}"] + ExecutorToLocation { location: Vec3Parser }, + #[paths = "{target}"] + ExecutorToTarget { target: EntitySelector }, + #[paths = "{from} {to}"] + TargetToTarget { + from: EntitySelector, + to: EntitySelector, + }, + #[paths = "{target} {location}"] + TargetToLocation { + target: EntitySelector, + location: Vec3Parser, + }, +} + +#[derive(Command, Debug, Clone)] +#[paths("gamemode", "gm")] +#[scopes("valence.command.gamemode")] +enum GamemodeCommand { + #[paths("survival", "{/} gms")] + Survival, + #[paths("creative", "{/} gmc")] + Creative, + #[paths("adventure", "{/} gma")] + Adventure, + #[paths("spectator", "{/} gmsp")] + Spectator, +} + +#[derive(Command, Debug, Clone)] +#[paths("test", "t")] +#[scopes("valence.command.test")] +#[allow(dead_code)] +enum TestCommand { + // 3 literals with an arg each + #[paths("a {a} b {b} c {c}", "{a} {b} {c}")] + A { a: String, b: i32, c: f32 }, + // 2 literals with an arg last being optional (Because of the greedy string before the end + // this is technically unreachable) + #[paths = "a {a} {b} b {c?}"] + B { + a: Vec3Parser, + b: GreedyString, + c: Option, + }, + // greedy string optional arg + #[paths = "a {a} b {b?}"] + C { a: String, b: Option }, + // greedy string required arg + #[paths = "a {a} b {b}"] + D { a: String, b: GreedyString }, + // five optional args and an ending greedyString + #[paths("options {a?} {b?} {c?} {d?} {e?}", "options {b?} {a?} {d?} {c?} {e?}")] + E { + a: Option, + b: Option, + c: Option, + d: Option, + e: Option, + }, +} +``` + +## Attributes + +### `#[paths(...)]` or `#[paths = "..."]` + +The `#[paths(...)]` or `#[paths = "..."]` attribute is used to specify the different paths that can be used to invoke +the command. The paths are specified as string literals, where any arguments are enclosed in curly braces `{}`. +The arguments are then mapped to fields in the command enum variant. + +For example, in the `Teleport` enum, the `ExecutorToLocation` variant has a path of `{location}`, which means it expects +a single argument called `location` of type `Vec3Parser`. The `ExecutorToTarget` variant has a path of `{target}`, which +expects a single argument called `target` of type `EntitySelector`. + +The paths attribute can have multiple values separated by commas, representing alternative paths that can be used to +invoke the command. These alternative paths can have different argument orders, but they must have the same arguments. + +Their are two special paths that can be used. The first is `{/}`, which represents the root command, this can only be +used at the start of the command to specify it as a direct child of the root node. The second is `{?}`, which +represents an optional argument. The optional argument must only be followed by other optional arguments or the end of +the path. + +### `#[scopes(...)]` or `#[scopes = "..."]` + +The `#[scopes(...)]` or `#[scopes = "..."]` attribute is used to specify the scopes that the command belongs to. Scopes +are used to specify who can use the command. The scopes are specified as string literals, where each scope is separated +by a colon. + +For example, in the `Teleport` enum, the variants are assigned the scope `valence:command:teleport`, which means they +can be used by anyone with the `valence:command:teleport`, `valence:command` or `valence` scope. + +The scopes attribute can have multiple values separated by commas, representing the different scopes that the command +belongs to. + +## How do command graphs work anyway? + +This is the core of the command system. It is a graph of `CommandNode`s that are connected by the `CommandEdgeType`. The +graph is used to determine what command to run when a command is entered. The graph is also used to generate the command +tree that is sent to the client. You can think of it as a tree where each leaf is part of a command, and the path to the +leaf is the command. See the documentation for `command.rs` in `valence_command` for more information. + + +### Our teleport command from the example (made with graphviz) +```text + ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” + │ Root │ ─┐ + ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ │ + │ │ + │ Child │ + ā–¼ │ + ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” │ + │ Literal: tp │ │ + ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ │ + │ │ + │ Redirect │ Child + ā–¼ ā–¼ +ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” Child ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” +│ Argument: │ ◀─────── │ Literal: teleport │ +ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ + │ │ + │ Child │ Child + ā–¼ ā–¼ +ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” Child ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” +│ Argument: │ ◀─────── │ Argument: │ │ Argument: │ +ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ + │ + │ Child + ā–¼ + ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” + │ Argument: │ + ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ +``` \ No newline at end of file diff --git a/vendor/valence/crates/valence_command_macros/src/lib.rs b/vendor/valence/crates/valence_command_macros/src/lib.rs new file mode 100644 index 00000000..17abad06 --- /dev/null +++ b/vendor/valence/crates/valence_command_macros/src/lib.rs @@ -0,0 +1,706 @@ +use proc_macro::TokenStream; +use proc_macro2::{Ident, TokenTree}; +use quote::{format_ident, quote}; +use syn::{parse_macro_input, Attribute, Data, DeriveInput, Error, Expr, Fields, Meta, Result}; + +#[proc_macro_derive(Command, attributes(command, scopes, paths))] +pub fn derive_command(input: TokenStream) -> TokenStream { + let input = parse_macro_input!(input as DeriveInput); + match command(input) { + Ok(expansion) => expansion, + Err(err) => err.to_compile_error().into(), + } +} + +fn command(input: DeriveInput) -> Result { + let input_name = input.ident; + + let outer_scopes = input + .attrs + .iter() + .filter_map(|attr| get_lit_list_attr(attr, "scopes")) + .next() + .unwrap_or(Vec::new()); + + match input.data { + Data::Enum(ref data_enum) => { + let mut alias_paths = match input.attrs.iter().filter_map(parse_path).next() { + // there should only be one base command name set + Some(paths) => paths, + None => { + return Err(Error::new_spanned( + input_name, + "No paths attribute found for command enum", + )) + } + }; + + let base_path = alias_paths.remove(0); + + let fields = &data_enum.variants; + let mut paths = Vec::new(); + + for variant in fields { + for attr in variant.attrs.iter() { + if let Some(attr_paths) = parse_path(attr) { + paths.push((attr_paths, variant.fields.clone(), variant.ident.clone())); + } + } + } + + let mut expanded_nodes = Vec::new(); + + for (paths, fields, variant_ident) in paths { + expanded_nodes.push({ + let processed = process_paths_enum( + &input_name, + paths, + &fields, + variant_ident.clone(), + true, + ); + quote! { #processed; } + }); + } + + let base_command_expansion = { + let processed = process_paths_enum( + &input_name, + vec![base_path], + &Fields::Unit, + format_ident!("{}Root", input_name), // this is more of placeholder + // (should never be used) + false, + ); // this will error if the base path has args + let mut expanded_main_command = quote! { + let command_root_node = #processed + }; + + if !outer_scopes.is_empty() { + expanded_main_command = quote! { + #expanded_main_command + .with_scopes(vec![#(#outer_scopes),*]) + } + } + + quote! { + #expanded_main_command.id(); + } + }; + + let command_alias_expansion = { + let mut alias_expansion = quote! {}; + for path in alias_paths { + let processed = process_paths_enum( + &input_name, + vec![path], + &Fields::Unit, + format_ident!("{}Root", input_name), + false, + ); + + alias_expansion = quote! { + #alias_expansion + + #processed + .redirect_to(command_root_node) + }; + + if !outer_scopes.is_empty() { + alias_expansion = quote! { + #alias_expansion + .with_scopes(vec![#(#outer_scopes),*]) + } + } + + alias_expansion = quote! { + #alias_expansion; + } + } + + alias_expansion + }; + + let _new_struct = format_ident!("{}Command", input_name); + + Ok(TokenStream::from(quote! { + + impl valence::command::Command for #input_name { + fn assemble_graph(command_graph: &mut valence::command::graph::CommandGraphBuilder) { + use valence::command::parsers::CommandArg; + #base_command_expansion + + #command_alias_expansion + + #(#expanded_nodes)* + } + } + })) + } + Data::Struct(x) => { + let mut paths = Vec::new(); + + for attr in input.attrs.iter() { + if let Some(attr_paths) = parse_path(attr) { + paths.push(attr_paths); + } + } + + let mut expanded_nodes = Vec::new(); + + for path in paths { + expanded_nodes.push({ + let mut processed = + process_paths_struct(&input_name, path, &x.fields, outer_scopes.clone()); + // add scopes + + if !outer_scopes.is_empty() { + processed = quote! { + #processed + .with_scopes(vec![#(#outer_scopes),*]) + } + } + + quote! { #processed; } + }); + } + + Ok(TokenStream::from(quote! { + + impl valence::command::Command for #input_name { + fn assemble_graph(command_graph: &mut valence::command::graph::CommandGraphBuilder) { + use valence::command::parsers::CommandArg; + #(#expanded_nodes)* + } + } + })) + } + Data::Union(x) => Err(Error::new_spanned( + x.union_token, + "Command enum must be an enum, not a union", + )), + } +} + +fn process_paths_enum( + enum_name: &Ident, + paths: Vec<(Vec, bool)>, + fields: &Fields, + variant_ident: Ident, + executables: bool, +) -> proc_macro2::TokenStream { + let mut inner_expansion = quote! {}; + let mut first = true; + + for path in paths { + if !first { + inner_expansion = if executables && !path.1 { + quote! { + #inner_expansion; + + command_graph.at(command_root_node) + } + } else { + quote! { + #inner_expansion; + + command_graph.root() + } + }; + } else { + inner_expansion = if executables && !path.1 { + quote! { + command_graph.at(command_root_node) + } + } else { + quote! { + command_graph.root() + } + }; + + first = false; + } + + let path = path.0; + + let mut final_executable = Vec::new(); + for (i, arg) in path.iter().enumerate() { + match arg { + CommandArg::Literal(lit) => { + inner_expansion = quote! { + #inner_expansion.literal(#lit) + + }; + if executables && i == path.len() - 1 { + inner_expansion = quote! { + #inner_expansion + .with_executable(|s| #enum_name::#variant_ident{#(#final_executable,)*}) + }; + } + } + CommandArg::Required(ident) => { + let field_type = &fields + .iter() + .find(|field| field.ident.as_ref().unwrap() == ident) + .expect("Required arg not found") + .ty; + let ident_string = ident.to_string(); + + inner_expansion = quote! { + #inner_expansion + .argument(#ident_string) + .with_parser::<#field_type>() + }; + + final_executable.push(quote! { + #ident: #field_type::parse_arg(s).unwrap() + }); + + if i == path.len() - 1 { + inner_expansion = quote! { + #inner_expansion + .with_executable(|s| { + #enum_name::#variant_ident { + #(#final_executable,)* + } + }) + }; + } + } + CommandArg::Optional(ident) => { + let field_type = &fields + .iter() + .find(|field| field.ident.as_ref().unwrap() == ident) + .expect("Optional arg not found") + .ty; + let so_far_ident = format_ident!("graph_til_{}", ident); + + // get what is inside the Option<...> + let option_inner = match field_type { + syn::Type::Path(ref type_path) => { + let path = &type_path.path; + if path.segments.len() != 1 { + return Error::new_spanned( + path, + "Option type must be a single path segment", + ) + .into_compile_error(); + } + let segment = &path.segments.first().unwrap(); + if segment.ident != "Option" { + return Error::new_spanned( + &segment.ident, + "Option type must be a option", + ) + .into_compile_error(); + } + match &segment.arguments { + syn::PathArguments::AngleBracketed(ref angle_bracketed) => { + if angle_bracketed.args.len() != 1 { + return Error::new_spanned( + angle_bracketed, + "Option type must have a single generic argument", + ) + .into_compile_error(); + } + match angle_bracketed.args.first().unwrap() { + syn::GenericArgument::Type(ref generic_type) => { + generic_type + } + _ => { + return Error::new_spanned( + angle_bracketed, + "Option type must have a single generic argument", + ) + .into_compile_error(); + } + } + } + _ => { + return Error::new_spanned( + segment, + "Option type must have a single generic argument", + ) + .into_compile_error(); + } + } + } + _ => { + return Error::new_spanned( + field_type, + "Option type must be a single path segment", + ) + .into_compile_error(); + } + }; + + let ident_string = ident.to_string(); + + // find the ident of all following optional args + let mut next_optional_args = Vec::new(); + for next_arg in path.iter().skip(i + 1) { + match next_arg { + CommandArg::Optional(ident) => next_optional_args.push(ident), + _ => { + return Error::new_spanned( + variant_ident, + "Only optional args can follow an optional arg", + ) + .into_compile_error(); + } + } + } + + inner_expansion = quote! { + let #so_far_ident = {#inner_expansion + .with_executable(|s| { + #enum_name::#variant_ident { + #(#final_executable,)* + #ident: None, + #(#next_optional_args: None,)* + } + }) + .id()}; + + command_graph.at(#so_far_ident) + .argument(#ident_string) + .with_parser::<#option_inner>() + }; + + final_executable.push(quote! { + #ident: Some(#option_inner::parse_arg(s).unwrap()) + }); + + if i == path.len() - 1 { + inner_expansion = quote! { + #inner_expansion + .with_executable(|s| { + #enum_name::#variant_ident { + #(#final_executable,)* + } + }) + }; + } + } + } + } + } + quote!(#inner_expansion) +} + +fn process_paths_struct( + struct_name: &Ident, + paths: Vec<(Vec, bool)>, + fields: &Fields, + outer_scopes: Vec, +) -> proc_macro2::TokenStream { + let mut inner_expansion = quote! {}; + let mut first = true; + + for path in paths { + if !first { + inner_expansion = quote! { + #inner_expansion; + + command_graph.root() + }; + } else { + inner_expansion = quote! { + command_graph.root() + }; + + first = false; + } + + let path = path.0; + + let mut final_executable = Vec::new(); + let mut path_first = true; + for (i, arg) in path.iter().enumerate() { + match arg { + CommandArg::Literal(lit) => { + inner_expansion = quote! { + #inner_expansion.literal(#lit) + + }; + if i == path.len() - 1 { + inner_expansion = quote! { + #inner_expansion + .with_executable(|s| #struct_name{#(#final_executable,)*}) + }; + } + + if path_first { + inner_expansion = quote! { + #inner_expansion + .with_scopes(vec![#(#outer_scopes),*]) + }; + path_first = false; + } + } + CommandArg::Required(ident) => { + let field_type = &fields + .iter() + .find(|field| field.ident.as_ref().unwrap() == ident) + .expect("Required arg not found") + .ty; + let ident_string = ident.to_string(); + + inner_expansion = quote! { + #inner_expansion + .argument(#ident_string) + .with_parser::<#field_type>() + }; + + final_executable.push(quote! { + #ident: #field_type::parse_arg(s).unwrap() + }); + + if i == path.len() - 1 { + inner_expansion = quote! { + #inner_expansion + .with_executable(|s| { + #struct_name { + #(#final_executable,)* + } + }) + }; + } + + if path_first { + inner_expansion = quote! { + #inner_expansion + .with_scopes(vec![#(#outer_scopes),*]) + }; + path_first = false; + } + } + CommandArg::Optional(ident) => { + let field_type = &fields + .iter() + .find(|field| field.ident.as_ref().unwrap() == ident) + .expect("Optional arg not found") + .ty; + let so_far_ident = format_ident!("graph_til_{}", ident); + + // get what is inside the Option<...> + let option_inner = match field_type { + syn::Type::Path(ref type_path) => { + let path = &type_path.path; + if path.segments.len() != 1 { + return Error::new_spanned( + path, + "Option type must be a single path segment", + ) + .into_compile_error(); + } + let segment = &path.segments.first().unwrap(); + if segment.ident != "Option" { + return Error::new_spanned( + &segment.ident, + "Option type must be a option", + ) + .into_compile_error(); + } + match &segment.arguments { + syn::PathArguments::AngleBracketed(ref angle_bracketed) => { + if angle_bracketed.args.len() != 1 { + return Error::new_spanned( + angle_bracketed, + "Option type must have a single generic argument", + ) + .into_compile_error(); + } + match angle_bracketed.args.first().unwrap() { + syn::GenericArgument::Type(ref generic_type) => { + generic_type + } + _ => { + return Error::new_spanned( + angle_bracketed, + "Option type must have a single generic argument", + ) + .into_compile_error(); + } + } + } + _ => { + return Error::new_spanned( + segment, + "Option type must have a single generic argument", + ) + .into_compile_error(); + } + } + } + _ => { + return Error::new_spanned( + field_type, + "Option type must be a single path segment", + ) + .into_compile_error(); + } + }; + + let ident_string = ident.to_string(); + + // find the ident of all following optional args + let mut next_optional_args = Vec::new(); + for next_arg in path.iter().skip(i + 1) { + match next_arg { + CommandArg::Optional(ident) => next_optional_args.push(ident), + _ => { + return Error::new_spanned( + struct_name, + "Only optional args can follow an optional arg", + ) + .into_compile_error(); + } + } + } + + inner_expansion = quote! { + let #so_far_ident = {#inner_expansion + .with_executable(|s| { + #struct_name { + #(#final_executable,)* + #ident: None, + #(#next_optional_args: None,)* + } + }) + .id()}; + + command_graph.at(#so_far_ident) + .argument(#ident_string) + .with_parser::<#option_inner>() + }; + + final_executable.push(quote! { + #ident: Some(#option_inner::parse_arg(s).unwrap()) + }); + + if i == path.len() - 1 { + inner_expansion = quote! { + #inner_expansion + .with_executable(|s| { + #struct_name { + #(#final_executable,)* + } + }) + }; + } + + if path_first { + inner_expansion = quote! { + #inner_expansion + .with_scopes(vec![#(#outer_scopes),*]) + }; + path_first = false; + } + } + } + } + } + quote!(#inner_expansion) +} + +#[derive(Debug)] +enum CommandArg { + Required(Ident), + Optional(Ident), + Literal(String), +} + +// example input: #[paths = "strawberry {0?}"] +// example output: [CommandArg::Literal("Strawberry"), CommandArg::Optional(0)] +fn parse_path(path: &Attribute) -> Option, bool)>> { + let path_strings: Vec = get_lit_list_attr(path, "paths")?; + + let mut paths = Vec::new(); + // we now have the path as a string eg "strawberry {0?}" + // the first word is a literal + // the next word is an optional arg with the index 0 + for path_str in path_strings { + let mut args = Vec::new(); + let at_root = path_str.starts_with("{/}"); + + for word in path_str + .split_whitespace() + .skip(if at_root { 1 } else { 0 }) + { + if word.starts_with('{') && word.ends_with('}') { + if word.ends_with("?}") { + args.push(CommandArg::Optional(format_ident!( + "{}", + word[1..word.len() - 2].to_string() + ))); + } else { + args.push(CommandArg::Required(format_ident!( + "{}", + word[1..word.len() - 1].to_string() + ))); + } + } else { + args.push(CommandArg::Literal(word.to_string())); + } + } + paths.push((args, at_root)); + } + + Some(paths) +} + +fn get_lit_list_attr(attr: &Attribute, ident: &str) -> Option> { + match attr.meta { + Meta::NameValue(ref key_value) => { + if !key_value.path.is_ident(ident) { + return None; + } + + match key_value.value { + Expr::Lit(ref lit) => match lit.lit { + syn::Lit::Str(ref lit_str) => Some(vec![lit_str.value()]), + _ => None, + }, + _ => None, + } + } + Meta::List(ref list) => { + if !list.path.is_ident(ident) { + return None; + } + + let mut path_strings = Vec::new(); + // parse as array with strings + let mut comma_next = false; + for token in list.tokens.clone() { + match token { + TokenTree::Literal(lit) => { + if comma_next { + return None; + } + let lit_str = lit.to_string(); + path_strings.push( + lit_str + .strip_prefix('"') + .unwrap() + .strip_suffix('"') + .unwrap() + .to_string(), + ); + comma_next = true; + } + TokenTree::Punct(punct) => { + if punct.as_char() != ',' || !comma_next { + return None; + } + comma_next = false; + } + _ => return None, + } + } + Some(path_strings) + } + _ => None, + } +} diff --git a/vendor/valence/crates/valence_entity/Cargo.toml b/vendor/valence/crates/valence_entity/Cargo.toml new file mode 100644 index 00000000..7e01c41d --- /dev/null +++ b/vendor/valence/crates/valence_entity/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "valence_entity" +description = "Minecraft entities for Valence" +readme = "README.md" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[dependencies] +anyhow.workspace = true +bevy_app.workspace = true +bevy_ecs.workspace = true +bitfield-struct.workspace = true +derive_more.workspace = true +valence_math.workspace = true +paste.workspace = true +rustc-hash.workspace = true +tracing.workspace = true +uuid.workspace = true +valence_server_common.workspace = true +valence_nbt.workspace = true +valence_generated.workspace = true +valence_protocol.workspace = true +indexmap.workspace = true + +[build-dependencies] +anyhow.workspace = true +proc-macro2.workspace = true +quote.workspace = true +syn.workspace = true +serde_json.workspace = true +heck.workspace = true +serde.workspace = true +valence_build_utils.workspace = true diff --git a/vendor/valence/crates/valence_entity/README.md b/vendor/valence/crates/valence_entity/README.md new file mode 100644 index 00000000..18a76d10 --- /dev/null +++ b/vendor/valence/crates/valence_entity/README.md @@ -0,0 +1,5 @@ +# valence_entity + +Components and systems concerning Minecraft entities. This includes "zombie", "chicken", "player", etc. + +Bundles of components are used to spawn entities. Each entity type gets its own module here. diff --git a/vendor/valence/crates/valence_entity/build.rs b/vendor/valence/crates/valence_entity/build.rs new file mode 100644 index 00000000..46c70ccb --- /dev/null +++ b/vendor/valence/crates/valence_entity/build.rs @@ -0,0 +1,783 @@ +use std::collections::BTreeMap; + +use anyhow::Context; +use heck::{ToPascalCase, ToShoutySnakeCase, ToSnakeCase}; +use proc_macro2::TokenStream; +use quote::quote; +use serde::Deserialize; +use valence_build_utils::{ident, rerun_if_changed, write_generated_file}; + +#[derive(Deserialize, Clone, Debug)] +struct Entity { + #[serde(rename = "type")] + typ: Option, + translation_key: Option, + fields: Vec, + attributes: Option>, + parent: Option, +} + +#[derive(Deserialize, Clone, Debug)] +struct EntityTypes { + entity_type: BTreeMap, +} + +#[derive(Deserialize, Clone, Debug)] +struct Field { + name: String, + index: u8, + #[serde(flatten)] + default_value: Value, +} + +#[derive(Deserialize, Clone, Debug)] +struct Attribute { + name: String, + base_value: f64, +} + +#[derive(Deserialize, Clone, Debug)] +#[serde(tag = "type", content = "default_value", rename_all = "snake_case")] +#[allow(dead_code)] +enum Value { + Byte(i8), + Integer(i32), + Long(i64), + Float(f32), + String(String), + TextComponent(String), + OptionalTextComponent(Option), + ItemStack(String), + Boolean(bool), + Rotation { + pitch: f32, + yaw: f32, + roll: f32, + }, + BlockPos(BlockPos), + OptionalBlockPos(Option), + Facing(String), + OptionalUuid(Option), + BlockState(String), + OptionalBlockState(Option), + NbtCompound(String), + Particle(String), + VillagerData { + #[serde(rename = "type")] + typ: String, + profession: String, + level: i32, + }, + OptionalInt(Option), + EntityPose(String), + CatVariant(String), + FrogVariant(String), + OptionalGlobalPos(Option<()>), // TODO + PaintingVariant(String), + SnifferState(String), + Vector3f { + x: f32, + y: f32, + z: f32, + }, + Quaternionf { + x: f32, + y: f32, + z: f32, + w: f32, + }, +} + +#[derive(Deserialize, Debug, Clone, Copy)] +struct BlockPos { + x: i32, + y: i32, + z: i32, +} + +impl Value { + pub fn type_id(&self) -> u8 { + match self { + Value::Byte(_) => 0, + Value::Integer(_) => 1, + Value::Long(_) => 2, + Value::Float(_) => 3, + Value::String(_) => 4, + Value::TextComponent(_) => 5, + Value::OptionalTextComponent(_) => 6, + Value::ItemStack(_) => 7, + Value::Boolean(_) => 8, + Value::Rotation { .. } => 9, + Value::BlockPos(_) => 10, + Value::OptionalBlockPos(_) => 11, + Value::Facing(_) => 12, + Value::OptionalUuid(_) => 13, + Value::BlockState(_) => 14, + Value::OptionalBlockState(_) => 15, + Value::NbtCompound(_) => 16, + Value::Particle(_) => 17, + Value::VillagerData { .. } => 18, + Value::OptionalInt(_) => 19, + Value::EntityPose(_) => 20, + Value::CatVariant(_) => 21, + Value::FrogVariant(_) => 22, + Value::OptionalGlobalPos(_) => 23, + Value::PaintingVariant(_) => 24, + Value::SnifferState(_) => 25, + Value::Vector3f { .. } => 26, + Value::Quaternionf { .. } => 27, + } + } + + pub fn field_type(&self) -> TokenStream { + match self { + Value::Byte(_) => quote!(i8), + Value::Integer(_) => quote!(i32), + Value::Long(_) => quote!(i64), + Value::Float(_) => quote!(f32), + Value::String(_) => quote!(String), + Value::TextComponent(_) => quote!(valence_protocol::Text), + Value::OptionalTextComponent(_) => quote!(Option), + Value::ItemStack(_) => quote!(valence_protocol::ItemStack), + Value::Boolean(_) => quote!(bool), + Value::Rotation { .. } => quote!(crate::EulerAngle), + Value::BlockPos(_) => quote!(valence_protocol::BlockPos), + Value::OptionalBlockPos(_) => quote!(Option), + Value::Facing(_) => quote!(valence_protocol::Direction), + Value::OptionalUuid(_) => quote!(Option<::uuid::Uuid>), + Value::BlockState(_) => quote!(valence_protocol::BlockState), + Value::OptionalBlockState(_) => quote!(valence_protocol::BlockState), + Value::NbtCompound(_) => quote!(valence_nbt::Compound), + Value::Particle(_) => quote!(valence_protocol::packets::play::particle_s2c::Particle), + Value::VillagerData { .. } => quote!(crate::VillagerData), + Value::OptionalInt(_) => quote!(Option), + Value::EntityPose(_) => quote!(crate::Pose), + Value::CatVariant(_) => quote!(crate::CatKind), + Value::FrogVariant(_) => quote!(crate::FrogKind), + Value::OptionalGlobalPos(_) => quote!(()), // TODO + Value::PaintingVariant(_) => quote!(crate::PaintingKind), + Value::SnifferState(_) => quote!(crate::SnifferState), + Value::Vector3f { .. } => quote!(valence_math::Vec3), + Value::Quaternionf { .. } => quote!(valence_math::Quat), + } + } + + pub fn default_expr(&self) -> TokenStream { + match self { + Value::Byte(b) => quote!(#b), + Value::Integer(i) => quote!(#i), + Value::Long(l) => quote!(#l), + Value::Float(f) => quote!(#f), + Value::String(s) => quote!(#s.to_owned()), + Value::TextComponent(txt) => { + assert!(txt.is_empty()); + quote!(valence_protocol::Text::default()) + } + Value::OptionalTextComponent(t) => { + assert!(t.is_none()); + quote!(None) + } + Value::ItemStack(stack) => { + assert_eq!(stack, "0 air"); + quote!(valence_protocol::ItemStack::default()) + } + Value::Boolean(b) => quote!(#b), + Value::Rotation { pitch, yaw, roll } => quote! { + crate::EulerAngle { + pitch: #pitch, + yaw: #yaw, + roll: #roll, + } + }, + Value::BlockPos(BlockPos { x, y, z }) => { + quote!(valence_protocol::BlockPos { x: #x, y: #y, z: #z }) + } + Value::OptionalBlockPos(pos) => { + assert!(pos.is_none()); + quote!(None) + } + Value::Facing(f) => { + let variant = ident(f.to_pascal_case()); + quote!(valence_protocol::Direction::#variant) + } + Value::OptionalUuid(uuid) => { + assert!(uuid.is_none()); + quote!(None) + } + Value::BlockState(_) => { + quote!(valence_protocol::BlockState::default()) + } + Value::OptionalBlockState(bs) => { + assert!(bs.is_none()); + quote!(valence_protocol::BlockState::default()) + } + Value::NbtCompound(s) => { + assert_eq!(s, "{}"); + quote!(valence_nbt::Compound::default()) + } + Value::Particle(p) => { + let variant = ident(p.to_pascal_case()); + quote!(valence_protocol::packets::play::particle_s2c::Particle::#variant) + } + Value::VillagerData { + typ, + profession, + level, + } => { + let typ = ident(typ.to_pascal_case()); + let profession = ident(profession.to_pascal_case()); + quote! { + crate::VillagerData { + kind: crate::VillagerKind::#typ, + profession: crate::VillagerProfession::#profession, + level: #level, + } + } + } + Value::OptionalInt(i) => { + assert!(i.is_none()); + quote!(None) + } + Value::EntityPose(p) => { + let variant = ident(p.to_pascal_case()); + quote!(crate::Pose::#variant) + } + Value::CatVariant(c) => { + let variant = ident(c.to_pascal_case()); + quote!(crate::CatKind::#variant) + } + Value::FrogVariant(f) => { + let variant = ident(f.to_pascal_case()); + quote!(crate::FrogKind::#variant) + } + Value::OptionalGlobalPos(_) => quote!(()), + Value::PaintingVariant(p) => { + let variant = ident(p.to_pascal_case()); + quote!(crate::PaintingKind::#variant) + } + Value::SnifferState(s) => { + let state = ident(s.to_pascal_case()); + quote!(crate::SnifferState::#state) + } + Value::Vector3f { x, y, z } => quote!(valence_math::Vec3::new(#x, #y, #z)), + Value::Quaternionf { x, y, z, w } => quote! { + valence_math::Quat::from_xyzw(#x, #y, #z, #w) + }, + } + } + + pub fn encodable_expr(&self, self_lvalue: TokenStream) -> TokenStream { + match self { + Value::Integer(_) => quote!(VarInt(#self_lvalue)), + Value::OptionalInt(_) => quote!(OptionalInt(#self_lvalue)), + _ => quote!(&#self_lvalue), + } + } +} + +type Entities = BTreeMap; + +pub fn main() -> anyhow::Result<()> { + rerun_if_changed(["extracted/misc.json", "extracted/entities.json"]); + + write_generated_file(build_entities()?, "entity.rs")?; + + Ok(()) +} + +fn build_entities() -> anyhow::Result { + let entity_types = serde_json::from_str::(include_str!("extracted/misc.json")) + .context("failed to deserialize misc.json")? + .entity_type; + + let entities: Entities = + serde_json::from_str::(include_str!("extracted/entities.json")) + .context("failed to deserialize entities.json")? + .into_iter() + .collect(); + + let mut entity_kind_consts = TokenStream::new(); + let mut entity_kind_fmt_args = TokenStream::new(); + let mut translation_key_arms = TokenStream::new(); + let mut modules = TokenStream::new(); + let mut systems = TokenStream::new(); + let mut system_names = vec![]; + + for (entity_name, entity) in entities.clone() { + let entity_name_ident = ident(&entity_name); + let stripped_shouty_entity_name = strip_entity_suffix(&entity_name).to_shouty_snake_case(); + let stripped_shouty_entity_name_ident = ident(&stripped_shouty_entity_name); + let stripped_snake_entity_name = strip_entity_suffix(&entity_name).to_snake_case(); + let stripped_snake_entity_name_ident = ident(&stripped_snake_entity_name); + + let mut module_body = TokenStream::new(); + + if let Some(parent_name) = entity.parent { + let stripped_snake_parent_name = strip_entity_suffix(&parent_name).to_snake_case(); + + let module_doc = format!( + "Parent class: \ + [`{stripped_snake_parent_name}`][super::{stripped_snake_parent_name}]." + ); + + module_body.extend([quote! { + #![doc = #module_doc] + }]); + } + + // Is this a concrete entity type? + if let Some(entity_type) = entity.typ { + let entity_type_id = entity_types[&entity_type]; + + entity_kind_consts.extend([quote! { + pub const #stripped_shouty_entity_name_ident: EntityKind = EntityKind(#entity_type_id); + }]); + + entity_kind_fmt_args.extend([quote! { + EntityKind::#stripped_shouty_entity_name_ident => write!(f, "{} ({})", #entity_type_id, #stripped_shouty_entity_name), + }]); + + let translation_key_expr = if let Some(key) = entity.translation_key { + quote!(Some(#key)) + } else { + quote!(None) + }; + + translation_key_arms.extend([quote! { + EntityKind::#stripped_shouty_entity_name_ident => #translation_key_expr, + }]); + + // Create bundle type. + let mut bundle_fields = TokenStream::new(); + let mut bundle_init_fields = TokenStream::new(); + + for marker_or_field in collect_bundle_fields(&entity_name, &entities) { + match marker_or_field { + MarkerOrField::Marker { entity_name } => { + let stripped_entity_name = strip_entity_suffix(entity_name); + + let snake_entity_name_ident = ident(entity_name.to_snake_case()); + let stripped_snake_entity_name_ident = + ident(stripped_entity_name.to_snake_case()); + let pascal_entity_name_ident = ident(entity_name.to_pascal_case()); + + bundle_fields.extend([quote! { + pub #snake_entity_name_ident: super::#stripped_snake_entity_name_ident::#pascal_entity_name_ident, + }]); + + bundle_init_fields.extend([quote! { + #snake_entity_name_ident: Default::default(), + }]); + + match entity_name { + "LivingEntity" => { + bundle_fields.extend([quote! { + pub living_absorption: super::living::Absorption, + }]); + + bundle_init_fields.extend([quote! { + living_absorption: Default::default(), + }]); + + bundle_fields.extend([quote! { + pub living_attributes: super::attributes::EntityAttributes, + }]); + + // Get the default values of the attributes. + let mut attribute_default_values = TokenStream::new(); + + if let Some(attributes) = &entity.attributes { + for attribute in attributes { + let name = ident(attribute.name.to_pascal_case()); + let base_value = attribute.base_value; + attribute_default_values.extend([quote! { + .with_attribute_and_value( + super::EntityAttribute::#name, + #base_value, + ) + }]); + } + } + + bundle_init_fields.extend([quote! { + living_attributes: super::attributes::EntityAttributes::new() #attribute_default_values, + }]); + + bundle_fields.extend([quote! { + pub living_attributes_tracker: super::attributes::TrackedEntityAttributes, + }]); + bundle_init_fields.extend([quote! { + living_attributes_tracker: Default::default(), + }]); + + bundle_fields.extend([quote! { + pub living_active_status_effects: super::active_status_effects::ActiveStatusEffects, + }]); + bundle_init_fields.extend([quote! { + living_active_status_effects: Default::default(), + }]); + } + "PlayerEntity" => { + bundle_fields.extend([quote! { + pub player_food: super::player::Food, + pub player_saturation: super::player::Saturation, + }]); + + bundle_init_fields.extend([quote! { + player_food: Default::default(), + player_saturation: Default::default(), + }]); + } + _ => {} + } + } + MarkerOrField::Field { entity_name, field } => { + let snake_field_name = field.name.to_snake_case(); + let pascal_field_name = field.name.to_pascal_case(); + let pascal_field_name_ident = ident(&pascal_field_name); + let stripped_entity_name = strip_entity_suffix(entity_name); + let stripped_snake_entity_name = stripped_entity_name.to_snake_case(); + let stripped_snake_entity_name_ident = ident(&stripped_snake_entity_name); + + let field_name_ident = + ident(format!("{stripped_snake_entity_name}_{snake_field_name}")); + + bundle_fields.extend([quote! { + pub #field_name_ident: super::#stripped_snake_entity_name_ident::#pascal_field_name_ident, + }]); + + bundle_init_fields.extend([quote! { + #field_name_ident: Default::default(), + }]); + } + } + } + + bundle_fields.extend([quote! { + pub kind: super::EntityKind, + pub id: super::EntityId, + pub uuid: super::UniqueId, + pub layer: super::EntityLayerId, + pub old_layer: super::OldEntityLayerId, + pub position: super::Position, + pub old_position: super::OldPosition, + pub look: super::Look, + pub head_yaw: super::HeadYaw, + pub on_ground: super::OnGround, + pub velocity: super::Velocity, + pub statuses: super::EntityStatuses, + pub animations: super::EntityAnimations, + pub object_data: super::ObjectData, + pub tracked_data: super::tracked_data::TrackedData, + }]); + + bundle_init_fields.extend([quote! { + kind: super::EntityKind::#stripped_shouty_entity_name_ident, + id: Default::default(), + uuid: Default::default(), + layer: Default::default(), + old_layer: Default::default(), + position: Default::default(), + old_position: Default::default(), + look: Default::default(), + head_yaw: Default::default(), + on_ground: Default::default(), + velocity: Default::default(), + statuses: Default::default(), + animations: Default::default(), + object_data: Default::default(), + tracked_data: Default::default(), + }]); + + let bundle_name_ident = ident(format!("{entity_name}Bundle")); + let bundle_doc = format!( + "The bundle of components for spawning `{stripped_snake_entity_name}` entities." + ); + + module_body.extend([quote! { + #[doc = #bundle_doc] + #[derive(bevy_ecs::bundle::Bundle, Debug)] + pub struct #bundle_name_ident { + #bundle_fields + } + + impl Default for #bundle_name_ident { + fn default() -> Self { + Self { + #bundle_init_fields + } + } + } + }]); + } + + for field in &entity.fields { + let pascal_field_name_ident = ident(field.name.to_pascal_case()); + let snake_field_name = field.name.to_snake_case(); + let inner_type = field.default_value.field_type(); + let default_expr = field.default_value.default_expr(); + + module_body.extend([quote! { + #[derive(bevy_ecs::component::Component, PartialEq, Clone, Debug, ::derive_more::Deref, ::derive_more::DerefMut)] + pub struct #pascal_field_name_ident(pub #inner_type); + + #[allow(clippy::derivable_impls)] + impl Default for #pascal_field_name_ident { + fn default() -> Self { + Self(#default_expr) + } + } + }]); + + let system_name_ident = ident(format!( + "update_{stripped_snake_entity_name}_{snake_field_name}" + )); + let component_path = + quote!(#stripped_snake_entity_name_ident::#pascal_field_name_ident); + + system_names.push(quote!(#system_name_ident)); + + let data_index = field.index; + let data_type = field.default_value.type_id(); + let encodable_expr = field.default_value.encodable_expr(quote!(value.0)); + + systems.extend([quote! { + #[allow(clippy::needless_borrow)] + #[allow(clippy::suspicious_else_formatting)] + #[allow(clippy::needless_borrows_for_generic_args)] + fn #system_name_ident( + mut query: Query<(&#component_path, &mut tracked_data::TrackedData), Changed<#component_path>> + ) { + for (value, mut tracked_data) in &mut query { + if *value == Default::default() { + tracked_data.remove_init_value(#data_index); + } else { + tracked_data.insert_init_value(#data_index, #data_type, #encodable_expr); + } + + if !tracked_data.is_added() { + tracked_data.append_update_value(#data_index, #data_type, #encodable_expr); + } + } + } + }]); + } + + let marker_doc = format!("Marker component for `{stripped_snake_entity_name}` entities."); + + module_body.extend([quote! { + #[doc = #marker_doc] + #[derive(bevy_ecs::component::Component, Copy, Clone, Default, Debug)] + pub struct #entity_name_ident; + }]); + + match entity_name.as_str() { + "LivingEntity" => { + module_body.extend([quote! { + #[doc = "Special untracked component for `LivingEntity` entities."] + #[derive(bevy_ecs::component::Component, Copy, Clone, Default, Debug)] + pub struct Absorption(pub f32); + }]); + } + "PlayerEntity" => { + module_body.extend([quote! { + #[doc = "Special untracked component for `PlayerEntity` entities."] + #[derive(bevy_ecs::component::Component, Copy, Clone, Debug)] + pub struct Food(pub i32); + + impl Default for Food { + fn default() -> Self { + Self(20) + } + } + + #[doc = "Special untracked component for `PlayerEntity` entities."] + #[derive(bevy_ecs::component::Component, Copy, Clone, Default, Debug)] + pub struct Saturation(pub f32); + }]); + } + _ => {} + } + + modules.extend([quote! { + #[allow(clippy::module_inception)] + pub mod #stripped_snake_entity_name_ident { + #module_body + } + }]); + } + + systems.extend([quote! { + /// Special case for `living::Absorption`. + /// Updates the `AbsorptionAmount` component of the player entity. + fn update_living_and_player_absorption( + mut query: Query<(&living::Absorption, &mut player::AbsorptionAmount), Changed> + ) { + for (living_absorption, mut player_absorption) in query.iter_mut() { + player_absorption.0 = living_absorption.0; + } + } + + /// Special case for `living::Attributes`. + fn update_living_attributes( + mut query: Query<( + &mut attributes::TrackedEntityAttributes, + &mut attributes::EntityAttributes, + ), + Changed> + ) { + for (mut tracked, mut attributes) in query.iter_mut() { + for attribute in attributes.take_recently_changed() { + tracked.mark_modified(&attributes, attribute); + } + } + } + }]); + + system_names.push(quote!(update_living_and_player_absorption)); + system_names.push(quote!(update_living_attributes)); + + #[derive(Deserialize, Debug)] + struct MiscEntityData { + entity_status: BTreeMap, + entity_animation: BTreeMap, + } + + let misc_entity_data: MiscEntityData = + serde_json::from_str(include_str!("extracted/misc.json"))?; + + let entity_status_variants = misc_entity_data + .entity_status + .into_iter() + .map(|(name, code)| { + let name = ident(name.to_pascal_case()); + let code = code as isize; + + quote! { + #name = #code, + } + }); + + let entity_animation_variants = + misc_entity_data + .entity_animation + .into_iter() + .map(|(name, code)| { + let name = ident(name.to_pascal_case()); + let code = code as isize; + + quote! { + #name = #code, + } + }); + + Ok(quote! { + use valence_generated::attributes::EntityAttribute; + + #modules + + /// Identifies the type of an entity. + /// As a component, the entity kind should not be modified. + #[derive(Component, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default, ::derive_more::Deref)] + pub struct EntityKind(i32); + + impl EntityKind { + #entity_kind_consts + + pub const fn new(inner: i32) -> Self { + Self(inner) + } + + pub const fn get(self) -> i32 { + self.0 + } + + pub const fn translation_key(self) -> Option<&'static str> { + match self { + #translation_key_arms + _ => None, + } + } + } + + impl std::fmt::Debug for EntityKind { + #[allow(clippy::write_literal)] + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + match *self { + #entity_kind_fmt_args + EntityKind(other) => write!(f, "{other}"), + } + } + } + + #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)] + pub enum EntityStatus { + #(#entity_status_variants)* + } + + #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)] + pub enum EntityAnimation { + #(#entity_animation_variants)* + } + + fn add_tracked_data_systems(app: &mut App) { + #systems + + #( + app.add_systems( + PostUpdate, + #system_names + .in_set(UpdateTrackedDataSet) + .ambiguous_with(UpdateTrackedDataSet) + ); + )* + } + }) +} + +enum MarkerOrField<'a> { + Marker { + entity_name: &'a str, + }, + Field { + entity_name: &'a str, + field: &'a Field, + }, +} + +fn collect_bundle_fields<'a>( + mut entity_name: &'a str, + entities: &'a Entities, +) -> Vec> { + let mut res = vec![]; + + loop { + let e = &entities[entity_name]; + + res.push(MarkerOrField::Marker { entity_name }); + res.extend( + e.fields + .iter() + .map(|field| MarkerOrField::Field { entity_name, field }), + ); + + if let Some(parent) = &e.parent { + entity_name = parent; + } else { + break; + } + } + + res +} + +fn strip_entity_suffix(string: &str) -> String { + let stripped = string.strip_suffix("Entity").unwrap_or(string); + + if stripped.is_empty() { + string + } else { + stripped + } + .to_owned() +} diff --git a/vendor/valence/crates/valence_entity/extracted/entities.json b/vendor/valence/crates/valence_entity/extracted/entities.json new file mode 100644 index 00000000..f7638662 --- /dev/null +++ b/vendor/valence/crates/valence_entity/extracted/entities.json @@ -0,0 +1,6224 @@ +{ + "AbstractDecorationEntity": { + "parent": "Entity", + "fields": [] + }, + "AbstractDonkeyEntity": { + "parent": "AbstractHorseEntity", + "fields": [ + { + "name": "chest", + "index": 18, + "type": "boolean", + "default_value": false + } + ], + "attributes": [] + }, + "AbstractFireballEntity": { + "parent": "ExplosiveProjectileEntity", + "fields": [ + { + "name": "item", + "index": 8, + "type": "item_stack", + "default_value": "0 air" + } + ] + }, + "AbstractHorseEntity": { + "parent": "AnimalEntity", + "fields": [ + { + "name": "horse_flags", + "index": 17, + "type": "byte", + "default_value": 0 + } + ], + "attributes": [] + }, + "AbstractMinecartEntity": { + "parent": "Entity", + "fields": [ + { + "name": "damage_wobble_ticks", + "index": 8, + "type": "integer", + "default_value": 0 + }, + { + "name": "damage_wobble_side", + "index": 9, + "type": "integer", + "default_value": 1 + }, + { + "name": "damage_wobble_strength", + "index": 10, + "type": "float", + "default_value": 0.0 + }, + { + "name": "custom_block_id", + "index": 11, + "type": "integer", + "default_value": 0 + }, + { + "name": "custom_block_offset", + "index": 12, + "type": "integer", + "default_value": 6 + }, + { + "name": "custom_block_present", + "index": 13, + "type": "boolean", + "default_value": false + } + ] + }, + "AbstractPiglinEntity": { + "parent": "HostileEntity", + "fields": [ + { + "name": "immune_to_zombification", + "index": 16, + "type": "boolean", + "default_value": false + } + ], + "attributes": [] + }, + "AbstractSkeletonEntity": { + "parent": "HostileEntity", + "fields": [], + "attributes": [] + }, + "AllayEntity": { + "parent": "PathAwareEntity", + "type": "allay", + "translation_key": "entity.minecraft.allay", + "fields": [ + { + "name": "dancing", + "index": 16, + "type": "boolean", + "default_value": false + }, + { + "name": "can_duplicate", + "index": 17, + "type": "boolean", + "default_value": true + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 4, + "name": "generic.flying_speed", + "base_value": 0.10000000149011612 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 2.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 48.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.10000000149011612 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 20.0 + } + ], + "default_bounding_box": { + "size_x": 0.3499999940395355, + "size_y": 0.6000000238418579, + "size_z": 0.3499999940395355 + } + }, + "AmbientEntity": { + "parent": "MobEntity", + "fields": [], + "attributes": [] + }, + "AnimalEntity": { + "parent": "PassiveEntity", + "fields": [], + "attributes": [] + }, + "AreaEffectCloudEntity": { + "parent": "Entity", + "type": "area_effect_cloud", + "translation_key": "entity.minecraft.area_effect_cloud", + "fields": [ + { + "name": "radius", + "index": 8, + "type": "float", + "default_value": 3.0 + }, + { + "name": "color", + "index": 9, + "type": "integer", + "default_value": 0 + }, + { + "name": "waiting", + "index": 10, + "type": "boolean", + "default_value": false + }, + { + "name": "particle_id", + "index": 11, + "type": "particle", + "default_value": "entity_effect" + } + ], + "default_bounding_box": { + "size_x": 6.0, + "size_y": 0.5, + "size_z": 6.0 + } + }, + "ArmorStandEntity": { + "parent": "LivingEntity", + "type": "armor_stand", + "translation_key": "entity.minecraft.armor_stand", + "fields": [ + { + "name": "armor_stand_flags", + "index": 15, + "type": "byte", + "default_value": 0 + }, + { + "name": "tracker_head_rotation", + "index": 16, + "type": "rotation", + "default_value": { + "pitch": 0.0, + "yaw": 0.0, + "roll": 0.0 + } + }, + { + "name": "tracker_body_rotation", + "index": 17, + "type": "rotation", + "default_value": { + "pitch": 0.0, + "yaw": 0.0, + "roll": 0.0 + } + }, + { + "name": "tracker_left_arm_rotation", + "index": 18, + "type": "rotation", + "default_value": { + "pitch": -10.0, + "yaw": 0.0, + "roll": -10.0 + } + }, + { + "name": "tracker_right_arm_rotation", + "index": 19, + "type": "rotation", + "default_value": { + "pitch": -15.0, + "yaw": 0.0, + "roll": 10.0 + } + }, + { + "name": "tracker_left_leg_rotation", + "index": 20, + "type": "rotation", + "default_value": { + "pitch": -1.0, + "yaw": 0.0, + "roll": -1.0 + } + }, + { + "name": "tracker_right_leg_rotation", + "index": 21, + "type": "rotation", + "default_value": { + "pitch": 1.0, + "yaw": 0.0, + "roll": 1.0 + } + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.699999988079071 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 20.0 + } + ], + "default_bounding_box": { + "size_x": 0.5, + "size_y": 1.975000023841858, + "size_z": 0.5 + } + }, + "ArrowEntity": { + "parent": "PersistentProjectileEntity", + "type": "arrow", + "translation_key": "entity.minecraft.arrow", + "fields": [ + { + "name": "color", + "index": 10, + "type": "integer", + "default_value": -1 + } + ], + "default_bounding_box": { + "size_x": 0.5, + "size_y": 0.5, + "size_z": 0.5 + } + }, + "AxolotlEntity": { + "parent": "AnimalEntity", + "type": "axolotl", + "translation_key": "entity.minecraft.axolotl", + "fields": [ + { + "name": "variant", + "index": 17, + "type": "integer", + "default_value": 0 + }, + { + "name": "playing_dead", + "index": 18, + "type": "boolean", + "default_value": false + }, + { + "name": "from_bucket", + "index": 19, + "type": "boolean", + "default_value": false + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 2.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 1.0 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 14.0 + } + ], + "default_bounding_box": { + "size_x": 0.75, + "size_y": 0.41999998688697815, + "size_z": 0.75 + } + }, + "BatEntity": { + "parent": "AmbientEntity", + "type": "bat", + "translation_key": "entity.minecraft.bat", + "fields": [ + { + "name": "bat_flags", + "index": 16, + "type": "byte", + "default_value": 1 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.699999988079071 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 6.0 + } + ], + "default_bounding_box": { + "size_x": 0.5, + "size_y": 0.8999999761581421, + "size_z": 0.5 + } + }, + "BeeEntity": { + "parent": "AnimalEntity", + "type": "bee", + "translation_key": "entity.minecraft.bee", + "fields": [ + { + "name": "bee_flags", + "index": 17, + "type": "byte", + "default_value": 0 + }, + { + "name": "anger", + "index": 18, + "type": "integer", + "default_value": 0 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 4, + "name": "generic.flying_speed", + "base_value": 0.6000000238418579 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 2.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 48.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.30000001192092896 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 10.0 + } + ], + "default_bounding_box": { + "size_x": 0.699999988079071, + "size_y": 0.6000000238418579, + "size_z": 0.699999988079071 + } + }, + "BlazeEntity": { + "parent": "HostileEntity", + "type": "blaze", + "translation_key": "entity.minecraft.blaze", + "fields": [ + { + "name": "blaze_flags", + "index": 16, + "type": "byte", + "default_value": 0 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 6.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 48.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.23000000417232513 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 20.0 + } + ], + "default_bounding_box": { + "size_x": 0.6000000238418579, + "size_y": 1.7999999523162842, + "size_z": 0.6000000238418579 + } + }, + "BlockDisplayEntity": { + "parent": "DisplayEntity", + "type": "block_display", + "translation_key": "entity.minecraft.block_display", + "fields": [ + { + "name": "block_state", + "index": 22, + "type": "block_state", + "default_value": "Block{minecraft:air}" + } + ], + "default_bounding_box": { + "size_x": 0.0, + "size_y": 0.0, + "size_z": 0.0 + } + }, + "BoatEntity": { + "parent": "Entity", + "type": "boat", + "translation_key": "entity.minecraft.boat", + "fields": [ + { + "name": "damage_wobble_ticks", + "index": 8, + "type": "integer", + "default_value": 0 + }, + { + "name": "damage_wobble_side", + "index": 9, + "type": "integer", + "default_value": 1 + }, + { + "name": "damage_wobble_strength", + "index": 10, + "type": "float", + "default_value": 0.0 + }, + { + "name": "boat_type", + "index": 11, + "type": "integer", + "default_value": 0 + }, + { + "name": "left_paddle_moving", + "index": 12, + "type": "boolean", + "default_value": false + }, + { + "name": "right_paddle_moving", + "index": 13, + "type": "boolean", + "default_value": false + }, + { + "name": "bubble_wobble_ticks", + "index": 14, + "type": "integer", + "default_value": 0 + } + ], + "default_bounding_box": { + "size_x": 1.375, + "size_y": 0.5625, + "size_z": 1.375 + } + }, + "CamelEntity": { + "parent": "AbstractHorseEntity", + "type": "camel", + "translation_key": "entity.minecraft.camel", + "fields": [ + { + "name": "dashing", + "index": 18, + "type": "boolean", + "default_value": false + }, + { + "name": "last_pose_tick", + "index": 19, + "type": "long", + "default_value": 0 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 12, + "name": "horse.jump_strength", + "base_value": 0.41999998688697815 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.09000000357627869 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 32.0 + } + ], + "default_bounding_box": { + "size_x": 1.7000000476837158, + "size_y": 2.375, + "size_z": 1.7000000476837158 + } + }, + "CatEntity": { + "parent": "TameableEntity", + "type": "cat", + "translation_key": "entity.minecraft.cat", + "fields": [ + { + "name": "cat_variant", + "index": 19, + "type": "cat_variant", + "default_value": "black" + }, + { + "name": "in_sleeping_pose", + "index": 20, + "type": "boolean", + "default_value": false + }, + { + "name": "head_down", + "index": 21, + "type": "boolean", + "default_value": false + }, + { + "name": "collar_color", + "index": 22, + "type": "integer", + "default_value": 14 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 3.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.30000001192092896 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 10.0 + } + ], + "default_bounding_box": { + "size_x": 0.6000000238418579, + "size_y": 0.699999988079071, + "size_z": 0.6000000238418579 + } + }, + "CaveSpiderEntity": { + "parent": "SpiderEntity", + "type": "cave_spider", + "translation_key": "entity.minecraft.cave_spider", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 2.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.30000001192092896 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 12.0 + } + ], + "default_bounding_box": { + "size_x": 0.699999988079071, + "size_y": 0.5, + "size_z": 0.699999988079071 + } + }, + "ChestBoatEntity": { + "parent": "BoatEntity", + "type": "chest_boat", + "translation_key": "entity.minecraft.chest_boat", + "fields": [], + "default_bounding_box": { + "size_x": 1.375, + "size_y": 0.5625, + "size_z": 1.375 + } + }, + "ChestMinecartEntity": { + "parent": "StorageMinecartEntity", + "type": "chest_minecart", + "translation_key": "entity.minecraft.chest_minecart", + "fields": [], + "default_bounding_box": { + "size_x": 0.9800000190734863, + "size_y": 0.699999988079071, + "size_z": 0.9800000190734863 + } + }, + "ChickenEntity": { + "parent": "AnimalEntity", + "type": "chicken", + "translation_key": "entity.minecraft.chicken", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.25 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 4.0 + } + ], + "default_bounding_box": { + "size_x": 0.4000000059604645, + "size_y": 0.699999988079071, + "size_z": 0.4000000059604645 + } + }, + "CodEntity": { + "parent": "SchoolingFishEntity", + "type": "cod", + "translation_key": "entity.minecraft.cod", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.699999988079071 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 3.0 + } + ], + "default_bounding_box": { + "size_x": 0.5, + "size_y": 0.30000001192092896, + "size_z": 0.5 + } + }, + "CommandBlockMinecartEntity": { + "parent": "AbstractMinecartEntity", + "type": "command_block_minecart", + "translation_key": "entity.minecraft.command_block_minecart", + "fields": [ + { + "name": "command", + "index": 14, + "type": "string", + "default_value": "" + }, + { + "name": "last_output", + "index": 15, + "type": "text_component", + "default_value": "" + } + ], + "default_bounding_box": { + "size_x": 0.9800000190734863, + "size_y": 0.699999988079071, + "size_z": 0.9800000190734863 + } + }, + "CowEntity": { + "parent": "AnimalEntity", + "type": "cow", + "translation_key": "entity.minecraft.cow", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.20000000298023224 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 10.0 + } + ], + "default_bounding_box": { + "size_x": 0.8999999761581421, + "size_y": 1.399999976158142, + "size_z": 0.8999999761581421 + } + }, + "CreeperEntity": { + "parent": "HostileEntity", + "type": "creeper", + "translation_key": "entity.minecraft.creeper", + "fields": [ + { + "name": "fuse_speed", + "index": 16, + "type": "integer", + "default_value": -1 + }, + { + "name": "charged", + "index": 17, + "type": "boolean", + "default_value": false + }, + { + "name": "ignited", + "index": 18, + "type": "boolean", + "default_value": false + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 2.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.25 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 20.0 + } + ], + "default_bounding_box": { + "size_x": 0.6000000238418579, + "size_y": 1.7000000476837158, + "size_z": 0.6000000238418579 + } + }, + "DisplayEntity": { + "parent": "Entity", + "fields": [ + { + "name": "start_interpolation", + "index": 8, + "type": "integer", + "default_value": 0 + }, + { + "name": "interpolation_duration", + "index": 9, + "type": "integer", + "default_value": 0 + }, + { + "name": "translation", + "index": 10, + "type": "vector3f", + "default_value": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + { + "name": "scale", + "index": 11, + "type": "vector3f", + "default_value": { + "x": 1.0, + "y": 1.0, + "z": 1.0 + } + }, + { + "name": "left_rotation", + "index": 12, + "type": "quaternionf", + "default_value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 1.0 + } + }, + { + "name": "right_rotation", + "index": 13, + "type": "quaternionf", + "default_value": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "w": 1.0 + } + }, + { + "name": "billboard", + "index": 14, + "type": "byte", + "default_value": 0 + }, + { + "name": "brightness", + "index": 15, + "type": "integer", + "default_value": -1 + }, + { + "name": "view_range", + "index": 16, + "type": "float", + "default_value": 1.0 + }, + { + "name": "shadow_radius", + "index": 17, + "type": "float", + "default_value": 0.0 + }, + { + "name": "shadow_strength", + "index": 18, + "type": "float", + "default_value": 1.0 + }, + { + "name": "width", + "index": 19, + "type": "float", + "default_value": 0.0 + }, + { + "name": "height", + "index": 20, + "type": "float", + "default_value": 0.0 + }, + { + "name": "glow_color_override", + "index": 21, + "type": "integer", + "default_value": -1 + } + ] + }, + "DolphinEntity": { + "parent": "WaterCreatureEntity", + "type": "dolphin", + "translation_key": "entity.minecraft.dolphin", + "fields": [ + { + "name": "treasure_pos", + "index": 16, + "type": "block_pos", + "default_value": { + "x": 0, + "y": 0, + "z": 0 + } + }, + { + "name": "has_fish", + "index": 17, + "type": "boolean", + "default_value": false + }, + { + "name": "moistness", + "index": 18, + "type": "integer", + "default_value": 2400 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 3.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 1.2000000476837158 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 10.0 + } + ], + "default_bounding_box": { + "size_x": 0.8999999761581421, + "size_y": 0.6000000238418579, + "size_z": 0.8999999761581421 + } + }, + "DonkeyEntity": { + "parent": "AbstractDonkeyEntity", + "type": "donkey", + "translation_key": "entity.minecraft.donkey", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 12, + "name": "horse.jump_strength", + "base_value": 0.5 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.17499999701976776 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 53.0 + } + ], + "default_bounding_box": { + "size_x": 1.396484375, + "size_y": 1.5, + "size_z": 1.396484375 + } + }, + "DragonFireballEntity": { + "parent": "ExplosiveProjectileEntity", + "type": "dragon_fireball", + "translation_key": "entity.minecraft.dragon_fireball", + "fields": [], + "default_bounding_box": { + "size_x": 1.0, + "size_y": 1.0, + "size_z": 1.0 + } + }, + "DrownedEntity": { + "parent": "ZombieEntity", + "type": "drowned", + "translation_key": "entity.minecraft.drowned", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 11, + "name": "zombie.spawn_reinforcements", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 2.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 3.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 35.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.23000000417232513 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 20.0 + } + ], + "default_bounding_box": { + "size_x": 0.6000000238418579, + "size_y": 1.9500000476837158, + "size_z": 0.6000000238418579 + } + }, + "EggEntity": { + "parent": "ThrownItemEntity", + "type": "egg", + "translation_key": "entity.minecraft.egg", + "fields": [], + "default_bounding_box": { + "size_x": 0.25, + "size_y": 0.25, + "size_z": 0.25 + } + }, + "ElderGuardianEntity": { + "parent": "GuardianEntity", + "type": "elder_guardian", + "translation_key": "entity.minecraft.elder_guardian", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 8.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.30000001192092896 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 80.0 + } + ], + "default_bounding_box": { + "size_x": 1.997499942779541, + "size_y": 1.997499942779541, + "size_z": 1.997499942779541 + } + }, + "EndCrystalEntity": { + "parent": "Entity", + "type": "end_crystal", + "translation_key": "entity.minecraft.end_crystal", + "fields": [ + { + "name": "beam_target", + "index": 8, + "type": "optional_block_pos", + "default_value": null + }, + { + "name": "show_bottom", + "index": 9, + "type": "boolean", + "default_value": true + } + ], + "default_bounding_box": { + "size_x": 2.0, + "size_y": 2.0, + "size_z": 2.0 + } + }, + "EnderDragonEntity": { + "parent": "MobEntity", + "type": "ender_dragon", + "translation_key": "entity.minecraft.ender_dragon", + "fields": [ + { + "name": "phase_type", + "index": 16, + "type": "integer", + "default_value": 10 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.699999988079071 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 200.0 + } + ], + "default_bounding_box": { + "size_x": 16.0, + "size_y": 8.0, + "size_z": 16.0 + } + }, + "EnderPearlEntity": { + "parent": "ThrownItemEntity", + "type": "ender_pearl", + "translation_key": "entity.minecraft.ender_pearl", + "fields": [], + "default_bounding_box": { + "size_x": 0.25, + "size_y": 0.25, + "size_z": 0.25 + } + }, + "EndermanEntity": { + "parent": "HostileEntity", + "type": "enderman", + "translation_key": "entity.minecraft.enderman", + "fields": [ + { + "name": "carried_block", + "index": 16, + "type": "optional_block_state", + "default_value": null + }, + { + "name": "angry", + "index": 17, + "type": "boolean", + "default_value": false + }, + { + "name": "provoked", + "index": 18, + "type": "boolean", + "default_value": false + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 7.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 64.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.30000001192092896 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 40.0 + } + ], + "default_bounding_box": { + "size_x": 0.6000000238418579, + "size_y": 2.9000000953674316, + "size_z": 0.6000000238418579 + } + }, + "EndermiteEntity": { + "parent": "HostileEntity", + "type": "endermite", + "translation_key": "entity.minecraft.endermite", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 2.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.25 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 8.0 + } + ], + "default_bounding_box": { + "size_x": 0.4000000059604645, + "size_y": 0.30000001192092896, + "size_z": 0.4000000059604645 + } + }, + "Entity": { + "fields": [ + { + "name": "flags", + "index": 0, + "type": "byte", + "default_value": 0 + }, + { + "name": "air", + "index": 1, + "type": "integer", + "default_value": 300 + }, + { + "name": "custom_name", + "index": 2, + "type": "optional_text_component", + "default_value": null + }, + { + "name": "name_visible", + "index": 3, + "type": "boolean", + "default_value": false + }, + { + "name": "silent", + "index": 4, + "type": "boolean", + "default_value": false + }, + { + "name": "no_gravity", + "index": 5, + "type": "boolean", + "default_value": false + }, + { + "name": "pose", + "index": 6, + "type": "entity_pose", + "default_value": "standing" + }, + { + "name": "frozen_ticks", + "index": 7, + "type": "integer", + "default_value": 0 + } + ], + "attributes": [] + }, + "EvokerEntity": { + "parent": "SpellcastingIllagerEntity", + "type": "evoker", + "translation_key": "entity.minecraft.evoker", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 2.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 12.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.5 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 24.0 + } + ], + "default_bounding_box": { + "size_x": 0.6000000238418579, + "size_y": 1.9500000476837158, + "size_z": 0.6000000238418579 + } + }, + "EvokerFangsEntity": { + "parent": "Entity", + "type": "evoker_fangs", + "translation_key": "entity.minecraft.evoker_fangs", + "fields": [], + "default_bounding_box": { + "size_x": 0.5, + "size_y": 0.800000011920929, + "size_z": 0.5 + } + }, + "ExperienceBottleEntity": { + "parent": "ThrownItemEntity", + "type": "experience_bottle", + "translation_key": "entity.minecraft.experience_bottle", + "fields": [], + "default_bounding_box": { + "size_x": 0.25, + "size_y": 0.25, + "size_z": 0.25 + } + }, + "ExperienceOrbEntity": { + "parent": "Entity", + "type": "experience_orb", + "translation_key": "entity.minecraft.experience_orb", + "fields": [], + "default_bounding_box": { + "size_x": 0.5, + "size_y": 0.5, + "size_z": 0.5 + } + }, + "ExplosiveProjectileEntity": { + "parent": "ProjectileEntity", + "fields": [] + }, + "EyeOfEnderEntity": { + "parent": "Entity", + "type": "eye_of_ender", + "translation_key": "entity.minecraft.eye_of_ender", + "fields": [ + { + "name": "item", + "index": 8, + "type": "item_stack", + "default_value": "0 air" + } + ], + "default_bounding_box": { + "size_x": 0.25, + "size_y": 0.25, + "size_z": 0.25 + } + }, + "FallingBlockEntity": { + "parent": "Entity", + "type": "falling_block", + "translation_key": "entity.minecraft.falling_block", + "fields": [ + { + "name": "block_pos", + "index": 8, + "type": "block_pos", + "default_value": { + "x": 0, + "y": 0, + "z": 0 + } + } + ], + "default_bounding_box": { + "size_x": 0.9800000190734863, + "size_y": 0.9800000190734863, + "size_z": 0.9800000190734863 + } + }, + "FireballEntity": { + "parent": "AbstractFireballEntity", + "type": "fireball", + "translation_key": "entity.minecraft.fireball", + "fields": [], + "default_bounding_box": { + "size_x": 1.0, + "size_y": 1.0, + "size_z": 1.0 + } + }, + "FireworkRocketEntity": { + "parent": "ProjectileEntity", + "type": "firework_rocket", + "translation_key": "entity.minecraft.firework_rocket", + "fields": [ + { + "name": "item", + "index": 8, + "type": "item_stack", + "default_value": "0 air" + }, + { + "name": "shooter_entity_id", + "index": 9, + "type": "optional_int", + "default_value": null + }, + { + "name": "shot_at_angle", + "index": 10, + "type": "boolean", + "default_value": false + } + ], + "default_bounding_box": { + "size_x": 0.25, + "size_y": 0.25, + "size_z": 0.25 + } + }, + "FishEntity": { + "parent": "WaterCreatureEntity", + "fields": [ + { + "name": "from_bucket", + "index": 16, + "type": "boolean", + "default_value": false + } + ], + "attributes": [] + }, + "FishingBobberEntity": { + "parent": "ProjectileEntity", + "type": "fishing_bobber", + "translation_key": "entity.minecraft.fishing_bobber", + "fields": [ + { + "name": "hook_entity_id", + "index": 8, + "type": "integer", + "default_value": 0 + }, + { + "name": "caught_fish", + "index": 9, + "type": "boolean", + "default_value": false + } + ], + "default_bounding_box": { + "size_x": 0.25, + "size_y": 0.25, + "size_z": 0.25 + } + }, + "FlyingEntity": { + "parent": "MobEntity", + "fields": [], + "attributes": [] + }, + "FoxEntity": { + "parent": "AnimalEntity", + "type": "fox", + "translation_key": "entity.minecraft.fox", + "fields": [ + { + "name": "type", + "index": 17, + "type": "integer", + "default_value": 0 + }, + { + "name": "fox_flags", + "index": 18, + "type": "byte", + "default_value": 0 + }, + { + "name": "owner", + "index": 19, + "type": "optional_uuid", + "default_value": null + }, + { + "name": "other_trusted", + "index": 20, + "type": "optional_uuid", + "default_value": null + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 2.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 32.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.30000001192092896 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 10.0 + } + ], + "default_bounding_box": { + "size_x": 0.6000000238418579, + "size_y": 0.699999988079071, + "size_z": 0.6000000238418579 + } + }, + "FrogEntity": { + "parent": "AnimalEntity", + "type": "frog", + "translation_key": "entity.minecraft.frog", + "fields": [ + { + "name": "variant", + "index": 17, + "type": "frog_variant", + "default_value": "temperate" + }, + { + "name": "target", + "index": 18, + "type": "optional_int", + "default_value": null + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 10.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 1.0 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 10.0 + } + ], + "default_bounding_box": { + "size_x": 0.5, + "size_y": 0.5, + "size_z": 0.5 + } + }, + "FurnaceMinecartEntity": { + "parent": "AbstractMinecartEntity", + "type": "furnace_minecart", + "translation_key": "entity.minecraft.furnace_minecart", + "fields": [ + { + "name": "lit", + "index": 14, + "type": "boolean", + "default_value": false + } + ], + "default_bounding_box": { + "size_x": 0.9800000190734863, + "size_y": 0.699999988079071, + "size_z": 0.9800000190734863 + } + }, + "GhastEntity": { + "parent": "FlyingEntity", + "type": "ghast", + "translation_key": "entity.minecraft.ghast", + "fields": [ + { + "name": "shooting", + "index": 16, + "type": "boolean", + "default_value": false + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 100.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.699999988079071 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 10.0 + } + ], + "default_bounding_box": { + "size_x": 4.0, + "size_y": 4.0, + "size_z": 4.0 + } + }, + "GiantEntity": { + "parent": "HostileEntity", + "type": "giant", + "translation_key": "entity.minecraft.giant", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 50.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.5 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 100.0 + } + ], + "default_bounding_box": { + "size_x": 3.5999999046325684, + "size_y": 12.0, + "size_z": 3.5999999046325684 + } + }, + "GlowItemFrameEntity": { + "parent": "ItemFrameEntity", + "type": "glow_item_frame", + "translation_key": "entity.minecraft.glow_item_frame", + "fields": [], + "default_bounding_box": { + "size_x": 0.0, + "size_y": 0.0, + "size_z": 0.0 + } + }, + "GlowSquidEntity": { + "parent": "SquidEntity", + "type": "glow_squid", + "translation_key": "entity.minecraft.glow_squid", + "fields": [ + { + "name": "dark_ticks_remaining", + "index": 16, + "type": "integer", + "default_value": 0 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.699999988079071 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 10.0 + } + ], + "default_bounding_box": { + "size_x": 0.800000011920929, + "size_y": 0.800000011920929, + "size_z": 0.800000011920929 + } + }, + "GoatEntity": { + "parent": "AnimalEntity", + "type": "goat", + "translation_key": "entity.minecraft.goat", + "fields": [ + { + "name": "screaming", + "index": 17, + "type": "boolean", + "default_value": false + }, + { + "name": "left_horn", + "index": 18, + "type": "boolean", + "default_value": true + }, + { + "name": "right_horn", + "index": 19, + "type": "boolean", + "default_value": true + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 2.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.20000000298023224 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 10.0 + } + ], + "default_bounding_box": { + "size_x": 0.8999999761581421, + "size_y": 1.2999999523162842, + "size_z": 0.8999999761581421 + } + }, + "GolemEntity": { + "parent": "PathAwareEntity", + "fields": [], + "attributes": [] + }, + "GuardianEntity": { + "parent": "HostileEntity", + "type": "guardian", + "translation_key": "entity.minecraft.guardian", + "fields": [ + { + "name": "spikes_retracted", + "index": 16, + "type": "boolean", + "default_value": false + }, + { + "name": "beam_target_id", + "index": 17, + "type": "integer", + "default_value": 0 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 6.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.5 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 30.0 + } + ], + "default_bounding_box": { + "size_x": 0.8500000238418579, + "size_y": 0.8500000238418579, + "size_z": 0.8500000238418579 + } + }, + "HoglinEntity": { + "parent": "AnimalEntity", + "type": "hoglin", + "translation_key": "entity.minecraft.hoglin", + "fields": [ + { + "name": "baby", + "index": 17, + "type": "boolean", + "default_value": false + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 1.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.6000000238418579 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 6.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.30000001192092896 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 40.0 + } + ], + "default_bounding_box": { + "size_x": 1.396484375, + "size_y": 1.399999976158142, + "size_z": 1.396484375 + } + }, + "HopperMinecartEntity": { + "parent": "StorageMinecartEntity", + "type": "hopper_minecart", + "translation_key": "entity.minecraft.hopper_minecart", + "fields": [], + "default_bounding_box": { + "size_x": 0.9800000190734863, + "size_y": 0.699999988079071, + "size_z": 0.9800000190734863 + } + }, + "HorseEntity": { + "parent": "AbstractHorseEntity", + "type": "horse", + "translation_key": "entity.minecraft.horse", + "fields": [ + { + "name": "variant", + "index": 18, + "type": "integer", + "default_value": 0 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 12, + "name": "horse.jump_strength", + "base_value": 0.7 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.22499999403953552 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 53.0 + } + ], + "default_bounding_box": { + "size_x": 1.396484375, + "size_y": 1.600000023841858, + "size_z": 1.396484375 + } + }, + "HostileEntity": { + "parent": "PathAwareEntity", + "fields": [], + "attributes": [] + }, + "HuskEntity": { + "parent": "ZombieEntity", + "type": "husk", + "translation_key": "entity.minecraft.husk", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 11, + "name": "zombie.spawn_reinforcements", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 2.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 3.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 35.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.23000000417232513 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 20.0 + } + ], + "default_bounding_box": { + "size_x": 0.6000000238418579, + "size_y": 1.9500000476837158, + "size_z": 0.6000000238418579 + } + }, + "IllagerEntity": { + "parent": "RaiderEntity", + "fields": [], + "attributes": [] + }, + "IllusionerEntity": { + "parent": "SpellcastingIllagerEntity", + "type": "illusioner", + "translation_key": "entity.minecraft.illusioner", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 2.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 18.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.5 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 32.0 + } + ], + "default_bounding_box": { + "size_x": 0.6000000238418579, + "size_y": 1.9500000476837158, + "size_z": 0.6000000238418579 + } + }, + "InteractionEntity": { + "parent": "Entity", + "type": "interaction", + "translation_key": "entity.minecraft.interaction", + "fields": [ + { + "name": "width", + "index": 8, + "type": "float", + "default_value": 1.0 + }, + { + "name": "height", + "index": 9, + "type": "float", + "default_value": 1.0 + }, + { + "name": "response", + "index": 10, + "type": "boolean", + "default_value": false + } + ], + "default_bounding_box": { + "size_x": 1.0, + "size_y": 1.0, + "size_z": 1.0 + } + }, + "IronGolemEntity": { + "parent": "GolemEntity", + "type": "iron_golem", + "translation_key": "entity.minecraft.iron_golem", + "fields": [ + { + "name": "iron_golem_flags", + "index": 16, + "type": "byte", + "default_value": 0 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 1.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 15.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.25 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 100.0 + } + ], + "default_bounding_box": { + "size_x": 1.399999976158142, + "size_y": 2.700000047683716, + "size_z": 1.399999976158142 + } + }, + "ItemDisplayEntity": { + "parent": "DisplayEntity", + "type": "item_display", + "translation_key": "entity.minecraft.item_display", + "fields": [ + { + "name": "item", + "index": 22, + "type": "item_stack", + "default_value": "0 air" + }, + { + "name": "item_display", + "index": 23, + "type": "byte", + "default_value": 0 + } + ], + "default_bounding_box": { + "size_x": 0.0, + "size_y": 0.0, + "size_z": 0.0 + } + }, + "ItemEntity": { + "parent": "Entity", + "type": "item", + "translation_key": "entity.minecraft.item", + "fields": [ + { + "name": "stack", + "index": 8, + "type": "item_stack", + "default_value": "0 air" + } + ], + "default_bounding_box": { + "size_x": 0.25, + "size_y": 0.25, + "size_z": 0.25 + } + }, + "ItemFrameEntity": { + "parent": "AbstractDecorationEntity", + "type": "item_frame", + "translation_key": "entity.minecraft.item_frame", + "fields": [ + { + "name": "item_stack", + "index": 8, + "type": "item_stack", + "default_value": "0 air" + }, + { + "name": "rotation", + "index": 9, + "type": "integer", + "default_value": 0 + } + ], + "default_bounding_box": { + "size_x": 0.0, + "size_y": 0.0, + "size_z": 0.0 + } + }, + "LeashKnotEntity": { + "parent": "AbstractDecorationEntity", + "type": "leash_knot", + "translation_key": "entity.minecraft.leash_knot", + "fields": [], + "default_bounding_box": { + "size_x": 0.375, + "size_y": 0.5, + "size_z": 0.375 + } + }, + "LightningEntity": { + "parent": "Entity", + "type": "lightning_bolt", + "translation_key": "entity.minecraft.lightning_bolt", + "fields": [], + "default_bounding_box": { + "size_x": 0.0, + "size_y": 0.0, + "size_z": 0.0 + } + }, + "LivingEntity": { + "parent": "Entity", + "fields": [ + { + "name": "living_flags", + "index": 8, + "type": "byte", + "default_value": 0 + }, + { + "name": "health", + "index": 9, + "type": "float", + "default_value": 14.0 + }, + { + "name": "potion_swirls_color", + "index": 10, + "type": "integer", + "default_value": 0 + }, + { + "name": "potion_swirls_ambient", + "index": 11, + "type": "boolean", + "default_value": false + }, + { + "name": "stuck_arrow_count", + "index": 12, + "type": "integer", + "default_value": 0 + }, + { + "name": "stinger_count", + "index": 13, + "type": "integer", + "default_value": 0 + }, + { + "name": "sleeping_position", + "index": 14, + "type": "optional_block_pos", + "default_value": null + } + ], + "attributes": [] + }, + "LlamaEntity": { + "parent": "AbstractDonkeyEntity", + "type": "llama", + "translation_key": "entity.minecraft.llama", + "fields": [ + { + "name": "strength", + "index": 19, + "type": "integer", + "default_value": 0 + }, + { + "name": "carpet_color", + "index": 20, + "type": "integer", + "default_value": -1 + }, + { + "name": "variant", + "index": 21, + "type": "integer", + "default_value": 0 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 40.0 + }, + { + "id": 12, + "name": "horse.jump_strength", + "base_value": 0.5 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.17499999701976776 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 53.0 + } + ], + "default_bounding_box": { + "size_x": 0.8999999761581421, + "size_y": 1.8700000047683716, + "size_z": 0.8999999761581421 + } + }, + "LlamaSpitEntity": { + "parent": "ProjectileEntity", + "type": "llama_spit", + "translation_key": "entity.minecraft.llama_spit", + "fields": [], + "default_bounding_box": { + "size_x": 0.25, + "size_y": 0.25, + "size_z": 0.25 + } + }, + "MagmaCubeEntity": { + "parent": "SlimeEntity", + "type": "magma_cube", + "translation_key": "entity.minecraft.magma_cube", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 2.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.20000000298023224 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 20.0 + } + ], + "default_bounding_box": { + "size_x": 2.0399999618530273, + "size_y": 2.0399999618530273, + "size_z": 2.0399999618530273 + } + }, + "MarkerEntity": { + "parent": "Entity", + "type": "marker", + "translation_key": "entity.minecraft.marker", + "fields": [], + "default_bounding_box": { + "size_x": 0.0, + "size_y": 0.0, + "size_z": 0.0 + } + }, + "MerchantEntity": { + "parent": "PassiveEntity", + "fields": [ + { + "name": "head_rolling_time_left", + "index": 17, + "type": "integer", + "default_value": 0 + } + ], + "attributes": [] + }, + "MinecartEntity": { + "parent": "AbstractMinecartEntity", + "type": "minecart", + "translation_key": "entity.minecraft.minecart", + "fields": [], + "default_bounding_box": { + "size_x": 0.9800000190734863, + "size_y": 0.699999988079071, + "size_z": 0.9800000190734863 + } + }, + "MobEntity": { + "parent": "LivingEntity", + "fields": [ + { + "name": "mob_flags", + "index": 15, + "type": "byte", + "default_value": 0 + } + ], + "attributes": [] + }, + "MooshroomEntity": { + "parent": "CowEntity", + "type": "mooshroom", + "translation_key": "entity.minecraft.mooshroom", + "fields": [ + { + "name": "type", + "index": 17, + "type": "string", + "default_value": "red" + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.20000000298023224 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 10.0 + } + ], + "default_bounding_box": { + "size_x": 0.8999999761581421, + "size_y": 1.399999976158142, + "size_z": 0.8999999761581421 + } + }, + "MuleEntity": { + "parent": "AbstractDonkeyEntity", + "type": "mule", + "translation_key": "entity.minecraft.mule", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 12, + "name": "horse.jump_strength", + "base_value": 0.5 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.17499999701976776 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 53.0 + } + ], + "default_bounding_box": { + "size_x": 1.396484375, + "size_y": 1.600000023841858, + "size_z": 1.396484375 + } + }, + "OcelotEntity": { + "parent": "AnimalEntity", + "type": "ocelot", + "translation_key": "entity.minecraft.ocelot", + "fields": [ + { + "name": "trusting", + "index": 17, + "type": "boolean", + "default_value": false + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 3.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.30000001192092896 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 10.0 + } + ], + "default_bounding_box": { + "size_x": 0.6000000238418579, + "size_y": 0.699999988079071, + "size_z": 0.6000000238418579 + } + }, + "PaintingEntity": { + "parent": "AbstractDecorationEntity", + "type": "painting", + "translation_key": "entity.minecraft.painting", + "fields": [ + { + "name": "variant", + "index": 8, + "type": "painting_variant", + "default_value": "kebab" + } + ], + "default_bounding_box": { + "size_x": 0.0, + "size_y": 0.0, + "size_z": 0.0 + } + }, + "PandaEntity": { + "parent": "AnimalEntity", + "type": "panda", + "translation_key": "entity.minecraft.panda", + "fields": [ + { + "name": "ask_for_bamboo_ticks", + "index": 17, + "type": "integer", + "default_value": 0 + }, + { + "name": "sneeze_progress", + "index": 18, + "type": "integer", + "default_value": 0 + }, + { + "name": "eating_ticks", + "index": 19, + "type": "integer", + "default_value": 0 + }, + { + "name": "main_gene", + "index": 20, + "type": "byte", + "default_value": 0 + }, + { + "name": "hidden_gene", + "index": 21, + "type": "byte", + "default_value": 0 + }, + { + "name": "panda_flags", + "index": 22, + "type": "byte", + "default_value": 0 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 6.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.15000000596046448 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 20.0 + } + ], + "default_bounding_box": { + "size_x": 1.2999999523162842, + "size_y": 1.25, + "size_z": 1.2999999523162842 + } + }, + "ParrotEntity": { + "parent": "TameableShoulderEntity", + "type": "parrot", + "translation_key": "entity.minecraft.parrot", + "fields": [ + { + "name": "variant", + "index": 19, + "type": "integer", + "default_value": 0 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 4, + "name": "generic.flying_speed", + "base_value": 0.4000000059604645 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.20000000298023224 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 6.0 + } + ], + "default_bounding_box": { + "size_x": 0.5, + "size_y": 0.8999999761581421, + "size_z": 0.5 + } + }, + "PassiveEntity": { + "parent": "PathAwareEntity", + "fields": [ + { + "name": "child", + "index": 16, + "type": "boolean", + "default_value": false + } + ], + "attributes": [] + }, + "PathAwareEntity": { + "parent": "MobEntity", + "fields": [], + "attributes": [] + }, + "PatrolEntity": { + "parent": "HostileEntity", + "fields": [], + "attributes": [] + }, + "PersistentProjectileEntity": { + "parent": "ProjectileEntity", + "fields": [ + { + "name": "projectile_flags", + "index": 8, + "type": "byte", + "default_value": 0 + }, + { + "name": "pierce_level", + "index": 9, + "type": "byte", + "default_value": 0 + } + ] + }, + "PhantomEntity": { + "parent": "FlyingEntity", + "type": "phantom", + "translation_key": "entity.minecraft.phantom", + "fields": [ + { + "name": "size", + "index": 16, + "type": "integer", + "default_value": 0 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 2.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.699999988079071 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 20.0 + } + ], + "default_bounding_box": { + "size_x": 0.8999999761581421, + "size_y": 0.5, + "size_z": 0.8999999761581421 + } + }, + "PigEntity": { + "parent": "AnimalEntity", + "type": "pig", + "translation_key": "entity.minecraft.pig", + "fields": [ + { + "name": "saddled", + "index": 17, + "type": "boolean", + "default_value": false + }, + { + "name": "boost_time", + "index": 18, + "type": "integer", + "default_value": 0 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.25 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 10.0 + } + ], + "default_bounding_box": { + "size_x": 0.8999999761581421, + "size_y": 0.8999999761581421, + "size_z": 0.8999999761581421 + } + }, + "PiglinBruteEntity": { + "parent": "AbstractPiglinEntity", + "type": "piglin_brute", + "translation_key": "entity.minecraft.piglin_brute", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 7.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.3499999940395355 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 50.0 + } + ], + "default_bounding_box": { + "size_x": 0.6000000238418579, + "size_y": 1.9500000476837158, + "size_z": 0.6000000238418579 + } + }, + "PiglinEntity": { + "parent": "AbstractPiglinEntity", + "type": "piglin", + "translation_key": "entity.minecraft.piglin", + "fields": [ + { + "name": "baby", + "index": 17, + "type": "boolean", + "default_value": false + }, + { + "name": "charging", + "index": 18, + "type": "boolean", + "default_value": false + }, + { + "name": "dancing", + "index": 19, + "type": "boolean", + "default_value": false + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 5.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.3499999940395355 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 16.0 + } + ], + "default_bounding_box": { + "size_x": 0.6000000238418579, + "size_y": 1.9500000476837158, + "size_z": 0.6000000238418579 + } + }, + "PillagerEntity": { + "parent": "IllagerEntity", + "type": "pillager", + "translation_key": "entity.minecraft.pillager", + "fields": [ + { + "name": "charging", + "index": 17, + "type": "boolean", + "default_value": false + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 5.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 32.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.3499999940395355 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 24.0 + } + ], + "default_bounding_box": { + "size_x": 0.6000000238418579, + "size_y": 1.9500000476837158, + "size_z": 0.6000000238418579 + } + }, + "PlayerEntity": { + "parent": "LivingEntity", + "type": "player", + "translation_key": "entity.minecraft.player", + "fields": [ + { + "name": "absorption_amount", + "index": 15, + "type": "float", + "default_value": 0.0 + }, + { + "name": "score", + "index": 16, + "type": "integer", + "default_value": 0 + }, + { + "name": "player_model_parts", + "index": 17, + "type": "byte", + "default_value": 0 + }, + { + "name": "main_arm", + "index": 18, + "type": "byte", + "default_value": 1 + }, + { + "name": "left_shoulder_entity", + "index": 19, + "type": "nbt_compound", + "default_value": "{}" + }, + { + "name": "right_shoulder_entity", + "index": 20, + "type": "nbt_compound", + "default_value": "{}" + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 1.0 + }, + { + "id": 7, + "name": "generic.attack_speed", + "base_value": 4.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.10000000149011612 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 20.0 + }, + { + "id": 10, + "name": "generic.luck", + "base_value": 0.0 + } + ] + }, + "PolarBearEntity": { + "parent": "AnimalEntity", + "type": "polar_bear", + "translation_key": "entity.minecraft.polar_bear", + "fields": [ + { + "name": "warning", + "index": 17, + "type": "boolean", + "default_value": false + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 6.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 20.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.25 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 30.0 + } + ], + "default_bounding_box": { + "size_x": 1.399999976158142, + "size_y": 1.399999976158142, + "size_z": 1.399999976158142 + } + }, + "PotionEntity": { + "parent": "ThrownItemEntity", + "type": "potion", + "translation_key": "entity.minecraft.potion", + "fields": [], + "default_bounding_box": { + "size_x": 0.25, + "size_y": 0.25, + "size_z": 0.25 + } + }, + "ProjectileEntity": { + "parent": "Entity", + "fields": [] + }, + "PufferfishEntity": { + "parent": "FishEntity", + "type": "pufferfish", + "translation_key": "entity.minecraft.pufferfish", + "fields": [ + { + "name": "puff_state", + "index": 17, + "type": "integer", + "default_value": 0 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.699999988079071 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 3.0 + } + ], + "default_bounding_box": { + "size_x": 0.3499999940395355, + "size_y": 0.3499999940395355, + "size_z": 0.3499999940395355 + } + }, + "RabbitEntity": { + "parent": "AnimalEntity", + "type": "rabbit", + "translation_key": "entity.minecraft.rabbit", + "fields": [ + { + "name": "rabbit_type", + "index": 17, + "type": "integer", + "default_value": 0 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.30000001192092896 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 3.0 + } + ], + "default_bounding_box": { + "size_x": 0.4000000059604645, + "size_y": 0.5, + "size_z": 0.4000000059604645 + } + }, + "RaiderEntity": { + "parent": "PatrolEntity", + "fields": [ + { + "name": "celebrating", + "index": 16, + "type": "boolean", + "default_value": false + } + ], + "attributes": [] + }, + "RavagerEntity": { + "parent": "RaiderEntity", + "type": "ravager", + "translation_key": "entity.minecraft.ravager", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 1.5 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.75 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 12.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 32.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.3 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 100.0 + } + ], + "default_bounding_box": { + "size_x": 1.9500000476837158, + "size_y": 2.200000047683716, + "size_z": 1.9500000476837158 + } + }, + "SalmonEntity": { + "parent": "SchoolingFishEntity", + "type": "salmon", + "translation_key": "entity.minecraft.salmon", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.699999988079071 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 3.0 + } + ], + "default_bounding_box": { + "size_x": 0.699999988079071, + "size_y": 0.4000000059604645, + "size_z": 0.699999988079071 + } + }, + "SchoolingFishEntity": { + "parent": "FishEntity", + "fields": [], + "attributes": [] + }, + "SheepEntity": { + "parent": "AnimalEntity", + "type": "sheep", + "translation_key": "entity.minecraft.sheep", + "fields": [ + { + "name": "color", + "index": 17, + "type": "byte", + "default_value": 0 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.23000000417232513 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 8.0 + } + ], + "default_bounding_box": { + "size_x": 0.8999999761581421, + "size_y": 1.2999999523162842, + "size_z": 0.8999999761581421 + } + }, + "ShulkerBulletEntity": { + "parent": "ProjectileEntity", + "type": "shulker_bullet", + "translation_key": "entity.minecraft.shulker_bullet", + "fields": [], + "default_bounding_box": { + "size_x": 0.3125, + "size_y": 0.3125, + "size_z": 0.3125 + } + }, + "ShulkerEntity": { + "parent": "GolemEntity", + "type": "shulker", + "translation_key": "entity.minecraft.shulker", + "fields": [ + { + "name": "attached_face", + "index": 16, + "type": "facing", + "default_value": "down" + }, + { + "name": "peek_amount", + "index": 17, + "type": "byte", + "default_value": 0 + }, + { + "name": "color", + "index": 18, + "type": "byte", + "default_value": 16 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.699999988079071 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 30.0 + } + ], + "default_bounding_box": { + "size_x": 1.0, + "size_y": 1.0, + "size_z": 1.0 + } + }, + "SilverfishEntity": { + "parent": "HostileEntity", + "type": "silverfish", + "translation_key": "entity.minecraft.silverfish", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 1.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.25 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 8.0 + } + ], + "default_bounding_box": { + "size_x": 0.4000000059604645, + "size_y": 0.30000001192092896, + "size_z": 0.4000000059604645 + } + }, + "SkeletonEntity": { + "parent": "AbstractSkeletonEntity", + "type": "skeleton", + "translation_key": "entity.minecraft.skeleton", + "fields": [ + { + "name": "converting", + "index": 16, + "type": "boolean", + "default_value": false + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 2.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.25 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 20.0 + } + ], + "default_bounding_box": { + "size_x": 0.6000000238418579, + "size_y": 1.9900000095367432, + "size_z": 0.6000000238418579 + } + }, + "SkeletonHorseEntity": { + "parent": "AbstractHorseEntity", + "type": "skeleton_horse", + "translation_key": "entity.minecraft.skeleton_horse", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 12, + "name": "horse.jump_strength", + "base_value": 0.7 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.20000000298023224 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 15.0 + } + ], + "default_bounding_box": { + "size_x": 1.396484375, + "size_y": 1.600000023841858, + "size_z": 1.396484375 + } + }, + "SlimeEntity": { + "parent": "MobEntity", + "type": "slime", + "translation_key": "entity.minecraft.slime", + "fields": [ + { + "name": "slime_size", + "index": 16, + "type": "integer", + "default_value": 1 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 2.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.699999988079071 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 20.0 + } + ], + "default_bounding_box": { + "size_x": 2.0399999618530273, + "size_y": 2.0399999618530273, + "size_z": 2.0399999618530273 + } + }, + "SmallFireballEntity": { + "parent": "AbstractFireballEntity", + "type": "small_fireball", + "translation_key": "entity.minecraft.small_fireball", + "fields": [], + "default_bounding_box": { + "size_x": 0.3125, + "size_y": 0.3125, + "size_z": 0.3125 + } + }, + "SnifferEntity": { + "parent": "AnimalEntity", + "type": "sniffer", + "translation_key": "entity.minecraft.sniffer", + "fields": [ + { + "name": "state", + "index": 17, + "type": "sniffer_state", + "default_value": "idling" + }, + { + "name": "finish_dig_time", + "index": 18, + "type": "integer", + "default_value": 0 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.10000000149011612 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 14.0 + } + ], + "default_bounding_box": { + "size_x": 1.899999976158142, + "size_y": 1.75, + "size_z": 1.899999976158142 + } + }, + "SnowGolemEntity": { + "parent": "GolemEntity", + "type": "snow_golem", + "translation_key": "entity.minecraft.snow_golem", + "fields": [ + { + "name": "snow_golem_flags", + "index": 16, + "type": "byte", + "default_value": 16 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.20000000298023224 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 4.0 + } + ], + "default_bounding_box": { + "size_x": 0.699999988079071, + "size_y": 1.899999976158142, + "size_z": 0.699999988079071 + } + }, + "SnowballEntity": { + "parent": "ThrownItemEntity", + "type": "snowball", + "translation_key": "entity.minecraft.snowball", + "fields": [], + "default_bounding_box": { + "size_x": 0.25, + "size_y": 0.25, + "size_z": 0.25 + } + }, + "SpawnerMinecartEntity": { + "parent": "AbstractMinecartEntity", + "type": "spawner_minecart", + "translation_key": "entity.minecraft.spawner_minecart", + "fields": [], + "default_bounding_box": { + "size_x": 0.9800000190734863, + "size_y": 0.699999988079071, + "size_z": 0.9800000190734863 + } + }, + "SpectralArrowEntity": { + "parent": "PersistentProjectileEntity", + "type": "spectral_arrow", + "translation_key": "entity.minecraft.spectral_arrow", + "fields": [], + "default_bounding_box": { + "size_x": 0.5, + "size_y": 0.5, + "size_z": 0.5 + } + }, + "SpellcastingIllagerEntity": { + "parent": "IllagerEntity", + "fields": [ + { + "name": "spell", + "index": 17, + "type": "byte", + "default_value": 0 + } + ], + "attributes": [] + }, + "SpiderEntity": { + "parent": "HostileEntity", + "type": "spider", + "translation_key": "entity.minecraft.spider", + "fields": [ + { + "name": "spider_flags", + "index": 16, + "type": "byte", + "default_value": 0 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 2.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.30000001192092896 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 16.0 + } + ], + "default_bounding_box": { + "size_x": 1.399999976158142, + "size_y": 0.8999999761581421, + "size_z": 1.399999976158142 + } + }, + "SquidEntity": { + "parent": "WaterCreatureEntity", + "type": "squid", + "translation_key": "entity.minecraft.squid", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.699999988079071 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 10.0 + } + ], + "default_bounding_box": { + "size_x": 0.800000011920929, + "size_y": 0.800000011920929, + "size_z": 0.800000011920929 + } + }, + "StorageMinecartEntity": { + "parent": "AbstractMinecartEntity", + "fields": [] + }, + "StrayEntity": { + "parent": "AbstractSkeletonEntity", + "type": "stray", + "translation_key": "entity.minecraft.stray", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 2.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.25 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 20.0 + } + ], + "default_bounding_box": { + "size_x": 0.6000000238418579, + "size_y": 1.9900000095367432, + "size_z": 0.6000000238418579 + } + }, + "StriderEntity": { + "parent": "AnimalEntity", + "type": "strider", + "translation_key": "entity.minecraft.strider", + "fields": [ + { + "name": "boost_time", + "index": 17, + "type": "integer", + "default_value": 0 + }, + { + "name": "cold", + "index": 18, + "type": "boolean", + "default_value": false + }, + { + "name": "saddled", + "index": 19, + "type": "boolean", + "default_value": false + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.17499999701976776 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 20.0 + } + ], + "default_bounding_box": { + "size_x": 0.8999999761581421, + "size_y": 1.7000000476837158, + "size_z": 0.8999999761581421 + } + }, + "TadpoleEntity": { + "parent": "FishEntity", + "type": "tadpole", + "translation_key": "entity.minecraft.tadpole", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 1.0 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 6.0 + } + ], + "default_bounding_box": { + "size_x": 0.4000000059604645, + "size_y": 0.30000001192092896, + "size_z": 0.4000000059604645 + } + }, + "TameableEntity": { + "parent": "AnimalEntity", + "fields": [ + { + "name": "tameable_flags", + "index": 17, + "type": "byte", + "default_value": 0 + }, + { + "name": "owner_uuid", + "index": 18, + "type": "optional_uuid", + "default_value": null + } + ], + "attributes": [] + }, + "TameableShoulderEntity": { + "parent": "TameableEntity", + "fields": [], + "attributes": [] + }, + "TextDisplayEntity": { + "parent": "DisplayEntity", + "type": "text_display", + "translation_key": "entity.minecraft.text_display", + "fields": [ + { + "name": "text", + "index": 22, + "type": "text_component", + "default_value": "" + }, + { + "name": "line_width", + "index": 23, + "type": "integer", + "default_value": 200 + }, + { + "name": "background", + "index": 24, + "type": "integer", + "default_value": 1073741824 + }, + { + "name": "text_opacity", + "index": 25, + "type": "byte", + "default_value": -1 + }, + { + "name": "text_display_flags", + "index": 26, + "type": "byte", + "default_value": 0 + } + ], + "default_bounding_box": { + "size_x": 0.0, + "size_y": 0.0, + "size_z": 0.0 + } + }, + "ThrownEntity": { + "parent": "ProjectileEntity", + "fields": [] + }, + "ThrownItemEntity": { + "parent": "ThrownEntity", + "fields": [ + { + "name": "item", + "index": 8, + "type": "item_stack", + "default_value": "0 air" + } + ] + }, + "TntEntity": { + "parent": "Entity", + "type": "tnt", + "translation_key": "entity.minecraft.tnt", + "fields": [ + { + "name": "fuse", + "index": 8, + "type": "integer", + "default_value": 80 + } + ], + "default_bounding_box": { + "size_x": 0.9800000190734863, + "size_y": 0.9800000190734863, + "size_z": 0.9800000190734863 + } + }, + "TntMinecartEntity": { + "parent": "AbstractMinecartEntity", + "type": "tnt_minecart", + "translation_key": "entity.minecraft.tnt_minecart", + "fields": [], + "default_bounding_box": { + "size_x": 0.9800000190734863, + "size_y": 0.699999988079071, + "size_z": 0.9800000190734863 + } + }, + "TraderLlamaEntity": { + "parent": "LlamaEntity", + "type": "trader_llama", + "translation_key": "entity.minecraft.trader_llama", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 40.0 + }, + { + "id": 12, + "name": "horse.jump_strength", + "base_value": 0.5 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.17499999701976776 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 53.0 + } + ], + "default_bounding_box": { + "size_x": 0.8999999761581421, + "size_y": 1.8700000047683716, + "size_z": 0.8999999761581421 + } + }, + "TridentEntity": { + "parent": "PersistentProjectileEntity", + "type": "trident", + "translation_key": "entity.minecraft.trident", + "fields": [ + { + "name": "loyalty", + "index": 10, + "type": "byte", + "default_value": 0 + }, + { + "name": "enchanted", + "index": 11, + "type": "boolean", + "default_value": false + } + ], + "default_bounding_box": { + "size_x": 0.5, + "size_y": 0.5, + "size_z": 0.5 + } + }, + "TropicalFishEntity": { + "parent": "SchoolingFishEntity", + "type": "tropical_fish", + "translation_key": "entity.minecraft.tropical_fish", + "fields": [ + { + "name": "variant", + "index": 17, + "type": "integer", + "default_value": 0 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.699999988079071 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 3.0 + } + ], + "default_bounding_box": { + "size_x": 0.5, + "size_y": 0.4000000059604645, + "size_z": 0.5 + } + }, + "TurtleEntity": { + "parent": "AnimalEntity", + "type": "turtle", + "translation_key": "entity.minecraft.turtle", + "fields": [ + { + "name": "home_pos", + "index": 17, + "type": "block_pos", + "default_value": { + "x": 0, + "y": 0, + "z": 0 + } + }, + { + "name": "has_egg", + "index": 18, + "type": "boolean", + "default_value": false + }, + { + "name": "digging_sand", + "index": 19, + "type": "boolean", + "default_value": false + }, + { + "name": "travel_pos", + "index": 20, + "type": "block_pos", + "default_value": { + "x": 0, + "y": 0, + "z": 0 + } + }, + { + "name": "land_bound", + "index": 21, + "type": "boolean", + "default_value": false + }, + { + "name": "actively_traveling", + "index": 22, + "type": "boolean", + "default_value": false + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.25 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 30.0 + } + ], + "default_bounding_box": { + "size_x": 1.2000000476837158, + "size_y": 0.4000000059604645, + "size_z": 1.2000000476837158 + } + }, + "VexEntity": { + "parent": "HostileEntity", + "type": "vex", + "translation_key": "entity.minecraft.vex", + "fields": [ + { + "name": "vex_flags", + "index": 16, + "type": "byte", + "default_value": 0 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 4.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.699999988079071 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 14.0 + } + ], + "default_bounding_box": { + "size_x": 0.4000000059604645, + "size_y": 0.800000011920929, + "size_z": 0.4000000059604645 + } + }, + "VillagerEntity": { + "parent": "MerchantEntity", + "type": "villager", + "translation_key": "entity.minecraft.villager", + "fields": [ + { + "name": "villager_data", + "index": 18, + "type": "villager_data", + "default_value": { + "type": "plains", + "profession": "none", + "level": 1 + } + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 48.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.5 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 20.0 + } + ], + "default_bounding_box": { + "size_x": 0.6000000238418579, + "size_y": 1.9500000476837158, + "size_z": 0.6000000238418579 + } + }, + "VindicatorEntity": { + "parent": "IllagerEntity", + "type": "vindicator", + "translation_key": "entity.minecraft.vindicator", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 5.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 12.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.3499999940395355 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 24.0 + } + ], + "default_bounding_box": { + "size_x": 0.6000000238418579, + "size_y": 1.9500000476837158, + "size_z": 0.6000000238418579 + } + }, + "WanderingTraderEntity": { + "parent": "MerchantEntity", + "type": "wandering_trader", + "translation_key": "entity.minecraft.wandering_trader", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.699999988079071 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 20.0 + } + ], + "default_bounding_box": { + "size_x": 0.6000000238418579, + "size_y": 1.9500000476837158, + "size_z": 0.6000000238418579 + } + }, + "WardenEntity": { + "parent": "HostileEntity", + "type": "warden", + "translation_key": "entity.minecraft.warden", + "fields": [ + { + "name": "anger", + "index": 16, + "type": "integer", + "default_value": 0 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 1.5 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 1.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 30.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.30000001192092896 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 500.0 + } + ], + "default_bounding_box": { + "size_x": 0.8999999761581421, + "size_y": 2.9000000953674316, + "size_z": 0.8999999761581421 + } + }, + "WaterCreatureEntity": { + "parent": "PathAwareEntity", + "fields": [], + "attributes": [] + }, + "WitchEntity": { + "parent": "RaiderEntity", + "type": "witch", + "translation_key": "entity.minecraft.witch", + "fields": [ + { + "name": "drinking", + "index": 17, + "type": "boolean", + "default_value": false + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 2.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.25 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 26.0 + } + ], + "default_bounding_box": { + "size_x": 0.6000000238418579, + "size_y": 1.9500000476837158, + "size_z": 0.6000000238418579 + } + }, + "WitherEntity": { + "parent": "HostileEntity", + "type": "wither", + "translation_key": "entity.minecraft.wither", + "fields": [ + { + "name": "tracked_entity_id_1", + "index": 16, + "type": "integer", + "default_value": 0 + }, + { + "name": "tracked_entity_id_2", + "index": 17, + "type": "integer", + "default_value": 0 + }, + { + "name": "tracked_entity_id_3", + "index": 18, + "type": "integer", + "default_value": 0 + }, + { + "name": "invul_timer", + "index": 19, + "type": "integer", + "default_value": 0 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 4, + "name": "generic.flying_speed", + "base_value": 0.6000000238418579 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 4.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 2.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 40.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.6000000238418579 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 300.0 + } + ], + "default_bounding_box": { + "size_x": 0.8999999761581421, + "size_y": 3.5, + "size_z": 0.8999999761581421 + } + }, + "WitherSkeletonEntity": { + "parent": "AbstractSkeletonEntity", + "type": "wither_skeleton", + "translation_key": "entity.minecraft.wither_skeleton", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 2.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.25 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 20.0 + } + ], + "default_bounding_box": { + "size_x": 0.699999988079071, + "size_y": 2.4000000953674316, + "size_z": 0.699999988079071 + } + }, + "WitherSkullEntity": { + "parent": "ExplosiveProjectileEntity", + "type": "wither_skull", + "translation_key": "entity.minecraft.wither_skull", + "fields": [ + { + "name": "charged", + "index": 8, + "type": "boolean", + "default_value": false + } + ], + "default_bounding_box": { + "size_x": 0.3125, + "size_y": 0.3125, + "size_z": 0.3125 + } + }, + "WolfEntity": { + "parent": "TameableEntity", + "type": "wolf", + "translation_key": "entity.minecraft.wolf", + "fields": [ + { + "name": "begging", + "index": 19, + "type": "boolean", + "default_value": false + }, + { + "name": "collar_color", + "index": 20, + "type": "integer", + "default_value": 14 + }, + { + "name": "anger_time", + "index": 21, + "type": "integer", + "default_value": 0 + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 2.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.30000001192092896 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 8.0 + } + ], + "default_bounding_box": { + "size_x": 0.6000000238418579, + "size_y": 0.8500000238418579, + "size_z": 0.6000000238418579 + } + }, + "ZoglinEntity": { + "parent": "HostileEntity", + "type": "zoglin", + "translation_key": "entity.minecraft.zoglin", + "fields": [ + { + "name": "baby", + "index": 16, + "type": "boolean", + "default_value": false + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 1.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.6000000238418579 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 6.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.30000001192092896 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 40.0 + } + ], + "default_bounding_box": { + "size_x": 1.396484375, + "size_y": 1.399999976158142, + "size_z": 1.396484375 + } + }, + "ZombieEntity": { + "parent": "HostileEntity", + "type": "zombie", + "translation_key": "entity.minecraft.zombie", + "fields": [ + { + "name": "baby", + "index": 16, + "type": "boolean", + "default_value": false + }, + { + "name": "zombie_type", + "index": 17, + "type": "integer", + "default_value": 0 + }, + { + "name": "converting_in_water", + "index": 18, + "type": "boolean", + "default_value": false + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 11, + "name": "zombie.spawn_reinforcements", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 2.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 3.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 35.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.23000000417232513 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 20.0 + } + ], + "default_bounding_box": { + "size_x": 0.6000000238418579, + "size_y": 1.9500000476837158, + "size_z": 0.6000000238418579 + } + }, + "ZombieHorseEntity": { + "parent": "AbstractHorseEntity", + "type": "zombie_horse", + "translation_key": "entity.minecraft.zombie_horse", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 0.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 16.0 + }, + { + "id": 12, + "name": "horse.jump_strength", + "base_value": 0.7 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.20000000298023224 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 15.0 + } + ], + "default_bounding_box": { + "size_x": 1.396484375, + "size_y": 1.600000023841858, + "size_z": 1.396484375 + } + }, + "ZombieVillagerEntity": { + "parent": "ZombieEntity", + "type": "zombie_villager", + "translation_key": "entity.minecraft.zombie_villager", + "fields": [ + { + "name": "converting", + "index": 19, + "type": "boolean", + "default_value": false + }, + { + "name": "villager_data", + "index": 20, + "type": "villager_data", + "default_value": { + "type": "plains", + "profession": "none", + "level": 1 + } + } + ], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 11, + "name": "zombie.spawn_reinforcements", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 2.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 3.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 35.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.23000000417232513 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 20.0 + } + ], + "default_bounding_box": { + "size_x": 0.6000000238418579, + "size_y": 1.9500000476837158, + "size_z": 0.6000000238418579 + } + }, + "ZombifiedPiglinEntity": { + "parent": "ZombieEntity", + "type": "zombified_piglin", + "translation_key": "entity.minecraft.zombified_piglin", + "fields": [], + "attributes": [ + { + "id": 9, + "name": "generic.armor_toughness", + "base_value": 0.0 + }, + { + "id": 6, + "name": "generic.attack_knockback", + "base_value": 0.0 + }, + { + "id": 2, + "name": "generic.knockback_resistance", + "base_value": 0.0 + }, + { + "id": 11, + "name": "zombie.spawn_reinforcements", + "base_value": 0.0 + }, + { + "id": 8, + "name": "generic.armor", + "base_value": 2.0 + }, + { + "id": 5, + "name": "generic.attack_damage", + "base_value": 5.0 + }, + { + "id": 1, + "name": "generic.follow_range", + "base_value": 35.0 + }, + { + "id": 3, + "name": "generic.movement_speed", + "base_value": 0.23000000417232513 + }, + { + "id": 0, + "name": "generic.max_health", + "base_value": 20.0 + } + ], + "default_bounding_box": { + "size_x": 0.6000000238418579, + "size_y": 1.9500000476837158, + "size_z": 0.6000000238418579 + } + } +} \ No newline at end of file diff --git a/vendor/valence/crates/valence_entity/extracted/misc.json b/vendor/valence/crates/valence_entity/extracted/misc.json new file mode 100644 index 00000000..2ed38ea6 --- /dev/null +++ b/vendor/valence/crates/valence_entity/extracted/misc.json @@ -0,0 +1,551 @@ +{ + "entity_type": { + "allay": 0, + "area_effect_cloud": 1, + "armor_stand": 2, + "arrow": 3, + "axolotl": 4, + "bat": 5, + "bee": 6, + "blaze": 7, + "block_display": 8, + "boat": 9, + "camel": 10, + "cat": 11, + "cave_spider": 12, + "chest_boat": 13, + "chest_minecart": 14, + "chicken": 15, + "cod": 16, + "command_block_minecart": 17, + "cow": 18, + "creeper": 19, + "dolphin": 20, + "donkey": 21, + "dragon_fireball": 22, + "drowned": 23, + "egg": 24, + "elder_guardian": 25, + "end_crystal": 26, + "ender_dragon": 27, + "ender_pearl": 28, + "enderman": 29, + "endermite": 30, + "evoker": 31, + "evoker_fangs": 32, + "experience_bottle": 33, + "experience_orb": 34, + "eye_of_ender": 35, + "falling_block": 36, + "firework_rocket": 37, + "fox": 38, + "frog": 39, + "furnace_minecart": 40, + "ghast": 41, + "giant": 42, + "glow_item_frame": 43, + "glow_squid": 44, + "goat": 45, + "guardian": 46, + "hoglin": 47, + "hopper_minecart": 48, + "horse": 49, + "husk": 50, + "illusioner": 51, + "interaction": 52, + "iron_golem": 53, + "item": 54, + "item_display": 55, + "item_frame": 56, + "fireball": 57, + "leash_knot": 58, + "lightning_bolt": 59, + "llama": 60, + "llama_spit": 61, + "magma_cube": 62, + "marker": 63, + "minecart": 64, + "mooshroom": 65, + "mule": 66, + "ocelot": 67, + "painting": 68, + "panda": 69, + "parrot": 70, + "phantom": 71, + "pig": 72, + "piglin": 73, + "piglin_brute": 74, + "pillager": 75, + "polar_bear": 76, + "potion": 77, + "pufferfish": 78, + "rabbit": 79, + "ravager": 80, + "salmon": 81, + "sheep": 82, + "shulker": 83, + "shulker_bullet": 84, + "silverfish": 85, + "skeleton": 86, + "skeleton_horse": 87, + "slime": 88, + "small_fireball": 89, + "sniffer": 90, + "snow_golem": 91, + "snowball": 92, + "spawner_minecart": 93, + "spectral_arrow": 94, + "spider": 95, + "squid": 96, + "stray": 97, + "strider": 98, + "tadpole": 99, + "text_display": 100, + "tnt": 101, + "tnt_minecart": 102, + "trader_llama": 103, + "trident": 104, + "tropical_fish": 105, + "turtle": 106, + "vex": 107, + "villager": 108, + "vindicator": 109, + "wandering_trader": 110, + "warden": 111, + "witch": 112, + "wither": 113, + "wither_skeleton": 114, + "wither_skull": 115, + "wolf": 116, + "zoglin": 117, + "zombie": 118, + "zombie_horse": 119, + "zombie_villager": 120, + "zombified_piglin": 121, + "player": 122, + "fishing_bobber": 123 + }, + "entity_status": { + "add_sprinting_particles_or_reset_spawner_minecart_spawn_delay": 1, + "play_death_sound_or_add_projectile_hit_particles": 3, + "play_attack_sound": 4, + "stop_attack": 5, + "add_negative_player_reaction_particles": 6, + "add_positive_player_reaction_particles": 7, + "shake_off_water": 8, + "consume_item": 9, + "set_sheep_eat_grass_timer_or_prime_tnt_minecart": 10, + "look_at_villager": 11, + "add_villager_heart_particles": 12, + "add_villager_angry_particles": 13, + "add_villager_happy_particles": 14, + "add_witch_particles": 15, + "play_cure_zombie_villager_sound": 16, + "explode_firework_client": 17, + "add_breeding_particles": 18, + "reset_squid_thrust_timer": 19, + "play_spawn_effects": 20, + "play_guardian_attack_sound": 21, + "use_reduced_debug_info": 22, + "use_full_debug_info": 23, + "set_op_level_0": 24, + "set_op_level_1": 25, + "set_op_level_2": 26, + "set_op_level_3": 27, + "set_op_level_4": 28, + "block_with_shield": 29, + "break_shield": 30, + "pull_hooked_entity": 31, + "hit_armor_stand": 32, + "stop_looking_at_villager": 34, + "use_totem_of_undying": 35, + "add_dolphin_happy_villager_particles": 38, + "stun_ravager": 39, + "tame_ocelot_failed": 40, + "tame_ocelot_success": 41, + "add_splash_particles": 42, + "add_cloud_particles": 43, + "create_eating_particles": 45, + "add_portal_particles": 46, + "break_mainhand": 47, + "break_offhand": 48, + "break_head": 49, + "break_chest": 50, + "break_legs": 51, + "break_feet": 52, + "drip_honey": 53, + "drip_rich_honey": 54, + "swap_hands": 55, + "reset_wolf_shake": 56, + "prepare_ram": 58, + "finish_ram": 59, + "add_death_particles": 60, + "ears_twitch": 61, + "sonic_boom": 62, + "start_digging": 63 + }, + "entity_animation": { + "swing_main_hand": 0, + "wake_up": 2, + "swing_off_hand": 3, + "crit": 4, + "enchanted_hit": 5 + }, + "villager_type": { + "desert": 0, + "jungle": 1, + "plains": 2, + "savanna": 3, + "snow": 4, + "swamp": 5, + "taiga": 6 + }, + "villager_profession": { + "none": 0, + "armorer": 1, + "butcher": 2, + "cartographer": 3, + "cleric": 4, + "farmer": 5, + "fisherman": 6, + "fletcher": 7, + "leatherworker": 8, + "librarian": 9, + "mason": 10, + "nitwit": 11, + "shepherd": 12, + "toolsmith": 13, + "weaponsmith": 14 + }, + "cat_variant": { + "tabby": 0, + "black": 1, + "red": 2, + "siamese": 3, + "british_shorthair": 4, + "calico": 5, + "persian": 6, + "ragdoll": 7, + "white": 8, + "jellie": 9, + "all_black": 10 + }, + "frog_variant": { + "temperate": 0, + "warm": 1, + "cold": 2 + }, + "painting_variant": { + "kebab": { + "id": 0, + "width": 16, + "height": 16 + }, + "aztec": { + "id": 1, + "width": 16, + "height": 16 + }, + "alban": { + "id": 2, + "width": 16, + "height": 16 + }, + "aztec2": { + "id": 3, + "width": 16, + "height": 16 + }, + "bomb": { + "id": 4, + "width": 16, + "height": 16 + }, + "plant": { + "id": 5, + "width": 16, + "height": 16 + }, + "wasteland": { + "id": 6, + "width": 16, + "height": 16 + }, + "pool": { + "id": 7, + "width": 32, + "height": 16 + }, + "courbet": { + "id": 8, + "width": 32, + "height": 16 + }, + "sea": { + "id": 9, + "width": 32, + "height": 16 + }, + "sunset": { + "id": 10, + "width": 32, + "height": 16 + }, + "creebet": { + "id": 11, + "width": 32, + "height": 16 + }, + "wanderer": { + "id": 12, + "width": 16, + "height": 32 + }, + "graham": { + "id": 13, + "width": 16, + "height": 32 + }, + "match": { + "id": 14, + "width": 32, + "height": 32 + }, + "bust": { + "id": 15, + "width": 32, + "height": 32 + }, + "stage": { + "id": 16, + "width": 32, + "height": 32 + }, + "void": { + "id": 17, + "width": 32, + "height": 32 + }, + "skull_and_roses": { + "id": 18, + "width": 32, + "height": 32 + }, + "wither": { + "id": 19, + "width": 32, + "height": 32 + }, + "fighters": { + "id": 20, + "width": 64, + "height": 32 + }, + "pointer": { + "id": 21, + "width": 64, + "height": 64 + }, + "pigscene": { + "id": 22, + "width": 64, + "height": 64 + }, + "burning_skull": { + "id": 23, + "width": 64, + "height": 64 + }, + "skeleton": { + "id": 24, + "width": 64, + "height": 48 + }, + "earth": { + "id": 25, + "width": 32, + "height": 32 + }, + "wind": { + "id": 26, + "width": 32, + "height": 32 + }, + "water": { + "id": 27, + "width": 32, + "height": 32 + }, + "fire": { + "id": 28, + "width": 32, + "height": 32 + }, + "donkey_kong": { + "id": 29, + "width": 64, + "height": 48 + } + }, + "direction": { + "down": 0, + "up": 1, + "north": 2, + "south": 3, + "west": 4, + "east": 5 + }, + "entity_pose": { + "standing": 0, + "fall_flying": 1, + "sleeping": 2, + "swimming": 3, + "spin_attack": 4, + "crouching": 5, + "long_jumping": 6, + "dying": 7, + "croaking": 8, + "using_tongue": 9, + "sitting": 10, + "roaring": 11, + "sniffing": 12, + "emerging": 13, + "digging": 14 + }, + "particle_type": { + "ambient_entity_effect": 0, + "angry_villager": 1, + "block": 2, + "block_marker": 3, + "bubble": 4, + "cloud": 5, + "crit": 6, + "damage_indicator": 7, + "dragon_breath": 8, + "dripping_lava": 9, + "falling_lava": 10, + "landing_lava": 11, + "dripping_water": 12, + "falling_water": 13, + "dust": 14, + "dust_color_transition": 15, + "effect": 16, + "elder_guardian": 17, + "enchanted_hit": 18, + "enchant": 19, + "end_rod": 20, + "entity_effect": 21, + "explosion_emitter": 22, + "explosion": 23, + "sonic_boom": 24, + "falling_dust": 25, + "firework": 26, + "fishing": 27, + "flame": 28, + "cherry_leaves": 29, + "sculk_soul": 30, + "sculk_charge": 31, + "sculk_charge_pop": 32, + "soul_fire_flame": 33, + "soul": 34, + "flash": 35, + "happy_villager": 36, + "composter": 37, + "heart": 38, + "instant_effect": 39, + "item": 40, + "vibration": 41, + "item_slime": 42, + "item_snowball": 43, + "large_smoke": 44, + "lava": 45, + "mycelium": 46, + "note": 47, + "poof": 48, + "portal": 49, + "rain": 50, + "smoke": 51, + "sneeze": 52, + "spit": 53, + "squid_ink": 54, + "sweep_attack": 55, + "totem_of_undying": 56, + "underwater": 57, + "splash": 58, + "witch": 59, + "bubble_pop": 60, + "current_down": 61, + "bubble_column_up": 62, + "nautilus": 63, + "dolphin": 64, + "campfire_cosy_smoke": 65, + "campfire_signal_smoke": 66, + "dripping_honey": 67, + "falling_honey": 68, + "landing_honey": 69, + "falling_nectar": 70, + "falling_spore_blossom": 71, + "ash": 72, + "crimson_spore": 73, + "warped_spore": 74, + "spore_blossom_air": 75, + "dripping_obsidian_tear": 76, + "falling_obsidian_tear": 77, + "landing_obsidian_tear": 78, + "reverse_portal": 79, + "white_ash": 80, + "small_flame": 81, + "snowflake": 82, + "dripping_dripstone_lava": 83, + "falling_dripstone_lava": 84, + "dripping_dripstone_water": 85, + "falling_dripstone_water": 86, + "glow_squid_ink": 87, + "glow": 88, + "wax_on": 89, + "wax_off": 90, + "electric_spark": 91, + "scrape": 92, + "shriek": 93, + "egg_crack": 94 + }, + "sniffer_state": { + "idling": 0, + "feeling_happy": 1, + "scenting": 2, + "sniffing": 3, + "searching": 4, + "digging": 5, + "rising": 6 + }, + "tracked_data_handler": { + "byte": 0, + "integer": 1, + "long": 2, + "float": 3, + "string": 4, + "text_component": 5, + "optional_text_component": 6, + "item_stack": 7, + "block_state": 14, + "optional_block_state": 15, + "boolean": 8, + "particle": 17, + "rotation": 9, + "block_pos": 10, + "optional_block_pos": 11, + "facing": 12, + "optional_uuid": 13, + "optional_global_pos": 23, + "nbt_compound": 16, + "villager_data": 18, + "optional_int": 19, + "entity_pose": 20, + "cat_variant": 21, + "frog_variant": 22, + "painting_variant": 24, + "sniffer_state": 25, + "vector3f": 26, + "quaternionf": 27 + } +} \ No newline at end of file diff --git a/vendor/valence/crates/valence_entity/src/active_status_effects.rs b/vendor/valence/crates/valence_entity/src/active_status_effects.rs new file mode 100644 index 00000000..2bb5507f --- /dev/null +++ b/vendor/valence/crates/valence_entity/src/active_status_effects.rs @@ -0,0 +1,525 @@ +use bevy_ecs::prelude::*; +use indexmap::IndexMap; +use valence_protocol::status_effects::StatusEffect; + +/// Represents a change in the [`ActiveStatusEffects`] of an [`Entity`]. +#[derive(Debug)] +enum StatusEffectChange { + Apply(ActiveStatusEffect), + Replace(ActiveStatusEffect), + Remove(StatusEffect), + RemoveAll, + /// **For internal use only.** + #[doc(hidden)] + Expire(StatusEffect), +} + +/// The result of a duration calculation for a status effect. +pub enum DurationResult { + /// There are no effects of the given type. + NoEffects, + /// The effect has an infinite duration. + Infinite, + /// The effect has a finite duration, represented as an integer number of + /// ticks. + Finite(i32), +} + +/// [`Component`] that stores the [`ActiveStatusEffect`]s of an [`Entity`]. +#[derive(Component, Default, Debug)] +pub struct ActiveStatusEffects { + /// vec is always sorted in descending order of amplifier and ascending + /// order of duration. + current_effects: IndexMap>, + changes: Vec, +} + +// public API +impl ActiveStatusEffects { + /// Applies a new [`ActiveStatusEffect`]. + /// + /// If the [`ActiveStatusEffect`] is already active: + /// 1. if the new effect is the same as the old one and its duration is + /// longer, it replaces the old effect. Otherwise, it does nothing. + /// 2. if the new effect is stronger than the old one: + /// a. if the new effect's duration is longer, it replaces the old effect. + /// b. if the new effect's duration is shorter, it overrides the old + /// 3. if the new effect is weaker than the old one and if the new effect's + /// duration is longer, it will be overridden by the old effect until the + /// old effect's duration is over. + pub fn apply(&mut self, effect: ActiveStatusEffect) { + self.changes.push(StatusEffectChange::Apply(effect)); + } + + /// Replace an existing [`ActiveStatusEffect`]. + pub fn replace(&mut self, effect: ActiveStatusEffect) { + self.changes.push(StatusEffectChange::Replace(effect)); + } + + /// Removes an [`ActiveStatusEffect`]. + pub fn remove(&mut self, effect: StatusEffect) { + self.changes.push(StatusEffectChange::Remove(effect)); + } + + /// Removes all [`ActiveStatusEffect`]s. + pub fn remove_all(&mut self) { + self.changes.push(StatusEffectChange::RemoveAll); + } + + /// Returns true if there are no effects of the given type. + pub fn no_effect(&self, effect: StatusEffect) -> bool { + self.current_effects + .get(&effect) + .is_none_or(|effects| effects.is_empty()) + } + + /// Returns true if there is an effect of the given type. + pub fn has_effect(&self, effect: StatusEffect) -> bool { + self.current_effects + .get(&effect) + .is_some_and(|effects| !effects.is_empty()) + } + + /// Returns true if there are no effects. + pub fn no_effects(&self) -> bool { + self.current_effects.is_empty() + } + + /// Returns true if there are any effects. + pub fn has_effects(&self) -> bool { + !self.current_effects.is_empty() + } + + /// Returns the maximum duration of the given effect. + pub fn max_duration(&self, effect: StatusEffect) -> DurationResult { + let effects = self.current_effects.get(&effect); + + match effects { + None => DurationResult::NoEffects, + Some(effects) => { + if let Some(effect) = effects.last() { + match effect.remaining_duration() { + None => DurationResult::Infinite, + Some(duration) => DurationResult::Finite(duration), + } + } else { + DurationResult::NoEffects + } + } + } + } + + /// Gets the current effect of the given type. + pub fn get_current_effect(&self, effect: StatusEffect) -> Option<&ActiveStatusEffect> { + self.current_effects + .get(&effect) + .and_then(|effects| effects.first()) + } + + /// Gets all the effects of the given type. + pub fn get_all_effect(&self, effect: StatusEffect) -> Option<&Vec> { + self.current_effects.get(&effect) + } + + /// Gets all the current effects. + pub fn get_current_effects(&self) -> Vec<&ActiveStatusEffect> { + self.current_effects + .values() + .filter_map(|effects| effects.first()) + .collect() + } + + /// Gets all the effects. + pub fn get_all_effects(&self) -> &IndexMap> { + &self.current_effects + } +} + +// internal methods +impl ActiveStatusEffects { + /// Applies an effect. + /// + /// The vec must always be sorted in descending order of amplifier and + /// ascending order of duration. + /// + /// Returns true if the effect was applied. + fn apply_effect(&mut self, effect: ActiveStatusEffect) -> bool { + let effects = self + .current_effects + .entry(effect.status_effect()) + .or_default(); + + let duration = effect.remaining_duration(); + let amplifier = effect.amplifier(); + + if let Some(index) = effects.iter().position(|e| e.amplifier() <= amplifier) { + // Found an effect with the same or a lower amplifier. + + let active_status_effect = &effects[index]; + + if active_status_effect.remaining_duration() < duration + || active_status_effect.amplifier() < amplifier + { + // if its duration is shorter or its amplifier is lower, override it. + effects[index] = effect; + + // Remove effects after the current one that have a lower + // duration. + let mut remaining_effects = effects.split_off(index + 1); + remaining_effects.retain(|e| e.remaining_duration() >= duration); + effects.append(&mut remaining_effects); + true + } else if active_status_effect.remaining_duration() > duration + && active_status_effect.amplifier() < amplifier + { + // if its duration is longer and its amplifier is lower, insert + // the new effect before it. + effects.insert(index, effect); + true + } else { + // if its duration is longer and its amplifier is higher, do + // nothing. + false + } + } else { + // Found no effect with an equal or lower amplifier. + // This means all effects have a higher amplifier or the vec is + // empty. + + if let Some(last) = effects.last() { + // There is at least one effect with a higher amplifier. + if last.remaining_duration() < effect.remaining_duration() { + // if its duration is shorter, we can insert it at the end. + effects.push(effect); + true + } else { + // if its duration is longer, do nothing. + false + } + } else { + // The vec is empty. + effects.push(effect); + true + } + } + } + + /// Replaces an effect. + fn replace_effect(&mut self, effect: ActiveStatusEffect) { + self.current_effects + .insert(effect.status_effect(), vec![effect]); + } + + /// Removes an effect. + fn remove_effect(&mut self, effect: StatusEffect) { + self.current_effects.swap_remove(&effect); + } + + /// Removes all effects. + fn remove_all_effects(&mut self) { + self.current_effects.clear(); + } + + /// Removes the strongest effect of the given type, i.e., the first effect + fn remove_strongest_effect(&mut self, effect: StatusEffect) { + if let Some(effects) = self.current_effects.get_mut(&effect) { + effects.remove(0); + } + } + + /// **For internal use only.** + /// + /// Increments the active tick of all effects by a tick. + #[doc(hidden)] + pub fn increment_active_ticks(&mut self) { + for effects in self.current_effects.values_mut() { + for effect in effects.iter_mut() { + effect.increment_active_ticks(); + + if effect.expired() { + self.changes + .push(StatusEffectChange::Expire(effect.status_effect())); + } + } + } + } + + /// **For internal use only.** + /// + /// Applies all the changes. + /// + /// Returns a [`IndexMap`] of [`StatusEffect`]s that were updated or removed + /// and their previous values. + #[doc(hidden)] + pub fn apply_changes(&mut self) -> IndexMap> { + let current = self.current_effects.clone(); + let find_current = |effect: StatusEffect| { + current + .iter() + .find(|e| *e.0 == effect) + .map(|e| e.1.first().cloned())? + }; + let mut updated_effects = IndexMap::new(); + + for change in std::mem::take(&mut self.changes) { + match change { + StatusEffectChange::Apply(effect) => { + let value = effect.status_effect(); + if self.apply_effect(effect) { + updated_effects + .entry(value) + .or_insert_with(|| find_current(value)); + } + } + StatusEffectChange::Replace(effect) => { + let value = effect.status_effect(); + updated_effects + .entry(value) + .or_insert_with(|| find_current(value)); + self.replace_effect(effect); + } + StatusEffectChange::Remove(effect) => { + self.remove_effect(effect); + updated_effects.insert(effect, find_current(effect)); + } + StatusEffectChange::RemoveAll => { + self.remove_all_effects(); + for (status, effects) in current.iter() { + if let Some(effect) = effects.first() { + updated_effects.insert(*status, Some(effect.clone())); + } + } + } + StatusEffectChange::Expire(effect) => { + self.remove_strongest_effect(effect); + updated_effects.insert(effect, find_current(effect)); + } + } + } + + updated_effects + } +} + +/// Represents an active status effect. +#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] +pub struct ActiveStatusEffect { + effect: StatusEffect, + /// # Default Value + /// 0 + amplifier: u8, + /// The initial duration of the effect in ticks. + /// If `None`, the effect is infinite. + /// + /// # Default Value + /// Some(600) (30 seconds) + initial_duration: Option, + /// The amount of ticks the effect has been active. + /// + /// # Default Value + /// 0 + active_ticks: i32, + /// # Default Value + /// false + ambient: bool, + /// # Default Value + /// true + show_particles: bool, + /// # Default Value + /// true + show_icon: bool, +} + +impl ActiveStatusEffect { + /// Creates a new [`ActiveStatusEffect`]. + pub fn from_effect(effect: StatusEffect) -> Self { + Self { + effect, + amplifier: 0, + initial_duration: Some(600), + active_ticks: 0, + ambient: false, + show_particles: true, + show_icon: true, + } + } + + /// Sets the amplifier of the [`ActiveStatusEffect`]. + pub fn with_amplifier(mut self, amplifier: u8) -> Self { + self.amplifier = amplifier; + self + } + + /// Sets the duration of the [`ActiveStatusEffect`] in ticks. + pub fn with_duration(mut self, duration: i32) -> Self { + self.initial_duration = Some(duration); + self + } + + /// Sets the duration of the [`ActiveStatusEffect`] in seconds. + pub fn with_duration_seconds(mut self, duration: f32) -> Self { + self.initial_duration = Some((duration * 20.0).round() as i32); + self + } + + /// Sets the duration of the [`ActiveStatusEffect`] to infinite. + pub fn with_infinite(mut self) -> Self { + self.initial_duration = None; + self + } + + /// Sets whether the [`ActiveStatusEffect`] is ambient. + pub fn with_ambient(mut self, ambient: bool) -> Self { + self.ambient = ambient; + self + } + + /// Sets whether the [`ActiveStatusEffect`] shows particles. + pub fn with_show_particles(mut self, show_particles: bool) -> Self { + self.show_particles = show_particles; + self + } + + /// Sets whether the [`ActiveStatusEffect`] shows an icon. + pub fn with_show_icon(mut self, show_icon: bool) -> Self { + self.show_icon = show_icon; + self + } + + /// Increments the active ticks of the [`ActiveStatusEffect`] by one. + pub fn increment_active_ticks(&mut self) { + self.active_ticks += 1; + } + + /// Returns the [`StatusEffect`] of the [`ActiveStatusEffect`]. + pub fn status_effect(&self) -> StatusEffect { + self.effect + } + + /// Returns the amplifier of the [`ActiveStatusEffect`]. + pub fn amplifier(&self) -> u8 { + self.amplifier + } + + /// Returns the initial duration of the [`ActiveStatusEffect`] in ticks. + /// Returns `None` if the [`ActiveStatusEffect`] is infinite. + pub fn initial_duration(&self) -> Option { + self.initial_duration + } + + /// Returns the remaining duration of the [`ActiveStatusEffect`] in ticks. + /// Returns `None` if the [`ActiveStatusEffect`] is infinite. + pub fn remaining_duration(&self) -> Option { + self.initial_duration + .map(|duration| duration - self.active_ticks) + } + + /// Returns the active ticks of the [`ActiveStatusEffect`]. + pub fn active_ticks(&self) -> i32 { + self.active_ticks + } + + /// Returns true if the [`ActiveStatusEffect`] is ambient. + pub fn ambient(&self) -> bool { + self.ambient + } + + /// Returns true if the [`ActiveStatusEffect`] shows particles. + pub fn show_particles(&self) -> bool { + self.show_particles + } + + /// Returns true if the [`ActiveStatusEffect`] shows an icon. + pub fn show_icon(&self) -> bool { + self.show_icon + } + + /// Returns true if the [`ActiveStatusEffect`] has expired or if it is + /// instant. + pub fn expired(&self) -> bool { + self.status_effect().instant() + || self + .remaining_duration() + .is_some_and(|duration| duration <= 0) + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_apply_effect() { + let mut effects = ActiveStatusEffects::default(); + + let effect = ActiveStatusEffect::from_effect(StatusEffect::Speed).with_amplifier(1); + let effect2 = ActiveStatusEffect::from_effect(StatusEffect::Speed).with_amplifier(2); + + let effect3 = ActiveStatusEffect::from_effect(StatusEffect::Strength).with_amplifier(1); + let effect4 = ActiveStatusEffect::from_effect(StatusEffect::Strength).with_amplifier(2); + + effects.apply(effect.clone()); + effects.apply_changes(); + assert_eq!( + effects.get_all_effect(StatusEffect::Speed), + Some(&vec![effect.clone()]) + ); + + effects.apply(effect2.clone()); + effects.apply_changes(); + assert_eq!( + effects.get_all_effect(StatusEffect::Speed), + Some(&vec![effect2.clone()]) + ); + + effects.apply(effect3.clone()); + effects.apply_changes(); + assert_eq!( + effects.get_all_effect(StatusEffect::Strength), + Some(&vec![effect3.clone()]) + ); + + effects.apply(effect4.clone()); + effects.apply_changes(); + assert_eq!( + effects.get_all_effect(StatusEffect::Strength), + Some(&vec![effect4.clone()]) + ); + } + + #[test] + fn test_apply_effect_duration() { + let mut effects = ActiveStatusEffects::default(); + + let effect = ActiveStatusEffect::from_effect(StatusEffect::Speed) + .with_amplifier(1) + .with_duration(100); + let effect2 = ActiveStatusEffect::from_effect(StatusEffect::Speed) + .with_amplifier(1) + .with_duration(200); + let effect3 = ActiveStatusEffect::from_effect(StatusEffect::Speed) + .with_amplifier(0) + .with_duration(300); + + effects.apply(effect.clone()); + effects.apply_changes(); + assert_eq!( + effects.get_all_effect(StatusEffect::Speed), + Some(&vec![effect.clone()]) + ); + + effects.apply(effect2.clone()); + effects.apply_changes(); + assert_eq!( + effects.get_all_effect(StatusEffect::Speed), + Some(&vec![effect2.clone()]) + ); + + effects.apply(effect3.clone()); + effects.apply_changes(); + assert_eq!( + effects.get_all_effect(StatusEffect::Speed), + Some(&vec![effect2.clone(), effect3.clone()]) + ); + } +} diff --git a/vendor/valence/crates/valence_entity/src/attributes.rs b/vendor/valence/crates/valence_entity/src/attributes.rs new file mode 100644 index 00000000..ec71aca8 --- /dev/null +++ b/vendor/valence/crates/valence_entity/src/attributes.rs @@ -0,0 +1,475 @@ +use std::collections::HashMap; + +use bevy_ecs::prelude::*; +use indexmap::IndexMap; +use uuid::Uuid; +pub use valence_generated::attributes::{EntityAttribute, EntityAttributeOperation}; +use valence_protocol::packets::play::entity_attributes_s2c::*; +use valence_protocol::Ident; + +/// An instance of an Entity Attribute. +#[derive(Component, Clone, PartialEq, Debug)] +pub struct EntityAttributeInstance { + /// The attribute. + attribute: EntityAttribute, + /// The base value of the attribute. + base_value: f64, + /// The add modifiers of the attribute. + add_modifiers: IndexMap, + /// The multiply base modifiers of the attribute. + multiply_base_modifiers: IndexMap, + /// The multiply total modifiers of the attribute. + multiply_total_modifiers: IndexMap, +} + +impl EntityAttributeInstance { + /// Creates a new instance of an Entity Attribute. + pub fn new(attribute: EntityAttribute) -> Self { + Self { + attribute, + base_value: attribute.default_value(), + add_modifiers: IndexMap::new(), + multiply_base_modifiers: IndexMap::new(), + multiply_total_modifiers: IndexMap::new(), + } + } + + /// Creates a new instance of an Entity Attribute with a value. + pub fn new_with_value(attribute: EntityAttribute, base_value: f64) -> Self { + Self { + attribute, + base_value, + add_modifiers: IndexMap::new(), + multiply_base_modifiers: IndexMap::new(), + multiply_total_modifiers: IndexMap::new(), + } + } + + /// Gets the attribute. + pub fn attribute(&self) -> EntityAttribute { + self.attribute + } + + /// Gets the base value of the attribute. + pub fn base_value(&self) -> f64 { + self.base_value + } + + /// Gets the computed value of the attribute. + pub fn compute_value(&self) -> f64 { + let mut value = self.base_value; + + // Increment value by modifier + for (_, modifier) in self.add_modifiers.iter() { + value += modifier; + } + + let v = value; + + // Increment value by modifier * v + for (_, modifier) in self.multiply_base_modifiers.iter() { + value += v * modifier; + } + + // Increment value by modifier * value + for (_, modifier) in self.multiply_total_modifiers.iter() { + value += value * modifier; + } + + value.clamp(self.attribute.min_value(), self.attribute.max_value()) + } + + /// Sets an add modifier. + /// + /// If the modifier already exists, it will be overwritten. + /// + /// Returns a mutable reference to self. + pub fn with_add_modifier(&mut self, uuid: Uuid, modifier: f64) -> &mut Self { + self.add_modifiers.insert(uuid, modifier); + self + } + + /// Sets a multiply base modifier. + /// + /// If the modifier already exists, it will be overwritten. + /// + /// Returns a mutable reference to self. + pub fn with_multiply_base_modifier(&mut self, uuid: Uuid, modifier: f64) -> &mut Self { + self.multiply_base_modifiers.insert(uuid, modifier); + self + } + + /// Sets a multiply total modifier. + /// + /// If the modifier already exists, it will be overwritten. + /// + /// Returns a mutable reference to self. + pub fn with_multiply_total_modifier(&mut self, uuid: Uuid, modifier: f64) -> &mut Self { + self.multiply_total_modifiers.insert(uuid, modifier); + self + } + + /// Sets a value modifier based on the operation. + /// + /// If the modifier already exists, it will be overwritten. + /// + /// Returns a mutable reference to self. + pub fn with_modifier( + &mut self, + uuid: Uuid, + modifier: f64, + operation: EntityAttributeOperation, + ) -> &mut Self { + match operation { + EntityAttributeOperation::Add => self.with_add_modifier(uuid, modifier), + EntityAttributeOperation::MultiplyBase => { + self.with_multiply_base_modifier(uuid, modifier) + } + EntityAttributeOperation::MultiplyTotal => { + self.with_multiply_total_modifier(uuid, modifier) + } + } + } + + /// Removes a modifier. + pub fn remove_modifier(&mut self, uuid: Uuid) { + self.add_modifiers.swap_remove(&uuid); + self.multiply_base_modifiers.swap_remove(&uuid); + self.multiply_total_modifiers.swap_remove(&uuid); + } + + /// Clears all modifiers. + pub fn clear_modifiers(&mut self) { + self.add_modifiers.clear(); + self.multiply_base_modifiers.clear(); + self.multiply_total_modifiers.clear(); + } + + /// Checks if a modifier exists. + pub fn has_modifier(&self, uuid: Uuid) -> bool { + self.add_modifiers.contains_key(&uuid) + || self.multiply_base_modifiers.contains_key(&uuid) + || self.multiply_total_modifiers.contains_key(&uuid) + } + + /// Converts to a `TrackedEntityProperty` for use in the + /// `EntityAttributesS2c` packet. + pub(crate) fn to_property(&self) -> TrackedEntityProperty { + TrackedEntityProperty { + key: self.attribute.name().into(), + value: self.base_value(), + modifiers: self + .add_modifiers + .iter() + .map(|(&uuid, &amount)| TrackedAttributeModifier { + uuid, + amount, + operation: 0, + }) + .chain(self.multiply_base_modifiers.iter().map(|(&uuid, &amount)| { + TrackedAttributeModifier { + uuid, + amount, + operation: 1, + } + })) + .chain( + self.multiply_total_modifiers + .iter() + .map(|(&uuid, &amount)| TrackedAttributeModifier { + uuid, + amount, + operation: 2, + }), + ) + .collect(), + } + } +} + +/// The attributes of a Living Entity. +#[derive(Component, Clone, PartialEq, Debug, Default)] +pub struct EntityAttributes { + attributes: HashMap, + recently_changed: Vec, +} + +impl EntityAttributes { + /// Gets and clears the recently changed attributes. + pub(crate) fn take_recently_changed(&mut self) -> Vec { + std::mem::take(&mut self.recently_changed) + } + + /// Marks an attribute as recently changed. + pub(crate) fn mark_recently_changed(&mut self, attribute: EntityAttribute) { + if attribute.tracked() && !self.recently_changed.contains(&attribute) { + self.recently_changed.push(attribute); + } + } +} + +impl EntityAttributes { + /// Creates a new instance of EntityAttributes. + pub fn new() -> Self { + Self { + attributes: HashMap::new(), + recently_changed: Vec::new(), + } + } + + /// Gets the instance of an attribute. + pub fn get(&self, attribute: EntityAttribute) -> Option<&EntityAttributeInstance> { + self.attributes.get(&attribute) + } + + /// Gets the base value of an attribute. + /// + /// Returns [`None`] if the attribute does not exist. + pub fn get_base_value(&self, attribute: EntityAttribute) -> Option { + self.get(attribute).map(|instance| instance.base_value()) + } + + /// Gets the computed value of an attribute. + /// + /// Returns [`None`] if the attribute does not exist. + pub fn get_compute_value(&self, attribute: EntityAttribute) -> Option { + self.get(attribute).map(|instance| instance.compute_value()) + } + + /// Checks if an attribute exists. + pub fn has_attribute(&self, attribute: EntityAttribute) -> bool { + self.attributes.contains_key(&attribute) + } + + /// Creates an attribute if it does not exist. + pub fn create_attribute(&mut self, attribute: EntityAttribute) { + self.mark_recently_changed(attribute); + self.attributes + .entry(attribute) + .or_insert_with(|| EntityAttributeInstance::new(attribute)); + } + + /// Creates an attribute if it does not exist and sets its base value. + /// + /// Returns self. + /// + /// ## Note + /// + /// Only to be used in builder-like patterns. + pub(crate) fn with_attribute_and_value( + mut self, + attribute: EntityAttribute, + base_value: f64, + ) -> Self { + self.attributes + .entry(attribute) + .or_insert_with(|| EntityAttributeInstance::new_with_value(attribute, base_value)) + .base_value = base_value; + self + } + + /// Sets the base value of an attribute. + pub fn set_base_value(&mut self, attribute: EntityAttribute, value: f64) { + self.mark_recently_changed(attribute); + self.attributes + .entry(attribute) + .or_insert_with(|| EntityAttributeInstance::new(attribute)) + .base_value = value; + } + + /// Sets an add modifier of an attribute. + pub fn set_add_modifier(&mut self, attribute: EntityAttribute, uuid: Uuid, modifier: f64) { + self.mark_recently_changed(attribute); + self.attributes + .entry(attribute) + .or_insert_with(|| EntityAttributeInstance::new(attribute)) + .with_add_modifier(uuid, modifier); + } + + /// Sets a multiply base modifier of an attribute. + pub fn set_multiply_base_modifier( + &mut self, + attribute: EntityAttribute, + uuid: Uuid, + modifier: f64, + ) { + self.mark_recently_changed(attribute); + self.attributes + .entry(attribute) + .or_insert_with(|| EntityAttributeInstance::new(attribute)) + .with_multiply_base_modifier(uuid, modifier); + } + + /// Sets a multiply total modifier of an attribute. + pub fn set_multiply_total_modifier( + &mut self, + attribute: EntityAttribute, + uuid: Uuid, + modifier: f64, + ) { + self.mark_recently_changed(attribute); + self.attributes + .entry(attribute) + .or_insert_with(|| EntityAttributeInstance::new(attribute)) + .with_multiply_total_modifier(uuid, modifier); + } + + /// Sets a value modifier of an attribute based on the operation. + pub fn set_modifier( + &mut self, + attribute: EntityAttribute, + uuid: Uuid, + modifier: f64, + operation: EntityAttributeOperation, + ) { + self.mark_recently_changed(attribute); + self.attributes + .entry(attribute) + .or_insert_with(|| EntityAttributeInstance::new(attribute)) + .with_modifier(uuid, modifier, operation); + } + + /// Removes a modifier of an attribute. + pub fn remove_modifier(&mut self, attribute: EntityAttribute, uuid: Uuid) { + self.mark_recently_changed(attribute); + if let Some(instance) = self.attributes.get_mut(&attribute) { + instance.remove_modifier(uuid); + } + } + + /// Clears all modifiers of an attribute. + pub fn clear_modifiers(&mut self, attribute: EntityAttribute) { + self.mark_recently_changed(attribute); + if let Some(instance) = self.attributes.get_mut(&attribute) { + instance.clear_modifiers(); + } + } + + /// Checks if a modifier exists on an attribute. + pub fn has_modifier(&self, attribute: EntityAttribute, uuid: Uuid) -> bool { + self.attributes + .get(&attribute) + .map(|instance| instance.has_modifier(uuid)) + .unwrap_or(false) + } + + /// **For internal use only.** + /// + /// Converts to a [`Vec`] of [`AttributeProperty`]s. + pub fn to_properties(&self) -> Vec { + self.attributes + .iter() + .filter(|(_, instance)| instance.attribute().tracked()) + .map(|(_, instance)| instance.to_property().to_property()) + .collect() + } +} + +/// Tracks the attributes of a Living Entity. +#[derive(Component, Clone, Debug, Default)] +pub struct TrackedEntityAttributes { + /// The attributes that have been modified. + modified: IndexMap, +} + +#[derive(Clone, Debug)] +pub(crate) struct TrackedEntityProperty { + key: String, + value: f64, + modifiers: Vec, +} + +#[derive(Clone, Debug)] +pub(crate) struct TrackedAttributeModifier { + uuid: Uuid, + amount: f64, + operation: u8, +} + +impl TrackedEntityProperty { + /// Converts to an [`AttributeProperty`]s. + fn to_property(&self) -> AttributeProperty { + AttributeProperty { + key: Ident::new(self.key.clone()).unwrap(), + value: self.value, + modifiers: self + .modifiers + .iter() + .map(|modifier| AttributeModifier { + uuid: modifier.uuid, + amount: modifier.amount, + operation: modifier.operation, + }) + .collect(), + } + } +} + +impl TrackedEntityAttributes { + /// Creates a new instance of TrackedEntityAttributes. + pub fn new() -> Self { + Self { + modified: IndexMap::new(), + } + } + + /// Marks an attribute as modified. + pub fn mark_modified(&mut self, attributes: &EntityAttributes, attribute: EntityAttribute) { + if let Some(instance) = attributes.get(attribute) { + self.modified.insert(attribute, instance.to_property()); + } + } + + /// Returns the properties turned into a [`Vec`] of [`AttributeProperty`]s. + pub fn get_properties(&self) -> Vec { + self.modified + .iter() + .map(|(_, property)| property.to_property()) + .collect() + } + + /// Clears the modified attributes. + pub fn clear(&mut self) { + self.modified.clear(); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_compute_value() { + let add_uuid = Uuid::new_v4(); + let mut attributes = EntityAttributes::new(); + attributes.set_base_value(EntityAttribute::GenericMaxHealth, 20.0); + attributes.set_add_modifier(EntityAttribute::GenericMaxHealth, add_uuid, 10.0); + attributes.set_multiply_base_modifier( + EntityAttribute::GenericMaxHealth, + Uuid::new_v4(), + 0.2, + ); + attributes.set_multiply_base_modifier( + EntityAttribute::GenericMaxHealth, + Uuid::new_v4(), + 0.2, + ); + attributes.set_multiply_total_modifier( + EntityAttribute::GenericMaxHealth, + Uuid::new_v4(), + 0.5, + ); + + assert_eq!( + attributes.get_compute_value(EntityAttribute::GenericMaxHealth), + Some(63.0) // ((20 + 10) * (1 + 0.2 + 0.2)) * (1 + 0.5) + ); + + attributes.remove_modifier(EntityAttribute::GenericMaxHealth, add_uuid); + + assert_eq!( + attributes.get_compute_value(EntityAttribute::GenericMaxHealth), + Some(42.0) // ((20) * (1 + 0.2 + 0.2)) * (1 + 0.5) + ); + } +} diff --git a/vendor/valence/crates/valence_entity/src/flags.rs b/vendor/valence/crates/valence_entity/src/flags.rs new file mode 100644 index 00000000..cb09e9ed --- /dev/null +++ b/vendor/valence/crates/valence_entity/src/flags.rs @@ -0,0 +1,144 @@ +use super::*; + +// TODO: should `set_if_neq` behavior be the default behavior for setters? +macro_rules! flags { + ( + $( + $component:path { + $($flag:ident: $offset:literal),* $(,)? + } + )* + + ) => { + $( + impl $component { + $( + #[doc = "Gets the bit at offset "] + #[doc = stringify!($offset)] + #[doc = "."] + #[inline] + pub const fn $flag(&self) -> bool { + (self.0 >> $offset) & 1 == 1 + } + + paste! { + #[doc = "Sets the bit at offset "] + #[doc = stringify!($offset)] + #[doc = "."] + #[inline] + pub fn [< set_$flag >] (&mut self, $flag: bool) { + self.0 = (self.0 & !(1 << $offset)) | (($flag as i8) << $offset); + } + } + )* + } + )* + } +} + +flags! { + entity::Flags { + on_fire: 0, + sneaking: 1, + sprinting: 3, + swimming: 4, + invisible: 5, + glowing: 6, + fall_flying: 7, + } + persistent_projectile::ProjectileFlags { + critical: 0, + no_clip: 1, + } + living::LivingFlags { + using_item: 0, + off_hand_active: 1, + using_riptide: 2, + } + player::PlayerModelParts { + cape: 0, + jacket: 1, + left_sleeve: 2, + right_sleeve: 3, + left_pants_leg: 4, + right_pants_leg: 5, + hat: 6, + } + player::MainArm { + right: 0, + } + armor_stand::ArmorStandFlags { + small: 0, + show_arms: 1, + hide_base_plate: 2, + marker: 3, + } + mob::MobFlags { + ai_disabled: 0, + left_handed: 1, + attacking: 2, + } + bat::BatFlags { + hanging: 0, + } + abstract_horse::HorseFlags { + tamed: 1, + saddled: 2, + bred: 3, + eating_grass: 4, + angry: 5, + eating: 6, + } + fox::FoxFlags { + sitting: 0, + crouching: 2, + rolling_head: 3, + chasing: 4, + sleeping: 5, + walking: 6, + aggressive: 7, + } + panda::PandaFlags { + sneezing: 1, + playing: 2, + sitting: 3, + lying_on_back: 4, + } + tameable::TameableFlags { + sitting_pose: 0, + tamed: 2, + } + iron_golem::IronGolemFlags { + player_created: 0, + } + snow_golem::SnowGolemFlags { + has_pumpkin: 4, + } + blaze::BlazeFlags { + fire_active: 0, + } + vex::VexFlags { + charging: 0, + } + spider::SpiderFlags { + climbing_wall: 0, + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn get_set_flags() { + let mut flags = entity::Flags(0); + + flags.set_on_fire(true); + let before = flags.clone(); + assert_ne!(flags.0, 0); + flags.set_on_fire(true); + assert_eq!(before, flags); + flags.set_on_fire(false); + assert_eq!(flags.0, 0); + } +} diff --git a/vendor/valence/crates/valence_entity/src/hitbox.rs b/vendor/valence/crates/valence_entity/src/hitbox.rs new file mode 100644 index 00000000..f5d600c8 --- /dev/null +++ b/vendor/valence/crates/valence_entity/src/hitbox.rs @@ -0,0 +1,549 @@ +#![allow(clippy::type_complexity)] + +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use derive_more::Deref; +use valence_math::{Aabb, UVec3, Vec3Swizzles}; +use valence_protocol::Direction; + +use crate::*; + +#[derive(SystemSet, Clone, Copy, Debug, Hash, PartialEq, Eq)] +pub struct HitboxShapeUpdateSet; + +#[derive(SystemSet, Clone, Copy, Debug, Hash, PartialEq, Eq)] +pub struct HitboxComponentsAddSet; + +#[derive(SystemSet, Clone, Copy, Debug, Hash, PartialEq, Eq)] +pub struct HitboxUpdateSet; + +pub struct HitboxPlugin; + +#[derive(Resource)] +/// Settings for hitbox plugin +pub struct EntityHitboxSettings { + /// Controls if a plugin should add hitbox component on each created entity. + /// Otherwise you should add hitbox component by yourself in order to use + /// it. + pub add_hitbox_component: bool, +} + +impl Default for EntityHitboxSettings { + fn default() -> Self { + Self { + add_hitbox_component: true, + } + } +} + +impl Plugin for HitboxPlugin { + fn build(&self, app: &mut App) { + app.init_resource::() + .configure_sets(PreUpdate, HitboxShapeUpdateSet) + .add_systems( + PreUpdate, + ( + update_constant_hitbox, + update_warden_hitbox, + update_area_effect_cloud_hitbox, + update_armor_stand_hitbox, + update_passive_child_hitbox, + update_zombie_hitbox, + update_piglin_hitbox, + update_zoglin_hitbox, + update_player_hitbox, + update_item_frame_hitbox, + update_slime_hitbox, + update_painting_hitbox, + update_shulker_hitbox, + ), + ) + .configure_sets(PostUpdate, HitboxComponentsAddSet) + .add_systems( + PostUpdate, + add_hitbox_component.in_set(HitboxComponentsAddSet), + ) + .configure_sets(PreUpdate, HitboxUpdateSet.after(HitboxShapeUpdateSet)) + .add_systems(PreUpdate, update_hitbox.in_set(HitboxUpdateSet)); + } +} + +/// Size of hitbox. The only way to manipulate it without losing it on the next +/// tick is using a marker entity. Marker entity's hitbox is never updated. +#[derive(Component, Debug, PartialEq, Deref)] +pub struct HitboxShape(pub Aabb); + +/// Hitbox, aabb of which is calculated each tick using its position and +/// [`Hitbox`]. In order to change size of this hitbox you need to change +/// [`Hitbox`]. +#[derive(Component, Debug, Deref)] +pub struct Hitbox(Aabb); + +impl HitboxShape { + pub const ZERO: HitboxShape = HitboxShape(Aabb::ZERO); + + pub fn get(&self) -> Aabb { + self.0 + } + + pub(crate) fn centered(&mut self, size: DVec3) { + self.0 = Aabb::from_bottom_size(DVec3::ZERO, size); + } + + pub(crate) fn in_world(&self, pos: DVec3) -> Aabb { + self.0 + pos + } +} + +impl Hitbox { + pub fn get(&self) -> Aabb { + self.0 + } +} + +fn add_hitbox_component( + settings: Res, + mut commands: Commands, + query: Query<(Entity, &Position), Added>, + alt_query: Query<(Entity, &Position, &HitboxShape), Added>, +) { + if settings.add_hitbox_component { + for (entity, pos) in query.iter() { + commands + .entity(entity) + .insert(HitboxShape::ZERO) + .insert(Hitbox(HitboxShape::ZERO.in_world(pos.0))); + } + } else { + for (entity, pos, hitbox) in alt_query.iter() { + commands + .entity(entity) + .insert(Hitbox(hitbox.in_world(pos.0))); + } + } +} + +fn update_hitbox( + mut hitbox_query: Query< + (&mut Hitbox, &HitboxShape, &Position), + Or<(Changed, Changed)>, + >, +) { + for (mut in_world, hitbox, pos) in hitbox_query.iter_mut() { + in_world.0 = hitbox.in_world(pos.0); + } +} + +fn update_constant_hitbox( + mut hitbox_query: Query< + (&mut HitboxShape, &EntityKind), + Or<(Changed, Added)>, + >, +) { + for (mut hitbox, entity_kind) in hitbox_query.iter_mut() { + let size = match *entity_kind { + EntityKind::ALLAY => [0.6, 0.35, 0.6], + EntityKind::CHEST_BOAT | EntityKind::BOAT => [1.375, 0.5625, 1.375], + EntityKind::FROG => [0.5, 0.5, 0.5], + EntityKind::TADPOLE => [0.4, 0.3, 0.4], + EntityKind::SPECTRAL_ARROW | EntityKind::ARROW => [0.5, 0.5, 0.5], + EntityKind::AXOLOTL => [1.3, 0.6, 1.3], + EntityKind::BAT => [0.5, 0.9, 0.5], + EntityKind::BLAZE => [0.6, 1.8, 0.6], + EntityKind::CAT => [0.6, 0.7, 0.6], + EntityKind::CAVE_SPIDER => [0.7, 0.5, 0.7], + EntityKind::COD => [0.5, 0.3, 0.5], + EntityKind::CREEPER => [0.6, 1.7, 0.6], + EntityKind::DOLPHIN => [0.9, 0.6, 0.9], + EntityKind::DRAGON_FIREBALL => [1.0, 1.0, 1.0], + EntityKind::ELDER_GUARDIAN => [1.9975, 1.9975, 1.9975], + EntityKind::END_CRYSTAL => [2.0, 2.0, 2.0], + EntityKind::ENDER_DRAGON => [16.0, 8.0, 16.0], + EntityKind::ENDERMAN => [0.6, 2.9, 0.6], + EntityKind::ENDERMITE => [0.4, 0.3, 0.4], + EntityKind::EVOKER => [0.6, 1.95, 0.6], + EntityKind::EVOKER_FANGS => [0.5, 0.8, 0.5], + EntityKind::EXPERIENCE_ORB => [0.5, 0.5, 0.5], + EntityKind::EYE_OF_ENDER => [0.25, 0.25, 0.25], + EntityKind::FALLING_BLOCK => [0.98, 0.98, 0.98], + EntityKind::FIREWORK_ROCKET => [0.25, 0.25, 0.25], + EntityKind::GHAST => [4.0, 4.0, 4.0], + EntityKind::GIANT => [3.6, 12.0, 3.6], + EntityKind::GLOW_SQUID | EntityKind::SQUID => [0.8, 0.8, 0.8], + EntityKind::GUARDIAN => [0.85, 0.85, 0.85], + EntityKind::ILLUSIONER => [0.6, 1.95, 0.6], + EntityKind::IRON_GOLEM => [1.4, 2.7, 1.4], + EntityKind::ITEM => [0.25, 0.25, 0.25], + EntityKind::FIREBALL => [1.0, 1.0, 1.0], + EntityKind::LEASH_KNOT => [0.375, 0.5, 0.375], + EntityKind::LIGHTNING /* | EntityKind::MARKER - marker hitbox */ => [0.0; 3], + EntityKind::LLAMA_SPIT => [0.25, 0.25, 0.25], + EntityKind::MINECART + | EntityKind::CHEST_MINECART + | EntityKind::TNT_MINECART + | EntityKind::HOPPER_MINECART + | EntityKind::FURNACE_MINECART + | EntityKind::SPAWNER_MINECART + | EntityKind::COMMAND_BLOCK_MINECART => [0.98, 0.7, 0.98], + EntityKind::PARROT => [0.5, 0.9, 0.5], + EntityKind::PHANTOM => [0.9, 0.5, 0.9], + EntityKind::PIGLIN_BRUTE => [0.6, 1.95, 0.6], + EntityKind::PILLAGER => [0.6, 1.95, 0.6], + EntityKind::TNT => [0.98, 0.98, 0.98], + EntityKind::PUFFERFISH => [0.7, 0.7, 0.7], + EntityKind::RAVAGER => [1.95, 2.2, 1.95], + EntityKind::SALMON => [0.7, 0.4, 0.7], + EntityKind::SHULKER_BULLET => [0.3125, 0.3125, 0.3125], + EntityKind::SILVERFISH => [0.4, 0.3, 0.4], + EntityKind::SMALL_FIREBALL => [0.3125, 0.3125, 0.3125], + EntityKind::SNOW_GOLEM => [0.7, 1.9, 0.7], + EntityKind::SPIDER => [1.4, 0.9, 1.4], + EntityKind::STRAY => [0.6, 1.99, 0.6], + EntityKind::EGG => [0.25, 0.25, 0.25], + EntityKind::ENDER_PEARL => [0.25, 0.25, 0.25], + EntityKind::EXPERIENCE_BOTTLE => [0.25, 0.25, 0.25], + EntityKind::POTION => [0.25, 0.25, 0.25], + EntityKind::TRIDENT => [0.5, 0.5, 0.5], + EntityKind::TRADER_LLAMA => [0.9, 1.87, 0.9], + EntityKind::TROPICAL_FISH => [0.5, 0.4, 0.5], + EntityKind::VEX => [0.4, 0.8, 0.4], + EntityKind::VINDICATOR => [0.6, 1.95, 0.6], + EntityKind::WITHER => [0.9, 3.5, 0.9], + EntityKind::WITHER_SKELETON => [0.7, 2.4, 0.7], + EntityKind::WITHER_SKULL => [0.3125, 0.3125, 0.3125], + EntityKind::FISHING_BOBBER => [0.25, 0.25, 0.25], + _ => { + continue; + } + } + .into(); + hitbox.centered(size); + } +} + +fn update_warden_hitbox( + mut query: Query< + (&mut HitboxShape, &entity::Pose), + ( + Or<(Changed, Added)>, + With, + ), + >, +) { + for (mut hitbox, entity_pose) in query.iter_mut() { + hitbox.centered( + match entity_pose.0 { + Pose::Emerging | Pose::Digging => [0.9, 1.0, 0.9], + _ => [0.9, 2.9, 0.9], + } + .into(), + ); + } +} + +fn update_area_effect_cloud_hitbox( + mut query: Query< + (&mut HitboxShape, &area_effect_cloud::Radius), + Or<(Changed, Added)>, + >, +) { + for (mut hitbox, cloud_radius) in query.iter_mut() { + let diameter = cloud_radius.0 as f64 * 2.0; + hitbox.centered([diameter, 0.5, diameter].into()); + } +} + +fn update_armor_stand_hitbox( + mut query: Query< + (&mut HitboxShape, &armor_stand::ArmorStandFlags), + Or<(Changed, Added)>, + >, +) { + for (mut hitbox, stand_flags) in query.iter_mut() { + hitbox.centered( + if stand_flags.0 & 16 != 0 { + // Marker armor stand + [0.0; 3] + } else if stand_flags.0 & 1 != 0 { + // Small armor stand + [0.5, 0.9875, 0.5] + } else { + [0.5, 1.975, 0.5] + } + .into(), + ); + } +} + +fn child_hitbox(child: bool, v: DVec3) -> DVec3 { + if child { + v / 2.0 + } else { + v + } +} + +fn update_passive_child_hitbox( + mut query: Query< + (Entity, &mut HitboxShape, &EntityKind, &passive::Child), + Or<(Changed, Added)>, + >, + pose_query: Query<&entity::Pose>, +) { + for (entity, mut hitbox, entity_kind, child) in query.iter_mut() { + let big_s = match *entity_kind { + EntityKind::BEE => [0.7, 0.6, 0.7], + EntityKind::CAMEL => [1.7, 2.375, 1.7], + EntityKind::CHICKEN => [0.4, 0.7, 0.4], + EntityKind::DONKEY => [1.5, 1.39648, 1.5], + EntityKind::FOX => [0.6, 0.7, 0.6], + EntityKind::GOAT => { + if pose_query + .get(entity) + .is_ok_and(|v| v.0 == Pose::LongJumping) + { + [0.63, 0.91, 0.63] + } else { + [0.9, 1.3, 0.9] + } + } + EntityKind::HOGLIN => [1.39648, 1.4, 1.39648], + EntityKind::HORSE | EntityKind::SKELETON_HORSE | EntityKind::ZOMBIE_HORSE => { + [1.39648, 1.6, 1.39648] + } + EntityKind::LLAMA => [0.9, 1.87, 0.9], + EntityKind::MULE => [1.39648, 1.6, 1.39648], + EntityKind::MOOSHROOM => [0.9, 1.4, 0.9], + EntityKind::OCELOT => [0.6, 0.7, 0.6], + EntityKind::PANDA => [1.3, 1.25, 1.3], + EntityKind::PIG => [0.9, 0.9, 0.9], + EntityKind::POLAR_BEAR => [1.4, 1.4, 1.4], + EntityKind::RABBIT => [0.4, 0.5, 0.4], + EntityKind::SHEEP => [0.9, 1.3, 0.9], + EntityKind::TURTLE => { + hitbox.centered( + if child.0 { + [0.36, 0.12, 0.36] + } else { + [1.2, 0.4, 1.2] + } + .into(), + ); + continue; + } + EntityKind::VILLAGER => [0.6, 1.95, 0.6], + EntityKind::WOLF => [0.6, 0.85, 0.6], + _ => { + continue; + } + }; + hitbox.centered(child_hitbox(child.0, big_s.into())); + } +} + +fn update_zombie_hitbox( + mut query: Query< + (&mut HitboxShape, &zombie::Baby), + Or<(Changed, Added)>, + >, +) { + for (mut hitbox, baby) in query.iter_mut() { + hitbox.centered(child_hitbox(baby.0, [0.6, 1.95, 0.6].into())); + } +} + +fn update_piglin_hitbox( + mut query: Query< + (&mut HitboxShape, &piglin::Baby), + Or<(Changed, Added)>, + >, +) { + for (mut hitbox, baby) in query.iter_mut() { + hitbox.centered(child_hitbox(baby.0, [0.6, 1.95, 0.6].into())); + } +} + +fn update_zoglin_hitbox( + mut query: Query< + (&mut HitboxShape, &zoglin::Baby), + Or<(Changed, Added)>, + >, +) { + for (mut hitbox, baby) in query.iter_mut() { + hitbox.centered(child_hitbox(baby.0, [1.39648, 1.4, 1.39648].into())); + } +} + +fn update_player_hitbox( + mut query: Query< + (&mut HitboxShape, &entity::Pose), + ( + Or<(Changed, Added)>, + With, + ), + >, +) { + for (mut hitbox, pose) in query.iter_mut() { + hitbox.centered( + match pose.0 { + Pose::Sleeping | Pose::Dying => [0.2, 0.2, 0.2], + Pose::FallFlying | Pose::Swimming | Pose::SpinAttack => [0.6, 0.6, 0.6], + Pose::Sneaking => [0.6, 1.5, 0.6], + _ => [0.6, 1.8, 0.6], + } + .into(), + ); + } +} + +fn update_item_frame_hitbox( + mut query: Query< + (&mut HitboxShape, &item_frame::Rotation), + Or<(Changed, Added)>, + >, +) { + for (mut hitbox, rotation) in query.iter_mut() { + let mut center_pos = DVec3::splat(0.5); + + const A: f64 = 0.46875; + + match rotation.0 { + 0 => center_pos.y += A, + 1 => center_pos.y -= A, + 2 => center_pos.z += A, + 3 => center_pos.z -= A, + 4 => center_pos.x += A, + 5 => center_pos.x -= A, + _ => center_pos.y -= A, + } + + const BOUNDS23: DVec3 = DVec3::new(0.375, 0.375, 0.03125); + + let bounds = match rotation.0 { + 2 | 3 => BOUNDS23, + 4 | 5 => BOUNDS23.zxy(), + _ => BOUNDS23.zxy(), + }; + + hitbox.0 = Aabb::new(center_pos - bounds, center_pos + bounds); + } +} + +fn update_slime_hitbox( + mut query: Query< + (&mut HitboxShape, &slime::SlimeSize), + Or<(Changed, Added)>, + >, +) { + for (mut hitbox, slime_size) in query.iter_mut() { + let s = 0.5202 * slime_size.0 as f64; + hitbox.centered([s, s, s].into()); + } +} + +fn update_painting_hitbox( + mut query: Query< + (&mut HitboxShape, &painting::Variant, &Look), + Or<( + Changed, + Changed, + Added, + )>, + >, +) { + for (mut hitbox, painting_variant, look) in query.iter_mut() { + let bounds: UVec3 = match painting_variant.0 { + PaintingKind::Kebab => [1, 1, 1], + PaintingKind::Aztec => [1, 1, 1], + PaintingKind::Alban => [1, 1, 1], + PaintingKind::Aztec2 => [1, 1, 1], + PaintingKind::Bomb => [1, 1, 1], + PaintingKind::Plant => [1, 1, 1], + PaintingKind::Wasteland => [1, 1, 1], + PaintingKind::Pool => [2, 1, 2], + PaintingKind::Courbet => [2, 1, 2], + PaintingKind::Sea => [2, 1, 2], + PaintingKind::Sunset => [2, 1, 2], + PaintingKind::Creebet => [2, 1, 2], + PaintingKind::Wanderer => [1, 2, 1], + PaintingKind::Graham => [1, 2, 1], + PaintingKind::Match => [2, 2, 2], + PaintingKind::Bust => [2, 2, 2], + PaintingKind::Stage => [2, 2, 2], + PaintingKind::Void => [2, 2, 2], + PaintingKind::SkullAndRoses => [2, 2, 2], + PaintingKind::Wither => [2, 2, 2], + PaintingKind::Fighters => [4, 2, 4], + PaintingKind::Pointer => [4, 4, 4], + PaintingKind::Pigscene => [4, 4, 4], + PaintingKind::BurningSkull => [4, 4, 4], + PaintingKind::Skeleton => [4, 3, 4], + PaintingKind::Earth => [2, 2, 2], + PaintingKind::Wind => [2, 2, 2], + PaintingKind::Water => [2, 2, 2], + PaintingKind::Fire => [2, 2, 2], + PaintingKind::DonkeyKong => [4, 3, 4], + } + .into(); + + let mut center_pos = DVec3::splat(0.5); + + let (facing_x, facing_z, cc_facing_x, cc_facing_z) = + match ((look.yaw + 45.0).rem_euclid(360.0) / 90.0) as u8 { + 0 => (0, 1, 1, 0), // South + 1 => (-1, 0, 0, 1), // West + 2 => (0, -1, -1, 0), // North + _ => (1, 0, 0, -1), // East + }; + + center_pos.x -= facing_x as f64 * 0.46875; + center_pos.z -= facing_z as f64 * 0.46875; + + center_pos.x += cc_facing_x as f64 * if bounds.x % 2 == 0 { 0.5 } else { 0.0 }; + center_pos.y += if bounds.y % 2 == 0 { 0.5 } else { 0.0 }; + center_pos.z += cc_facing_z as f64 * if bounds.z % 2 == 0 { 0.5 } else { 0.0 }; + + let bounds = match (facing_x, facing_z) { + (1, 0) | (-1, 0) => DVec3::new(0.0625, bounds.y as f64, bounds.z as f64), + _ => DVec3::new(bounds.x as f64, bounds.y as f64, 0.0625), + }; + + hitbox.0 = Aabb::new(center_pos - bounds / 2.0, center_pos + bounds / 2.0); + } +} + +fn update_shulker_hitbox( + mut query: Query< + ( + &mut HitboxShape, + &shulker::PeekAmount, + &shulker::AttachedFace, + ), + Or<( + Changed, + Changed, + Added, + )>, + >, +) { + use std::f64::consts::PI; + + for (mut hitbox, peek_amount, attached_face) in query.iter_mut() { + let pos = DVec3::splat(0.5); + let mut min = pos - 0.5; + let mut max = pos + 0.5; + + let peek = 0.5 - f64::cos(peek_amount.0 as f64 * 0.01 * PI) * 0.5; + + match attached_face.0 { + Direction::Down => max.y += peek, + Direction::Up => min.y -= peek, + Direction::North => max.z += peek, + Direction::South => min.z -= peek, + Direction::West => max.x += peek, + Direction::East => min.x -= peek, + } + + hitbox.0 = Aabb::new(min, max); + } +} diff --git a/vendor/valence/crates/valence_entity/src/lib.rs b/vendor/valence/crates/valence_entity/src/lib.rs new file mode 100644 index 00000000..733649d9 --- /dev/null +++ b/vendor/valence/crates/valence_entity/src/lib.rs @@ -0,0 +1,712 @@ +#![doc = include_str!("../README.md")] +#![deny( + rustdoc::broken_intra_doc_links, + rustdoc::private_intra_doc_links, + rustdoc::missing_crate_level_docs, + rustdoc::invalid_codeblock_attributes, + rustdoc::invalid_rust_codeblocks, + rustdoc::bare_urls, + rustdoc::invalid_html_tags +)] +#![warn( + trivial_casts, + trivial_numeric_casts, + unused_lifetimes, + unused_import_braces, + unreachable_pub, + clippy::dbg_macro +)] +#![allow(clippy::type_complexity)] + +pub mod active_status_effects; +pub mod attributes; +mod flags; +pub mod hitbox; +pub mod manager; +pub mod query; +pub mod tracked_data; + +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use derive_more::{Deref, DerefMut}; +pub use manager::EntityManager; +use paste::paste; +use tracing::warn; +use tracked_data::TrackedData; +use valence_math::{DVec3, Vec3}; +use valence_protocol::{Decode, DecodeBytesAuto, Encode, VarInt}; +use valence_server_common::{Despawned, UniqueId}; + +use crate::attributes::TrackedEntityAttributes; + +include!(concat!(env!("OUT_DIR"), "/entity.rs")); + +pub struct EntityPlugin; + +/// When new Minecraft entities are initialized and added to +/// [`EntityManager`]. +/// +/// Systems that need Minecraft entities to be in a valid state should run +/// _after_ this set. +/// +/// This set lives in [`PostUpdate`]. +#[derive(SystemSet, Copy, Clone, PartialEq, Eq, Hash, Debug)] +pub struct InitEntitiesSet; + +/// When tracked data is written to the entity's [`TrackedData`] component. +/// Systems that modify tracked data should run _before_ this. +/// +/// This set lives in [`PostUpdate`]. +#[derive(SystemSet, Copy, Clone, PartialEq, Eq, Hash, Debug)] +pub struct UpdateTrackedDataSet; + +/// When entities are updated and changes from the current tick are cleared. +/// Systems that need to observe changes to entities (Such as the difference +/// between [`Position`] and [`OldPosition`]) should run _before_ this set (and +/// probably after [`InitEntitiesSet`]). +/// +/// This set lives in [`PostUpdate`]. +#[derive(SystemSet, Copy, Clone, PartialEq, Eq, Hash, Debug)] +pub struct ClearEntityChangesSet; + +impl Plugin for EntityPlugin { + fn build(&self, app: &mut App) { + app.insert_resource(EntityManager::new()) + .configure_sets( + PostUpdate, + ( + InitEntitiesSet, + UpdateTrackedDataSet, + ClearEntityChangesSet + .after(InitEntitiesSet) + .after(UpdateTrackedDataSet), + ), + ) + .add_systems( + PostUpdate, + (remove_despawned_from_manager, init_entities) + .chain() + .in_set(InitEntitiesSet), + ) + .add_systems( + PostUpdate, + ( + clear_status_changes, + clear_animation_changes, + clear_tracked_data_changes, + clear_tracked_attributes_changes, + update_old_position, + update_old_layer_id, + ) + .in_set(ClearEntityChangesSet), + ); + + add_tracked_data_systems(app); + } +} + +fn update_old_position(mut query: Query<(&Position, &mut OldPosition)>) { + for (pos, mut old_pos) in &mut query { + old_pos.0 = pos.0; + } +} + +fn update_old_layer_id(mut query: Query<(&EntityLayerId, &mut OldEntityLayerId)>) { + for (loc, mut old_loc) in &mut query { + old_loc.0 = loc.0; + } +} + +fn remove_despawned_from_manager( + entities: Query<&EntityId, (With, With)>, + mut manager: ResMut, +) { + for id in &entities { + manager.id_to_entity.remove(&id.0); + } +} + +fn init_entities( + mut entities: Query< + (Entity, &mut EntityId, &Position, &mut OldPosition), + (Added, Without), + >, + mut manager: ResMut, +) { + for (entity, mut id, pos, mut old_pos) in &mut entities { + *old_pos = OldPosition::new(pos.0); + + if *id == EntityId::default() { + *id = manager.next_id(); + } + + if let Some(conflict) = manager.id_to_entity.insert(id.0, entity) { + warn!( + "entity {entity:?} has conflicting entity ID of {} with entity {conflict:?}", + id.0 + ); + } + } +} + +fn clear_status_changes(mut statuses: Query<&mut EntityStatuses, Changed>) { + for mut statuses in &mut statuses { + statuses.0 = 0; + } +} + +fn clear_animation_changes( + mut animations: Query<&mut EntityAnimations, Changed>, +) { + for mut animations in &mut animations { + animations.0 = 0; + } +} + +fn clear_tracked_data_changes(mut tracked_data: Query<&mut TrackedData, Changed>) { + for mut tracked_data in &mut tracked_data { + tracked_data.clear_update_values(); + } +} + +fn clear_tracked_attributes_changes( + mut attributes: Query<&mut TrackedEntityAttributes, Changed>, +) { + for mut attributes in &mut attributes { + attributes.clear(); + } +} + +/// Contains the entity layer an entity is on. +#[derive(Component, Copy, Clone, PartialEq, Eq, Debug, Deref)] +pub struct EntityLayerId(pub Entity); + +impl Default for EntityLayerId { + fn default() -> Self { + Self(Entity::PLACEHOLDER) + } +} + +impl PartialEq for EntityLayerId { + fn eq(&self, other: &OldEntityLayerId) -> bool { + self.0 == other.0 + } +} + +/// The value of [`EntityLayerId`] from the end of the previous tick. +#[derive(Component, Copy, Clone, PartialEq, Eq, Debug, Deref)] +pub struct OldEntityLayerId(Entity); + +impl OldEntityLayerId { + pub fn get(&self) -> Entity { + self.0 + } +} + +impl Default for OldEntityLayerId { + fn default() -> Self { + Self(Entity::PLACEHOLDER) + } +} + +impl PartialEq for OldEntityLayerId { + fn eq(&self, other: &EntityLayerId) -> bool { + self.0 == other.0 + } +} + +#[derive(Component, Copy, Clone, PartialEq, Default, Debug, Deref, DerefMut)] +pub struct Position(pub DVec3); + +impl Position { + pub fn new(pos: impl Into) -> Self { + Self(pos.into()) + } + + pub fn get(self) -> DVec3 { + self.0 + } + + pub fn set(&mut self, pos: impl Into) { + self.0 = pos.into(); + } +} + +impl PartialEq for Position { + fn eq(&self, other: &OldPosition) -> bool { + self.0 == other.0 + } +} + +/// The value of [`Position`] from the end of the previous tick. +/// +/// **NOTE**: You should not modify this component after the entity is spawned. +#[derive(Component, Clone, PartialEq, Default, Debug, Deref)] +pub struct OldPosition(DVec3); + +impl OldPosition { + pub fn new(pos: impl Into) -> Self { + Self(pos.into()) + } + + pub fn get(&self) -> DVec3 { + self.0 + } +} + +impl PartialEq for OldPosition { + fn eq(&self, other: &Position) -> bool { + self.0 == other.0 + } +} + +/// Describes the direction an entity is looking using pitch and yaw angles. +#[derive(Component, Copy, Clone, PartialEq, Default, Debug)] +pub struct Look { + /// The yaw angle in degrees, where: + /// - `-90` is looking east (towards positive x). + /// - `0` is looking south (towards positive z). + /// - `90` is looking west (towards negative x). + /// - `180` is looking north (towards negative z). + /// + /// Values -180 to 180 are also valid. + pub yaw: f32, + /// The pitch angle in degrees, where: + /// - `-90` is looking straight up. + /// - `0` is looking straight ahead. + /// - `90` is looking straight down. + pub pitch: f32, +} + +impl Look { + pub const fn new(yaw: f32, pitch: f32) -> Self { + Self { yaw, pitch } + } + + /// Gets a normalized direction vector from the yaw and pitch. + pub fn vec(self) -> Vec3 { + let (yaw_sin, yaw_cos) = (self.yaw + 90.0).to_radians().sin_cos(); + let (pitch_sin, pitch_cos) = (-self.pitch).to_radians().sin_cos(); + + Vec3::new(yaw_cos * pitch_cos, pitch_sin, yaw_sin * pitch_cos) + } + + /// Sets the yaw and pitch using a normalized direction vector. + pub fn set_vec(&mut self, dir: Vec3) { + debug_assert!( + dir.is_normalized(), + "the direction vector should be normalized" + ); + + // Preserve the current yaw if we're looking straight up or down. + if dir.x != 0.0 || dir.z != 0.0 { + self.yaw = f32::atan2(dir.z, dir.x).to_degrees() - 90.0; + } + + self.pitch = -(dir.y).asin().to_degrees(); + } +} + +#[derive(Component, Copy, Clone, PartialEq, Eq, Default, Debug, Deref, DerefMut)] +pub struct OnGround(pub bool); + +/// A Minecraft entity's ID according to the protocol. +/// +/// IDs should be _unique_ for the duration of the server and _constant_ for +/// the lifetime of the entity. IDs of -1 (the default) will be assigned to +/// something else on the tick the entity is added. If you need to know the ID +/// ahead of time, set this component to the value returned by +/// [`EntityManager::next_id`] before spawning. +#[derive(Component, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Deref)] +pub struct EntityId(i32); + +impl EntityId { + /// Returns the underlying entity ID as an integer. + pub fn get(self) -> i32 { + self.0 + } +} + +/// Returns an entity ID of -1. +impl Default for EntityId { + fn default() -> Self { + Self(-1) + } +} + +#[derive(Component, Copy, Clone, PartialEq, Default, Debug, Deref, DerefMut)] +pub struct HeadYaw(pub f32); + +/// Entity velocity in m/s. +#[derive(Component, Copy, Clone, Default, Debug, Deref, DerefMut)] +pub struct Velocity(pub Vec3); + +impl Velocity { + pub fn to_packet_units(self) -> valence_protocol::Velocity { + valence_protocol::Velocity::from_ms_f32(self.0.into()) + } +} + +// TODO: don't make statuses and animations components. + +#[derive(Component, Copy, Clone, Default, Debug, Deref, DerefMut)] +pub struct EntityStatuses(pub u64); + +impl EntityStatuses { + pub fn trigger(&mut self, status: EntityStatus) { + self.set(status, true); + } + + pub fn set(&mut self, status: EntityStatus, triggered: bool) { + self.0 |= (triggered as u64) << status as u64; + } + + pub fn get(&self, status: EntityStatus) -> bool { + (self.0 >> status as u64) & 1 == 1 + } +} + +#[derive(Component, Default, Debug, Copy, Clone, Deref, DerefMut)] +pub struct EntityAnimations(pub u8); + +impl EntityAnimations { + pub fn trigger(&mut self, anim: EntityAnimation) { + self.set(anim, true); + } + + pub fn set(&mut self, anim: EntityAnimation, triggered: bool) { + self.0 |= (triggered as u8) << anim as u8; + } + + pub fn get(&self, anim: EntityAnimation) -> bool { + (self.0 >> anim as u8) & 1 == 1 + } +} + +/// Extra integer data passed to the entity spawn packet. The meaning depends on +/// the type of entity being spawned. +/// +/// Some examples: +/// - **Experience Orb**: Experience count +/// - **(Glowing) Item Frame**: Rotation +/// - **Painting**: Rotation +/// - **Falling Block**: Block state +/// - **Fishing Bobber**: Hook entity ID +/// - **Warden**: Initial pose +#[derive(Component, Default, Debug, Deref, DerefMut)] +pub struct ObjectData(pub i32); + +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, DecodeBytesAuto)] +pub struct VillagerData { + pub kind: VillagerKind, + pub profession: VillagerProfession, + pub level: i32, +} + +impl VillagerData { + pub const fn new(kind: VillagerKind, profession: VillagerProfession, level: i32) -> Self { + Self { + kind, + profession, + level, + } + } +} + +impl Default for VillagerData { + fn default() -> Self { + Self { + kind: Default::default(), + profession: Default::default(), + level: 1, + } + } +} + +impl Encode for VillagerData { + fn encode(&self, mut w: impl std::io::Write) -> anyhow::Result<()> { + self.kind.encode(&mut w)?; + self.profession.encode(&mut w)?; + VarInt(self.level).encode(w) + } +} + +impl Decode for VillagerData { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(Self { + kind: VillagerKind::decode(r)?, + profession: VillagerProfession::decode(r)?, + level: VarInt::decode(r)?.0, + }) + } +} + +#[derive( + Clone, + Copy, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + Default, + Debug, + Encode, + Decode, + DecodeBytesAuto, +)] +pub enum VillagerKind { + Desert, + Jungle, + #[default] + Plains, + Savanna, + Snow, + Swamp, + Taiga, +} + +#[derive( + Clone, + Copy, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + Default, + Debug, + Encode, + Decode, + DecodeBytesAuto, +)] +pub enum VillagerProfession { + #[default] + None, + Armorer, + Butcher, + Cartographer, + Cleric, + Farmer, + Fisherman, + Fletcher, + Leatherworker, + Librarian, + Mason, + Nitwit, + Shepherd, + Toolsmith, + Weaponsmith, +} + +#[derive( + Clone, + Copy, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + Default, + Debug, + Encode, + Decode, + DecodeBytesAuto, +)] +pub enum Pose { + #[default] + Standing, + FallFlying, + Sleeping, + Swimming, + SpinAttack, + Sneaking, + LongJumping, + Dying, + Croaking, + UsingTongue, + Roaring, + Sniffing, + Emerging, + Digging, +} + +#[derive( + Clone, + Copy, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + Default, + Debug, + Encode, + Decode, + DecodeBytesAuto, +)] +pub enum BoatKind { + #[default] + Oak, + Spruce, + Birch, + Jungle, + Acacia, + DarkOak, +} + +#[derive( + Clone, + Copy, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + Default, + Debug, + Encode, + Decode, + DecodeBytesAuto, +)] +pub enum CatKind { + Tabby, + #[default] + Black, + Red, + Siamese, + BritishShorthair, + Calico, + Persian, + Ragdoll, + White, + Jellie, + AllBlack, +} + +#[derive( + Clone, + Copy, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + Default, + Debug, + Encode, + Decode, + DecodeBytesAuto, +)] +pub enum FrogKind { + #[default] + Temperate, + Warm, + Cold, +} + +#[derive( + Clone, + Copy, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + Default, + Debug, + Encode, + Decode, + DecodeBytesAuto, +)] +pub enum PaintingKind { + #[default] + Kebab, + Aztec, + Alban, + Aztec2, + Bomb, + Plant, + Wasteland, + Pool, + Courbet, + Sea, + Sunset, + Creebet, + Wanderer, + Graham, + Match, + Bust, + Stage, + Void, + SkullAndRoses, + Wither, + Fighters, + Pointer, + Pigscene, + BurningSkull, + Skeleton, + Earth, + Wind, + Water, + Fire, + DonkeyKong, +} + +#[derive( + Copy, + Clone, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + Default, + Debug, + Encode, + Decode, + DecodeBytesAuto, +)] +pub enum SnifferState { + #[default] + Idling, + FeelingHappy, + Scenting, + Sniffing, + Searching, + Digging, + Rising, +} + +#[derive(Clone, Copy, PartialEq, PartialOrd, Debug, Encode, Decode, DecodeBytesAuto)] +pub struct EulerAngle { + pub pitch: f32, + pub yaw: f32, + pub roll: f32, +} + +#[derive(Copy, Clone, DecodeBytesAuto)] +struct OptionalInt(Option); + +impl Encode for OptionalInt { + fn encode(&self, w: impl std::io::Write) -> anyhow::Result<()> { + if let Some(n) = self.0 { + VarInt(n.wrapping_add(1)) + } else { + VarInt(0) + } + .encode(w) + } +} + +impl Decode for OptionalInt { + fn decode(r: &mut &[u8]) -> anyhow::Result { + let n = VarInt::decode(r)?.0; + + Ok(Self(if n == 0 { + None + } else { + Some(n.wrapping_sub(1)) + })) + } +} diff --git a/vendor/valence/crates/valence_entity/src/manager.rs b/vendor/valence/crates/valence_entity/src/manager.rs new file mode 100644 index 00000000..c79cd62c --- /dev/null +++ b/vendor/valence/crates/valence_entity/src/manager.rs @@ -0,0 +1,45 @@ +use std::num::Wrapping; + +use bevy_ecs::prelude::*; +use rustc_hash::FxHashMap; +use tracing::warn; + +use super::EntityId; + +/// A [`Resource`] which maintains information about all spawned Minecraft +/// entities. +#[derive(Resource, Debug)] +pub struct EntityManager { + /// Maps protocol IDs to ECS entities. + pub(super) id_to_entity: FxHashMap, + next_id: Wrapping, +} + +impl EntityManager { + pub(super) fn new() -> Self { + Self { + id_to_entity: FxHashMap::default(), + next_id: Wrapping(1), // Skip 0. + } + } + + /// Returns the next unique entity ID and increments the counter. + pub fn next_id(&mut self) -> EntityId { + if self.next_id.0 == 0 { + warn!("entity ID overflow!"); + // ID 0 is reserved for clients, so skip over it. + self.next_id.0 = 1; + } + + let id = EntityId(self.next_id.0); + + self.next_id += 1; + + id + } + + /// Gets the entity with the given entity ID. + pub fn get_by_id(&self, entity_id: i32) -> Option { + self.id_to_entity.get(&entity_id).cloned() + } +} diff --git a/vendor/valence/crates/valence_entity/src/query.rs b/vendor/valence/crates/valence_entity/src/query.rs new file mode 100644 index 00000000..081ef1ec --- /dev/null +++ b/vendor/valence/crates/valence_entity/src/query.rs @@ -0,0 +1,209 @@ +use std::mem; + +use bevy_ecs::prelude::DetectChanges; +use bevy_ecs::query::WorldQuery; +use bevy_ecs::world::Ref; +use valence_math::DVec3; +use valence_protocol::encode::WritePacket; +use valence_protocol::packets::play::{ + EntityAnimationS2c, EntityAttributesS2c, EntityPositionS2c, EntitySetHeadYawS2c, + EntitySpawnS2c, EntityStatusS2c, EntityVelocityUpdateS2c, ExperienceOrbSpawnS2c, + MoveRelativeS2c, PlayerSpawnS2c, RotateAndMoveRelativeS2c, RotateS2c, +}; +use valence_protocol::var_int::VarInt; +use valence_protocol::ByteAngle; +use valence_server_common::UniqueId; + +use crate::attributes::TrackedEntityAttributes; +use crate::tracked_data::TrackedData; +use crate::{ + EntityAnimations, EntityId, EntityKind, EntityLayerId, EntityStatuses, HeadYaw, Look, + ObjectData, OldEntityLayerId, OldPosition, OnGround, Position, Velocity, +}; + +#[derive(WorldQuery)] +pub struct EntityInitQuery { + pub entity_id: &'static EntityId, + pub uuid: &'static UniqueId, + pub kind: &'static EntityKind, + pub look: &'static Look, + pub head_yaw: &'static HeadYaw, + pub on_ground: &'static OnGround, + pub object_data: &'static ObjectData, + pub velocity: &'static Velocity, + pub tracked_data: &'static TrackedData, +} + +impl EntityInitQueryItem<'_> { + /// Writes the appropriate packets to initialize an entity. This will spawn + /// the entity and initialize tracked data. `pos` is the initial position of + /// the entity. + pub fn write_init_packets(&self, pos: DVec3, mut writer: impl WritePacket) { + match *self.kind { + EntityKind::MARKER => {} + EntityKind::EXPERIENCE_ORB => { + writer.write_packet(&ExperienceOrbSpawnS2c { + entity_id: self.entity_id.get().into(), + position: pos, + count: self.object_data.0 as i16, + }); + } + EntityKind::PLAYER => { + writer.write_packet(&PlayerSpawnS2c { + entity_id: self.entity_id.get().into(), + player_uuid: self.uuid.0, + position: pos, + yaw: ByteAngle::from_degrees(self.look.yaw), + pitch: ByteAngle::from_degrees(self.look.pitch), + }); + + // Player spawn packet doesn't include head yaw for some reason. + writer.write_packet(&EntitySetHeadYawS2c { + entity_id: self.entity_id.get().into(), + head_yaw: ByteAngle::from_degrees(self.head_yaw.0), + }); + } + _ => writer.write_packet(&EntitySpawnS2c { + entity_id: self.entity_id.get().into(), + object_uuid: self.uuid.0, + kind: self.kind.get().into(), + position: pos, + pitch: ByteAngle::from_degrees(self.look.pitch), + yaw: ByteAngle::from_degrees(self.look.yaw), + head_yaw: ByteAngle::from_degrees(self.head_yaw.0), + data: self.object_data.0.into(), + velocity: self.velocity.to_packet_units(), + }), + } + + if let Some(_init_data) = self.tracked_data.init_data() { + todo!() + // writer.write_packet(&EntityTrackerUpdateS2c { + // entity_id: self.entity_id.get().into(), + // tracked_values: init_data.into(), + // }); + } + } +} + +#[derive(WorldQuery)] +pub struct UpdateEntityQuery { + pub id: &'static EntityId, + pub pos: &'static Position, + pub old_pos: &'static OldPosition, + pub loc: &'static EntityLayerId, + pub old_loc: &'static OldEntityLayerId, + pub look: Ref<'static, Look>, + pub head_yaw: Ref<'static, HeadYaw>, + pub on_ground: &'static OnGround, + pub velocity: Ref<'static, Velocity>, + pub tracked_data: &'static TrackedData, + pub statuses: &'static EntityStatuses, + pub animations: &'static EntityAnimations, + // Option because not all entities have attributes, only LivingEntity. + pub tracked_attributes: Option<&'static TrackedEntityAttributes>, +} + +impl UpdateEntityQueryItem<'_> { + pub fn write_update_packets(&self, mut writer: impl WritePacket) { + // TODO: @RJ I saw you're using UpdateEntityPosition and UpdateEntityRotation sometimes. These two packets are actually broken on the client and will erase previous position/rotation https://bugs.mojang.com/browse/MC-255263 -Moulberry + + let entity_id = VarInt(self.id.get()); + + let position_delta = self.pos.0 - self.old_pos.get(); + let needs_teleport = position_delta.abs().max_element() >= 8.0; + let changed_position = self.pos.0 != self.old_pos.get(); + + if changed_position && !needs_teleport && self.look.is_changed() { + writer.write_packet(&RotateAndMoveRelativeS2c { + entity_id, + delta: (position_delta * 4096.0).to_array().map(|v| v as i16), + yaw: ByteAngle::from_degrees(self.look.yaw), + pitch: ByteAngle::from_degrees(self.look.pitch), + on_ground: self.on_ground.0, + }); + } else { + if changed_position && !needs_teleport { + writer.write_packet(&MoveRelativeS2c { + entity_id, + delta: (position_delta * 4096.0).to_array().map(|v| v as i16), + on_ground: self.on_ground.0, + }); + } + + if self.look.is_changed() { + writer.write_packet(&RotateS2c { + entity_id, + yaw: ByteAngle::from_degrees(self.look.yaw), + pitch: ByteAngle::from_degrees(self.look.pitch), + on_ground: self.on_ground.0, + }); + } + } + + if needs_teleport { + writer.write_packet(&EntityPositionS2c { + entity_id, + position: self.pos.0, + yaw: ByteAngle::from_degrees(self.look.yaw), + pitch: ByteAngle::from_degrees(self.look.pitch), + on_ground: self.on_ground.0, + }); + } + + if self.velocity.is_changed() { + writer.write_packet(&EntityVelocityUpdateS2c { + entity_id, + velocity: self.velocity.to_packet_units(), + }); + } + + if self.head_yaw.is_changed() { + writer.write_packet(&EntitySetHeadYawS2c { + entity_id, + head_yaw: ByteAngle::from_degrees(self.head_yaw.0), + }); + } + + if let Some(_update_data) = self.tracked_data.update_data() { + todo!(); + // writer.write_packet(&EntityTrackerUpdateS2c { + // entity_id, + // tracked_values: update_data.into(), + // }); + } + + if self.statuses.0 != 0 { + for i in 0..mem::size_of_val(self.statuses) { + if (self.statuses.0 >> i) & 1 == 1 { + writer.write_packet(&EntityStatusS2c { + entity_id: entity_id.0, + entity_status: i as u8, + }); + } + } + } + + if self.animations.0 != 0 { + for i in 0..mem::size_of_val(self.animations) { + if (self.animations.0 >> i) & 1 == 1 { + writer.write_packet(&EntityAnimationS2c { + entity_id, + animation: i as u8, + }); + } + } + } + + if let Some(attributes) = self.tracked_attributes { + let properties = attributes.get_properties(); + + if !properties.is_empty() { + writer.write_packet(&EntityAttributesS2c { + entity_id, + properties, + }); + } + } + } +} diff --git a/vendor/valence/crates/valence_entity/src/tracked_data.rs b/vendor/valence/crates/valence_entity/src/tracked_data.rs new file mode 100644 index 00000000..bbdb8492 --- /dev/null +++ b/vendor/valence/crates/valence_entity/src/tracked_data.rs @@ -0,0 +1,136 @@ +use bevy_ecs::prelude::*; +use tracing::warn; +use valence_protocol::Encode; + +/// Cache for all the tracked data of an entity. Used for the +/// [`EntityTrackerUpdateS2c`][packet] packet. +/// +/// [packet]: valence_protocol::packets::play::EntityTrackerUpdateS2c +#[derive(Component, Default, Debug)] +pub struct TrackedData { + init_data: Vec, + /// A map of tracked data indices to the byte length of the entry in + /// `init_data`. + init_entries: Vec<(u8, u32)>, + update_data: Vec, +} + +impl TrackedData { + /// Returns initial tracked data for the entity, ready to be sent in the + /// [`EntityTrackerUpdateS2c`][packet] packet. This is used when the entity + /// enters the view of a client. + /// + /// [packet]: valence_protocol::packets::play::EntityTrackerUpdateS2c + pub fn init_data(&self) -> Option<&[u8]> { + if self.init_data.len() > 1 { + Some(&self.init_data) + } else { + None + } + } + + /// Contains updated tracked data for the entity, ready to be sent in the + /// [`EntityTrackerUpdateS2c`][packet] packet. This is used when tracked + /// data is changed and the client is already in view of the entity. + /// + /// [packet]: valence_protocol::packets::play::EntityTrackerUpdateS2c + pub fn update_data(&self) -> Option<&[u8]> { + if self.update_data.len() > 1 { + Some(&self.update_data) + } else { + None + } + } + + pub fn insert_init_value(&mut self, index: u8, type_id: u8, value: impl Encode) { + debug_assert!( + index != 0xff, + "index of 0xff is reserved for the terminator" + ); + + self.remove_init_value(index); + + self.init_data.pop(); // Remove terminator. + + // Append the new value to the end. + let len_before = self.init_data.len(); + + self.init_data.extend_from_slice(&[index, type_id]); + if let Err(e) = value.encode(&mut self.init_data) { + warn!("failed to encode initial tracked data: {e:#}"); + } + + let len = self.init_data.len() - len_before; + + self.init_entries.push((index, len as u32)); + + self.init_data.push(0xff); // Add terminator. + } + + pub fn remove_init_value(&mut self, index: u8) -> bool { + let mut start = 0; + + for (pos, &(idx, len)) in self.init_entries.iter().enumerate() { + if idx == index { + let end = start + len as usize; + + self.init_data.drain(start..end); + self.init_entries.remove(pos); + + return true; + } + + start += len as usize; + } + + false + } + + pub fn append_update_value(&mut self, index: u8, type_id: u8, value: impl Encode) { + debug_assert!( + index != 0xff, + "index of 0xff is reserved for the terminator" + ); + + self.update_data.pop(); // Remove terminator. + + self.update_data.extend_from_slice(&[index, type_id]); + if let Err(e) = value.encode(&mut self.update_data) { + warn!("failed to encode updated tracked data: {e:#}"); + } + + self.update_data.push(0xff); // Add terminator. + } + + pub fn clear_update_values(&mut self) { + self.update_data.clear(); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn insert_remove_init_tracked_data() { + let mut td = TrackedData::default(); + + td.insert_init_value(0, 3, "foo"); + td.insert_init_value(10, 6, "bar"); + td.insert_init_value(5, 9, "baz"); + + assert!(td.remove_init_value(10)); + assert!(!td.remove_init_value(10)); + + // Insertion overwrites value at index 0. + td.insert_init_value(0, 64, "quux"); + + assert!(td.remove_init_value(0)); + assert!(td.remove_init_value(5)); + + assert!(td.init_data.as_slice().is_empty() || td.init_data.as_slice() == [0xff]); + assert!(td.init_data().is_none()); + + assert!(td.update_data.is_empty()); + } +} diff --git a/vendor/valence/crates/valence_generated/Cargo.toml b/vendor/valence/crates/valence_generated/Cargo.toml new file mode 100644 index 00000000..86fb6493 --- /dev/null +++ b/vendor/valence/crates/valence_generated/Cargo.toml @@ -0,0 +1,24 @@ +[package] +name = "valence_generated" +description = "Generated code for valence and valence_protocol" +readme = "README.md" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true +build = "build/main.rs" + +[dependencies] +valence_math.workspace = true +valence_ident.workspace = true +uuid.workspace = true + +[build-dependencies] +anyhow.workspace = true +heck.workspace = true +proc-macro2.workspace = true +quote.workspace = true +serde = { workspace = true, features = ["derive"] } +serde_json.workspace = true +valence_build_utils.workspace = true diff --git a/vendor/valence/crates/valence_generated/README.md b/vendor/valence/crates/valence_generated/README.md new file mode 100644 index 00000000..741c9354 --- /dev/null +++ b/vendor/valence/crates/valence_generated/README.md @@ -0,0 +1,4 @@ +# valence_generated + +Contains the majority of Valence's generated Rust code for use with Minecraft's protocol and entity data. +This is currently meant to be an implementation detail of `valence_protocol` and `valence_entity`. diff --git a/vendor/valence/crates/valence_generated/build/attributes.rs b/vendor/valence/crates/valence_generated/build/attributes.rs new file mode 100644 index 00000000..4879d195 --- /dev/null +++ b/vendor/valence/crates/valence_generated/build/attributes.rs @@ -0,0 +1,170 @@ +use std::collections::BTreeMap; + +use heck::ToPascalCase; +use proc_macro2::TokenStream; +use quote::quote; +use serde::Deserialize; +use valence_build_utils::{ident, rerun_if_changed}; + +#[derive(Deserialize)] +struct EntityAttribute { + id: u8, + default_value: f64, + translation_key: String, + tracked: bool, + min_value: f64, + max_value: f64, +} + +pub fn build() -> anyhow::Result { + rerun_if_changed(["extracted/attributes.json"]); + + let entity_attributes: BTreeMap = + serde_json::from_str(include_str!("../extracted/attributes.json"))?; + + let mut entity_attribute_enum = TokenStream::new(); + let mut entity_attribute_get_id = TokenStream::new(); + let mut entity_attribute_from_id = TokenStream::new(); + let mut entity_attribute_name = TokenStream::new(); + let mut entity_attribute_default_value = TokenStream::new(); + let mut entity_attribute_translation_key = TokenStream::new(); + let mut entity_attribute_tracked = TokenStream::new(); + let mut entity_attribute_min_value = TokenStream::new(); + let mut entity_attribute_max_value = TokenStream::new(); + + for (name, attribute) in entity_attributes { + let key = ident(name.to_pascal_case()); + let id = attribute.id; + let default_value = attribute.default_value; + let translation_key = attribute.translation_key; + let tracked = attribute.tracked; + let min_value = attribute.min_value; + let max_value = attribute.max_value; + + entity_attribute_enum.extend([quote! { + #key, + }]); + + entity_attribute_get_id.extend([quote! { + EntityAttribute::#key => #id, + }]); + + entity_attribute_from_id.extend([quote! { + #id => Some(EntityAttribute::#key), + }]); + + entity_attribute_name.extend([quote! { + EntityAttribute::#key => #name, + }]); + + entity_attribute_default_value.extend([quote! { + EntityAttribute::#key => #default_value, + }]); + + entity_attribute_translation_key.extend([quote! { + EntityAttribute::#key => #translation_key, + }]); + + entity_attribute_tracked.extend([quote! { + EntityAttribute::#key => #tracked, + }]); + + entity_attribute_min_value.extend([quote! { + EntityAttribute::#key => #min_value, + }]); + + entity_attribute_max_value.extend([quote! { + EntityAttribute::#key => #max_value, + }]); + } + + Ok(quote!( + /// An attribute modifier operation. + #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] + pub enum EntityAttributeOperation { + /// Adds the modifier to the base value. + Add, + /// Multiplies the modifier with the base value. + MultiplyBase, + /// Multiplies the modifier with the total value. + MultiplyTotal, + } + + impl EntityAttributeOperation { + /// Converts from a raw [`u8`]. + pub fn from_raw(raw: u8) -> Option { + match raw { + 0 => Some(Self::Add), + 1 => Some(Self::MultiplyBase), + 2 => Some(Self::MultiplyTotal), + _ => None, + } + } + + /// Converts to a raw [`u8`]. + pub fn to_raw(self) -> u8 { + match self { + Self::Add => 0, + Self::MultiplyBase => 1, + Self::MultiplyTotal => 2, + } + } + } + + #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)] + pub enum EntityAttribute { + #entity_attribute_enum + } + + impl EntityAttribute { + pub fn get_id(self) -> u8 { + match self { + #entity_attribute_get_id + } + } + + pub fn from_id(id: u8) -> Option { + match id { + #entity_attribute_from_id + _ => None, + } + } + + pub fn name(self) -> &'static str { + match self { + #entity_attribute_name + } + } + + pub fn default_value(self) -> f64 { + match self { + #entity_attribute_default_value + } + } + + pub fn translation_key(self) -> &'static str { + match self { + #entity_attribute_translation_key + } + } + + pub fn tracked(self) -> bool { + match self { + #entity_attribute_tracked + } + } + + pub fn min_value(self) -> f64 { + match self { + #entity_attribute_min_value + } + } + + pub fn max_value(self) -> f64 { + match self { + #entity_attribute_max_value + } + } + } + )) +} diff --git a/vendor/valence/crates/valence_generated/build/block.rs b/vendor/valence/crates/valence_generated/build/block.rs new file mode 100644 index 00000000..43a22f7c --- /dev/null +++ b/vendor/valence/crates/valence_generated/build/block.rs @@ -0,0 +1,1064 @@ +use std::collections::BTreeSet; + +use heck::{ToPascalCase, ToShoutySnakeCase}; +use proc_macro2::TokenStream; +use quote::{quote, ToTokens}; +use serde::Deserialize; +use valence_build_utils::{ident, rerun_if_changed}; + +#[derive(Deserialize, Clone, Debug)] +struct TopLevel { + blocks: Vec, + shapes: Vec, + block_entity_types: Vec, +} + +#[derive(Deserialize, Clone, Debug)] +struct Block { + id: u16, + item_id: u16, + wall_variant_id: Option, + translation_key: String, + name: String, + properties: Vec, + default_state_id: u16, + states: Vec, + hardness: f32, + blast_resistance: f32, + slipperiness: f32, + speed_factor: f32, + jump_factor: f32, +} + +impl Block { + pub fn min_state_id(&self) -> u16 { + self.states.iter().map(|s| s.id).min().unwrap() + } + + pub fn max_state_id(&self) -> u16 { + self.states.iter().map(|s| s.id).max().unwrap() + } +} + +#[derive(Deserialize, Clone, Debug)] +struct BlockEntityKind { + id: u32, + ident: String, + name: String, +} + +#[derive(Deserialize, Clone, Debug)] +struct Property { + name: String, + values: Vec, +} + +#[derive(Deserialize, Clone, Debug)] +struct State { + id: u16, + luminance: u8, + opaque: bool, + replaceable: bool, + blocks_motion: bool, + collision_shapes: Vec, + block_entity_type: Option, +} + +#[derive(Deserialize, Clone, Debug)] +struct Shape { + min_x: f64, + min_y: f64, + min_z: f64, + max_x: f64, + max_y: f64, + max_z: f64, +} + +pub fn build() -> anyhow::Result { + rerun_if_changed(["extracted/blocks.json"]); + + let TopLevel { + blocks, + shapes, + block_entity_types, + } = serde_json::from_str(include_str!("../extracted/blocks.json"))?; + + let max_state_id = blocks.iter().map(|b| b.max_state_id()).max().unwrap(); + + let kind_to_translation_key_arms = blocks + .iter() + .map(|b| { + let kind = ident(b.name.to_pascal_case()); + let translation_key = &b.translation_key; + quote! { + Self::#kind => #translation_key, + } + }) + .collect::(); + + let state_to_kind_arms = blocks + .iter() + .map(|b| { + let name = ident(b.name.to_pascal_case()); + let mut token_stream = TokenStream::new(); + + let min_id = b.min_state_id(); + let max_id = b.max_state_id(); + + if min_id == max_id { + quote!(#min_id).to_tokens(&mut token_stream); + } else { + for id in min_id..max_id { + quote!(#id | ).to_tokens(&mut token_stream); + } + quote!(#max_id).to_tokens(&mut token_stream); + } + quote!(=> BlockKind::#name,).to_tokens(&mut token_stream); + token_stream + }) + .collect::(); + + let state_to_luminance_arms = blocks + .iter() + .flat_map(|b| { + b.states.iter().filter(|s| s.luminance != 0).map(|s| { + let id = s.id; + let luminance = s.luminance; + quote! { + #id => #luminance, + } + }) + }) + .collect::(); + + let state_to_opaque_arms = blocks + .iter() + .flat_map(|b| { + b.states.iter().filter(|s| !s.opaque).map(|s| { + let id = s.id; + quote! { + #id => false, + } + }) + }) + .collect::(); + + let state_to_replaceable_arms = blocks + .iter() + .flat_map(|b| { + b.states.iter().filter(|s| s.replaceable).map(|s| { + let id = s.id; + quote! { + #id => true, + } + }) + }) + .collect::(); + + let state_to_blocks_motion_arms = blocks + .iter() + .flat_map(|b| { + b.states.iter().filter(|s| s.blocks_motion).map(|s| { + let id = s.id; + quote! { + #id => true, + } + }) + }) + .collect::(); + + let shapes = shapes.iter().map(|s| { + let min_x = s.min_x; + let min_y = s.min_y; + let min_z = s.min_z; + let max_x = s.max_x; + let max_y = s.max_y; + let max_z = s.max_z; + quote! { + Aabb::new_unchecked( + DVec3::new(#min_x, #min_y, #min_z), + DVec3::new(#max_x, #max_y, #max_z), + ) + } + }); + + let shape_count = shapes.len(); + + let state_to_collision_shapes_arms = blocks + .iter() + .flat_map(|b| { + b.states.iter().map(|s| { + let id = s.id; + let collision_shapes = &s.collision_shapes; + quote! { + #id => &[#(#collision_shapes),*], + } + }) + }) + .collect::(); + + let get_arms = blocks + .iter() + .filter(|&b| !b.properties.is_empty()) + .map(|b| { + let block_kind_name = ident(b.name.to_pascal_case()); + + let arms = b + .properties + .iter() + .map(|p| { + let prop_name = ident(p.name.to_pascal_case()); + let min_state_id = b.min_state_id(); + let product: u16 = b + .properties + .iter() + .rev() + .take_while(|&other| p.name != other.name) + .map(|p| p.values.len() as u16) + .product(); + + let values_count = p.values.len() as u16; + + let arms = p.values.iter().enumerate().map(|(i, v)| { + let value_idx = i as u16; + let value_name = ident(v.to_pascal_case()); + quote! { + #value_idx => Some(PropValue::#value_name), + } + }).collect::(); + + quote! { + PropName::#prop_name => match (self.0 - #min_state_id) / #product % #values_count { + #arms + _ => unreachable!(), + }, + } + }) + .collect::(); + + quote! { + BlockKind::#block_kind_name => match name { + #arms + _ => None, + }, + } + }) + .collect::(); + + let set_arms = blocks + .iter() + .filter(|&b| !b.properties.is_empty()) + .map(|b| { + let block_kind_name = ident(b.name.to_pascal_case()); + + let arms = b + .properties + .iter() + .map(|p| { + let prop_name = ident(p.name.to_pascal_case()); + let min_state_id = b.min_state_id(); + let product: u16 = b + .properties + .iter() + .rev() + .take_while(|&other| p.name != other.name) + .map(|p| p.values.len() as u16) + .product(); + + let values_count = p.values.len() as u16; + + let arms = p + .values + .iter() + .enumerate() + .map(|(i, v)| { + let val_idx = i as u16; + let val_name = ident(v.to_pascal_case()); + quote! { + PropValue::#val_name => + Self(self.0 - (self.0 - #min_state_id) / #product % #values_count * #product + + #val_idx * #product), + } + }) + .collect::(); + + quote! { + PropName::#prop_name => match val { + #arms + _ => self, + }, + } + }) + .collect::(); + + quote! { + BlockKind::#block_kind_name => match name { + #arms + _ => self, + }, + } + }) + .collect::(); + + let default_block_states = blocks + .iter() + .map(|b| { + let name = ident(b.name.to_shouty_snake_case()); + let state = b.default_state_id; + let doc = format!("The default block state for `{}`.", b.name); + quote! { + #[doc = #doc] + pub const #name: BlockState = BlockState(#state); + } + }) + .collect::(); + + let state_to_wall_variant_arms = blocks + .iter() + .filter(|b| b.wall_variant_id.is_some()) + .map(|b| { + let block_name = ident(b.name.to_shouty_snake_case()); + let wall_block_name = ident( + blocks[b.wall_variant_id.unwrap() as usize] + .name + .to_shouty_snake_case(), + ); + quote! { + BlockState::#block_name => Some(BlockState::#wall_block_name), + } + }) + .collect::(); + + let state_to_block_entity_type_arms = blocks + .iter() + .flat_map(|b| { + b.states.iter().filter_map(|s| { + let id = s.id; + let block_entity_type = s.block_entity_type?; + Some(quote! { + #id => Some(#block_entity_type), + }) + }) + }) + .collect::(); + + let kind_to_state_arms = blocks + .iter() + .map(|b| { + let kind = ident(b.name.to_pascal_case()); + let state = ident(b.name.to_shouty_snake_case()); + quote! { + BlockKind::#kind => BlockState::#state, + } + }) + .collect::(); + + let block_kind_variants = blocks + .iter() + .map(|b| ident(b.name.to_pascal_case())) + .collect::>(); + + let block_kind_from_str_arms = blocks + .iter() + .map(|b| { + let name = &b.name; + let name_ident = ident(name.to_pascal_case()); + quote! { + #name => Some(BlockKind::#name_ident), + } + }) + .collect::(); + + let block_kind_to_str_arms = blocks + .iter() + .map(|b| { + let name = &b.name; + let name_ident = ident(name.to_pascal_case()); + quote! { + BlockKind::#name_ident => #name, + } + }) + .collect::(); + + let block_kind_props_arms = blocks + .iter() + .filter(|&b| !b.properties.is_empty()) + .map(|b| { + let name = ident(b.name.to_pascal_case()); + let prop_names = b.properties.iter().map(|p| ident(p.name.to_pascal_case())); + + quote! { + Self::#name => &[#(PropName::#prop_names,)*], + } + }) + .collect::(); + + let block_kind_to_item_kind_arms = blocks + .iter() + .map(|block| { + let name = ident(block.name.to_pascal_case()); + let item_id = block.item_id; + + quote! { + BlockKind::#name => #item_id, + } + }) + .collect::(); + + let block_kind_from_item_kind_arms = blocks + .iter() + .filter(|block| block.item_id != 0) + .map(|block| { + let name = ident(block.name.to_pascal_case()); + let item_id = block.item_id; + + quote! { + #item_id => Some(BlockKind::#name), + } + }) + .collect::(); + + let block_kind_to_hardness_arms = blocks + .iter() + .map(|block| { + let name = ident(block.name.to_pascal_case()); + let hardness = block.hardness; + + quote! { + BlockKind::#name => #hardness, + } + }) + .collect::(); + + let block_kind_to_blast_resistance_arms = blocks + .iter() + .map(|block| { + let name = ident(block.name.to_pascal_case()); + let blast_resistance = block.blast_resistance; + + quote! { + BlockKind::#name => #blast_resistance, + } + }) + .collect::(); + + let block_kind_to_slipperiness_arms = blocks + .iter() + .map(|block| { + let name = ident(block.name.to_pascal_case()); + let slipperiness = block.slipperiness; + + quote! { + BlockKind::#name => #slipperiness, + } + }) + .collect::(); + + let block_kind_to_speed_factor_arms = blocks + .iter() + .map(|block| { + let name = ident(block.name.to_pascal_case()); + let speed_factor = block.speed_factor; + + quote! { + BlockKind::#name => #speed_factor, + } + }) + .collect::(); + + let block_kind_to_jump_factor_arms = blocks + .iter() + .map(|block| { + let name = ident(block.name.to_pascal_case()); + let jump_factor = block.jump_factor; + + quote! { + BlockKind::#name => #jump_factor, + } + }) + .collect::(); + + let block_kind_from_raw_arms = blocks + .iter() + .map(|block| { + let name = ident(block.name.to_pascal_case()); + let id = block.id; + + quote! { + #id => Some(BlockKind::#name), + } + }) + .collect::(); + + let block_entity_kind_variants = block_entity_types + .iter() + .map(|block_entity| { + let name = ident(block_entity.name.to_pascal_case()); + let doc = format!( + "The block entity type `{}` (ID {}).", + block_entity.name, block_entity.id + ); + quote! { + #[doc = #doc] + #name, + } + }) + .collect::(); + + let block_entity_kind_from_id_arms = block_entity_types + .iter() + .map(|block_entity| { + let id = block_entity.id; + let name = ident(block_entity.name.to_pascal_case()); + + quote! { + #id => Some(Self::#name), + } + }) + .collect::(); + + let block_entity_kind_to_id_arms = block_entity_types + .iter() + .map(|block_entity| { + let id = block_entity.id; + let name = ident(block_entity.name.to_pascal_case()); + + quote! { + Self::#name => #id, + } + }) + .collect::(); + + let block_entity_kind_from_ident_arms = block_entity_types + .iter() + .map(|block_entity| { + let name = ident(block_entity.name.to_pascal_case()); + let ident = &block_entity.ident; + + quote! { + #ident => Some(Self::#name), + } + }) + .collect::(); + + let block_entity_kind_to_ident_arms = block_entity_types + .iter() + .map(|block_entity| { + let name = ident(block_entity.name.to_pascal_case()); + let ident = &block_entity.ident; + + quote! { + Self::#name => ident!(#ident), + } + }) + .collect::(); + + let block_kind_count = blocks.len(); + + let prop_names = blocks + .iter() + .flat_map(|b| b.properties.iter().map(|p| p.name.as_str())) + .collect::>(); + + let prop_name_variants = prop_names + .iter() + .map(|&name| ident(name.to_pascal_case())) + .collect::>(); + + let prop_name_from_str_arms = prop_names + .iter() + .map(|&name| { + let ident = ident(name.to_pascal_case()); + quote! { + #name => Some(PropName::#ident), + } + }) + .collect::(); + + let prop_name_to_str_arms = prop_names + .iter() + .map(|&name| { + let ident = ident(name.to_pascal_case()); + quote! { + PropName::#ident => #name, + } + }) + .collect::(); + + let prop_name_count = prop_names.len(); + + let prop_values = blocks + .iter() + .flat_map(|b| b.properties.iter().flat_map(|p| &p.values)) + .map(|s| s.as_str()) + .collect::>(); + + let prop_value_variants = prop_values + .iter() + .map(|val| ident(val.to_pascal_case())) + .collect::>(); + + let prop_value_from_str_arms = prop_values + .iter() + .map(|val| { + let ident = ident(val.to_pascal_case()); + quote! { + #val => Some(PropValue::#ident), + } + }) + .collect::(); + + let prop_value_to_str_arms = prop_values + .iter() + .map(|val| { + let ident = ident(val.to_pascal_case()); + quote! { + PropValue::#ident => #val, + } + }) + .collect::(); + + let prop_value_from_u16_arms = prop_values + .iter() + .filter_map(|v| v.parse::().ok()) + .map(|n| { + let ident = ident(n.to_string()); + quote! { + #n => Some(PropValue::#ident), + } + }) + .collect::(); + + let prop_value_to_u16_arms = prop_values + .iter() + .filter_map(|v| v.parse::().ok()) + .map(|n| { + let ident = ident(n.to_string()); + quote! { + PropValue::#ident => Some(#n), + } + }) + .collect::(); + + let prop_value_count = prop_values.len(); + + Ok(quote! { + use valence_math::{Aabb, DVec3}; + + /// Represents the state of a block. This does not include block entity data such as + /// the text on a sign, the design on a banner, or the content of a spawner. + #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Default, Hash)] + pub struct BlockState(u16); + + impl BlockState { + /// Returns the default block state for a given block type. + pub const fn from_kind(kind: BlockKind) -> Self { + match kind { + #kind_to_state_arms + } + } + + /// Constructs a block state from a raw block state ID. + /// + /// If the given ID is invalid, `None` is returned. + pub const fn from_raw(id: u16) -> Option { + if id <= #max_state_id { + Some(Self(id)) + } else { + None + } + } + + /// Returns the [`BlockKind`] of this block state. + pub const fn to_kind(self) -> BlockKind { + match self.0 { + #state_to_kind_arms + _ => unreachable!(), + } + } + + /// Converts this block state to its underlying raw block state ID. + /// + /// The original block state can be recovered with [`BlockState::from_raw`]. + pub const fn to_raw(self) -> u16 { + self.0 + } + + /// Returns the maximum block state ID. + pub const fn max_raw() -> u16 { + #max_state_id + } + + /// Returns the wall variant of the block state. + /// + /// If the given block state doesn't have a wall variant, `None` is returned. + pub const fn wall_block_id(self) -> Option { + match self { + #state_to_wall_variant_arms + _ => None + } + } + + /// Gets the value of the property with the given name from this block. + /// + /// If this block does not have the property, then `None` is returned. + pub const fn get(self, name: PropName) -> Option { + match self.to_kind() { + #get_arms + _ => None + } + } + + /// Sets the value of a property on this block, returning the modified block. + /// + /// If this block does not have the given property or the property value is invalid, + /// then the original block is returned unchanged. + #[must_use] + pub const fn set(self, name: PropName, val: PropValue) -> Self { + match self.to_kind() { + #set_arms + _ => self, + } + } + + /// If this block is `air`, `cave_air` or `void_air`. + pub const fn is_air(self) -> bool { + matches!( + self, + BlockState::AIR | BlockState::CAVE_AIR | BlockState::VOID_AIR + ) + } + + // TODO: is_solid + + /// If this block is water or lava. + pub const fn is_liquid(self) -> bool { + matches!(self.to_kind(), BlockKind::Water | BlockKind::Lava) + } + + pub const fn is_opaque(self) -> bool { + match self.0 { + #state_to_opaque_arms + _ => true, + } + } + + pub const fn is_replaceable(self) -> bool { + match self.0 { + #state_to_replaceable_arms + _ => false, + } + } + + pub const fn blocks_motion(self) -> bool { + match self.0 { + #state_to_blocks_motion_arms + _ => false, + } + } + + const SHAPES: [Aabb; #shape_count] = [ + #(#shapes,)* + ]; + + pub fn collision_shapes(self) -> impl ExactSizeIterator + FusedIterator + Clone { + let shape_idxs: &'static [u16] = match self.0 { + #state_to_collision_shapes_arms + _ => &[], + }; + + shape_idxs.into_iter().map(|idx| Self::SHAPES[*idx as usize]) + } + + pub const fn luminance(self) -> u8 { + match self.0 { + #state_to_luminance_arms + _ => 0, + } + } + + pub const fn block_entity_kind(self) -> Option { + let kind = match self.0 { + #state_to_block_entity_type_arms + _ => None + }; + + match kind { + Some(id) => BlockEntityKind::from_id(id), + None => None, + } + } + + #default_block_states + } + + /// An enumeration of all block kinds. + #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] + pub enum BlockKind { + #(#block_kind_variants,)* + } + + impl BlockKind { + /// Construct a block kind from its snake_case name. + /// + /// Returns `None` if the name is invalid. + pub fn from_str(name: &str) -> Option { + match name { + #block_kind_from_str_arms + _ => None + } + } + + /// Get the snake_case name of this block kind. + pub const fn to_str(self) -> &'static str { + match self { + #block_kind_to_str_arms + } + } + + /// Returns the default block state for a given block kind. + pub const fn to_state(self) -> BlockState { + BlockState::from_kind(self) + } + + /// Returns a slice of all properties this block kind has. + pub const fn props(self) -> &'static [PropName] { + match self { + #block_kind_props_arms + _ => &[], + } + } + + pub const fn translation_key(self) -> &'static str { + match self { + #kind_to_translation_key_arms + } + } + + pub const fn hardness(self) -> f32 { + match self { + #block_kind_to_hardness_arms + } + } + + pub const fn blast_resistance(self) -> f32 { + match self { + #block_kind_to_blast_resistance_arms + } + } + + pub const fn slipperiness(self) -> f32 { + match self { + #block_kind_to_slipperiness_arms + } + } + + pub const fn speed_factor(self) -> f32 { + match self { + #block_kind_to_speed_factor_arms + } + } + + pub const fn jump_factor(self) -> f32 { + match self { + #block_kind_to_jump_factor_arms + } + } + + /// Converts a block kind to its corresponding item kind. + /// + /// [`ItemKind::Air`] is used to indicate the absence of an item. + pub const fn to_item_kind(self) -> ItemKind { + let id = match self { + #block_kind_to_item_kind_arms + }; + + // TODO: unwrap() is not const yet. + match ItemKind::from_raw(id) { + Some(k) => k, + None => unreachable!(), + } + } + + /// Constructs a block kind from an item kind. + /// + /// If the given item does not have a corresponding block, `None` is returned. + pub const fn from_item_kind(item: ItemKind) -> Option { + // The "default" blocks are ordered before the other variants. + // For instance, `torch` comes before `wall_torch` so this match + // should do the correct thing. + #[allow(unreachable_patterns)] + match item.to_raw() { + #block_kind_from_item_kind_arms + _ => None, + } + } + + /// Constructs a block kind from a raw block kind ID. + /// + /// If the given ID is invalid, `None` is returned. + pub const fn from_raw(id: u16) -> Option { + match id { + #block_kind_from_raw_arms + _ => None, + } + } + + /// Converts this block kind to its underlying raw block state ID. + /// + /// The original block kind can be recovered with [`BlockKind::from_raw`]. + pub const fn to_raw(self) -> u16 { + self as u16 + } + + /// An array of all block kinds. + pub const ALL: [Self; #block_kind_count] = [#(Self::#block_kind_variants,)*]; + } + + /// The default block kind is `air`. + impl Default for BlockKind { + fn default() -> Self { + Self::Air + } + } + + /// Contains all possible block state property names. + /// + /// For example, `waterlogged`, `facing`, and `half` are all property names. + #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] + pub enum PropName { + #(#prop_name_variants,)* + } + + impl PropName { + /// Construct a property name from its snake_case name. + /// + /// Returns `None` if the given name is not valid. + pub fn from_str(name: &str) -> Option { + // TODO: match on str in const fn. + match name { + #prop_name_from_str_arms + _ => None, + } + } + + /// Get the snake_case name of this property name. + pub const fn to_str(self) -> &'static str { + match self { + #prop_name_to_str_arms + } + } + + /// An array of all property names. + pub const ALL: [Self; #prop_name_count] = [#(Self::#prop_name_variants,)*]; + } + + /// Contains all possible values that a block property might have. + /// + /// For example, `upper`, `true`, and `2` are all property values. + #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] + pub enum PropValue { + #(#prop_value_variants,)* + } + + impl PropValue { + /// Construct a property value from its snake_case name. + /// + /// Returns `None` if the given name is not valid. + pub fn from_str(name: &str) -> Option { + match name { + #prop_value_from_str_arms + _ => None, + } + } + + /// Get the snake_case name of this property value. + pub const fn to_str(self) -> &'static str { + match self { + #prop_value_to_str_arms + } + } + + /// Converts a `u16` into a numeric property value. + /// Returns `None` if the given number does not have a + /// corresponding property value. + pub const fn from_u16(n: u16) -> Option { + match n { + #prop_value_from_u16_arms + _ => None, + } + } + + /// Converts this property value into a `u16` if it is numeric. + /// Returns `None` otherwise. + pub const fn to_u16(self) -> Option { + match self { + #prop_value_to_u16_arms + _ => None, + } + } + + /// Converts a `bool` to a `True` or `False` property value. + pub const fn from_bool(b: bool) -> Self { + if b { + Self::True + } else { + Self::False + } + } + + /// Converts a `True` or `False` property value to a `bool`. + /// + /// Returns `None` if this property value is not `True` or `False` + pub const fn to_bool(self) -> Option { + match self { + Self::True => Some(true), + Self::False => Some(false), + _ => None, + } + } + + /// An array of all property values. + pub const ALL: [Self; #prop_value_count] = [#(Self::#prop_value_variants,)*]; + } + + impl From for PropValue { + fn from(b: bool) -> Self { + Self::from_bool(b) + } + } + + #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] + pub enum BlockEntityKind { + #block_entity_kind_variants + } + + impl BlockEntityKind { + pub const fn from_id(num: u32) -> Option { + match num { + #block_entity_kind_from_id_arms + _ => None + } + } + + pub const fn id(self) -> u32 { + match self { + #block_entity_kind_to_id_arms + } + } + + pub fn from_ident(ident: Ident) -> Option { + match ident.as_str() { + #block_entity_kind_from_ident_arms + _ => None + } + } + + pub fn ident(self) -> Ident { + match self { + #block_entity_kind_to_ident_arms + } + } + } + }) +} diff --git a/vendor/valence/crates/valence_generated/build/chunk_view.rs b/vendor/valence/crates/valence_generated/build/chunk_view.rs new file mode 100644 index 00000000..ebf80d8c --- /dev/null +++ b/vendor/valence/crates/valence_generated/build/chunk_view.rs @@ -0,0 +1,40 @@ +use proc_macro2::TokenStream; +use quote::quote; + +const MAX_VIEW_DIST: u8 = 32; +const EXTRA_VIEW_RADIUS: i32 = 2; + +pub fn build() -> TokenStream { + let entries = (0..=MAX_VIEW_DIST).map(|dist| { + let dist = dist as i32 + EXTRA_VIEW_RADIUS; + + let mut positions = vec![]; + + for z in -dist..=dist { + for x in -dist..=dist { + if x * x + z * z <= dist * dist { + positions.push((x as i8, z as i8)); + } + } + } + + positions.sort_by_key(|&(x, z)| (x as i32).pow(2) + (z as i32).pow(2)); + + let array_elems = positions.into_iter().map(|(x, z)| quote!((#x, #z))); + + quote! { + &[ #(#array_elems),* ] + } + }); + + let array_len = MAX_VIEW_DIST as usize + 1; + + quote! { + /// The maximum view distance for a `ChunkView`. + pub const MAX_VIEW_DIST: u8 = #MAX_VIEW_DIST; + + pub const EXTRA_VIEW_RADIUS: i32 = #EXTRA_VIEW_RADIUS; + + pub static CHUNK_VIEW_LUT: [&[(i8, i8)]; #array_len] = [ #(#entries),* ]; + } +} diff --git a/vendor/valence/crates/valence_generated/build/item.rs b/vendor/valence/crates/valence_generated/build/item.rs new file mode 100644 index 00000000..d818a612 --- /dev/null +++ b/vendor/valence/crates/valence_generated/build/item.rs @@ -0,0 +1,338 @@ +use anyhow::Ok; +use heck::ToPascalCase; +use proc_macro2::TokenStream; +use quote::quote; +use serde::Deserialize; +use valence_build_utils::{ident, rerun_if_changed}; + +#[derive(Deserialize, Clone, Debug)] +struct Item { + id: u16, + name: String, + translation_key: String, + max_stack: i8, + max_durability: u16, + enchantability: u8, + fireproof: bool, + food: Option, + equippable: Option, +} + +#[derive(Deserialize, Clone, Debug)] +struct FoodComponent { + hunger: u16, + saturation: f32, + always_edible: bool, + meat: bool, + snack: bool, + // TODO: effects +} + +pub fn build() -> anyhow::Result { + rerun_if_changed(["extracted/items.json"]); + + let items = serde_json::from_str::>(include_str!("../extracted/items.json"))?; + + let item_kind_count = items.len(); + + let item_kind_from_raw_id_arms = items + .iter() + .map(|item| { + let id = &item.id; + let name = ident(item.name.to_pascal_case()); + + quote! { + #id => Some(Self::#name), + } + }) + .collect::(); + + let item_kind_to_raw_id_arms = items + .iter() + .map(|item| { + let id = &item.id; + let name = ident(item.name.to_pascal_case()); + + quote! { + Self::#name => #id, + } + }) + .collect::(); + + let item_kind_from_str_arms = items + .iter() + .map(|item| { + let str_name = &item.name; + let name = ident(str_name.to_pascal_case()); + quote! { + #str_name => Some(Self::#name), + } + }) + .collect::(); + + let item_kind_to_str_arms = items + .iter() + .map(|item| { + let str_name = &item.name; + let name = ident(str_name.to_pascal_case()); + quote! { + Self::#name => #str_name, + } + }) + .collect::(); + + let item_kind_to_translation_key_arms = items + .iter() + .map(|item| { + let name = ident(item.name.to_pascal_case()); + let translation_key = &item.translation_key; + quote! { + Self::#name => #translation_key, + } + }) + .collect::(); + + let item_kind_variants = items + .iter() + .map(|item| ident(item.name.to_pascal_case())) + .collect::>(); + + let item_kind_to_max_stack_arms = items + .iter() + .map(|item| { + let name = ident(item.name.to_pascal_case()); + let max_stack = item.max_stack; + + quote! { + Self::#name => #max_stack, + } + }) + .collect::(); + + let item_kind_to_food_component_arms = items + .iter() + .map(|item| match &item.food { + Some(food_component) => { + let name = ident(item.name.to_pascal_case()); + let hunger = food_component.hunger; + let saturation = food_component.saturation; + let always_edible = food_component.always_edible; + let meat = food_component.meat; + let snack = food_component.snack; + + quote! { + Self::#name => Some(FoodComponent { + hunger: #hunger, + saturation: #saturation, + always_edible: #always_edible, + meat: #meat, + snack: #snack, + } + ), + } + } + None => quote! {}, + }) + .collect::(); + + let item_kind_to_equippable_arms = items + .iter() + .map(|item| match &item.equippable { + Some(slot) => { + let name = ident(item.name.to_pascal_case()); + let slot = match slot.as_str() { + "boots" => quote! { EquipmentSlot::Boots }, + "leggings" => quote! { EquipmentSlot::Leggings }, + "chestplate" => quote! { EquipmentSlot::Chestplate }, + "helmet" => quote! { EquipmentSlot::Helmet }, + _ => quote! { EquipmentSlot::Helmet }, + }; + quote! { + Self::#name => Some(#slot), + } + } + None => quote! {}, + }) + .collect::(); + + let item_kind_to_max_durability_arms = items + .iter() + .filter(|item| item.max_durability != 0) + .map(|item| { + let name = ident(item.name.to_pascal_case()); + let max_durability = item.max_durability; + + quote! { + Self::#name => #max_durability, + } + }) + .collect::(); + + let item_kind_to_enchantability_arms = items + .iter() + .filter(|item| item.enchantability != 0) + .map(|item| { + let name = ident(item.name.to_pascal_case()); + let ench = item.enchantability; + + quote! { + Self::#name => #ench, + } + }) + .collect::(); + + let item_kind_to_fireproof_arms = items + .iter() + .filter(|item| item.fireproof) + .map(|item| { + let name = ident(item.name.to_pascal_case()); + + quote! { + Self::#name => true, + } + }) + .collect::(); + + Ok(quote! { + /// Represents an item from the game + #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Default)] + #[repr(u16)] + pub enum ItemKind { + #[default] + #(#item_kind_variants,)* + } + + /// Contains food information about an item. + /// + /// Only food items have a food component. + #[derive(Clone, Copy, PartialEq, PartialOrd, Debug)] + pub struct FoodComponent { + pub hunger: u16, + pub saturation: f32, + pub always_edible: bool, + pub meat: bool, + pub snack: bool, + } + + #[derive(Clone, Copy, PartialEq, PartialOrd, Debug)] + pub enum EquipmentSlot { + Boots, Leggings, Chestplate, Helmet + } + + impl ItemKind { + /// Constructs a item kind from a raw item ID. + /// + /// If the given ID is invalid, `None` is returned. + pub const fn from_raw(id: u16) -> Option { + match id { + #item_kind_from_raw_id_arms + _ => None + } + } + + /// Gets the raw item ID from the item kind + pub const fn to_raw(self) -> u16 { + match self { + #item_kind_to_raw_id_arms + } + } + + /// Construct an item kind for its snake_case name. + /// + /// Returns `None` if the name is invalid. + #[allow(clippy::should_implement_trait)] + pub fn from_str(name: &str) -> Option { + match name { + #item_kind_from_str_arms + _ => None + } + } + + /// Gets the snake_case name of this item kind. + pub const fn to_str(self) -> &'static str { + match self { + #item_kind_to_str_arms + } + } + + /// Gets the translation key of this item kind. + pub const fn translation_key(self) -> &'static str { + match self { + #item_kind_to_translation_key_arms + } + } + + /// Returns the maximum stack count. + pub const fn max_stack(self) -> i8 { + match self { + #item_kind_to_max_stack_arms + } + } + + /// Returns a food component which stores hunger, saturation etc. + /// + /// If the item kind can't be eaten, `None` will be returned. + pub const fn food_component(self) -> Option { + match self { + #item_kind_to_food_component_arms + _ => None + } + } + + /// Returns the maximum durability before the item will break. + /// + /// If the item doesn't have durability, `0` is returned. + pub const fn max_durability(self) -> u16 { + match self { + #item_kind_to_max_durability_arms + _ => 0, + } + } + + /// Returns the enchantability of the item kind. + /// + /// If the item doesn't have durability, `0` is returned. + pub const fn enchantability(self) -> u8 { + match self { + #item_kind_to_enchantability_arms + _ => 0, + } + } + + /// Returns if the item can survive in fire/lava. + pub const fn fireproof(self) -> bool { + #[allow(clippy::match_like_matches_macro)] + match self { + #item_kind_to_fireproof_arms + _ => false + } + } + + /// Returns the slot this ItemKind can be equipped on + pub const fn equippable(self) -> Option { + match self { + #item_kind_to_equippable_arms + _ => None + } + } + + /* + /// Constructs an item kind from a block kind. + /// + /// [`ItemKind::Air`] is used to indicate the absence of an item. + pub const fn from_block_kind(kind: BlockKind) -> Self { + kind.to_item_kind() + } + + /// Constructs a block kind from an item kind. + /// + /// If the given item kind doesn't have a corresponding block kind, `None` is returned. + pub const fn to_block_kind(self) -> Option { + BlockKind::from_item_kind(self) + }*/ + + /// An array of all item kinds. + pub const ALL: [Self; #item_kind_count] = [#(Self::#item_kind_variants,)*]; + } + }) +} diff --git a/vendor/valence/crates/valence_generated/build/main.rs b/vendor/valence/crates/valence_generated/build/main.rs new file mode 100644 index 00000000..f63827bc --- /dev/null +++ b/vendor/valence/crates/valence_generated/build/main.rs @@ -0,0 +1,21 @@ +use valence_build_utils::write_generated_file; + +mod attributes; +mod block; +mod chunk_view; +mod item; +mod packet_id; +mod sound; +mod status_effects; + +pub fn main() -> anyhow::Result<()> { + write_generated_file(attributes::build()?, "attributes.rs")?; + write_generated_file(block::build()?, "block.rs")?; + write_generated_file(item::build()?, "item.rs")?; + write_generated_file(sound::build()?, "sound.rs")?; + write_generated_file(packet_id::build()?, "packet_id.rs")?; + write_generated_file(chunk_view::build(), "chunk_view.rs")?; + write_generated_file(status_effects::build()?, "status_effects.rs")?; + + Ok(()) +} diff --git a/vendor/valence/crates/valence_generated/build/packet_id.rs b/vendor/valence/crates/valence_generated/build/packet_id.rs new file mode 100644 index 00000000..90b25617 --- /dev/null +++ b/vendor/valence/crates/valence_generated/build/packet_id.rs @@ -0,0 +1,37 @@ +use heck::ToShoutySnakeCase; +use proc_macro2::TokenStream; +use quote::quote; +use serde::Deserialize; +use valence_build_utils::{ident, rerun_if_changed}; + +#[derive(Deserialize)] +struct Packet { + name: String, + side: String, + state: String, + id: i32, +} + +pub fn build() -> anyhow::Result { + rerun_if_changed(["extracted/packets.json"]); + + let packets: Vec = serde_json::from_str(include_str!("../extracted/packets.json"))?; + + let mut consts = TokenStream::new(); + + for packet in packets { + let stripped_name = packet.name.strip_suffix("Packet").unwrap_or(&packet.name); + + let name_ident = ident(stripped_name.to_shouty_snake_case()); + let id = packet.id; + + let doc = format!("Side: {}\n\nState: {}", packet.side, packet.state); + + consts.extend([quote! { + #[doc = #doc] + pub const #name_ident: i32 = #id; + }]); + } + + Ok(consts) +} diff --git a/vendor/valence/crates/valence_generated/build/sound.rs b/vendor/valence/crates/valence_generated/build/sound.rs new file mode 100644 index 00000000..b1766526 --- /dev/null +++ b/vendor/valence/crates/valence_generated/build/sound.rs @@ -0,0 +1,122 @@ +use heck::ToPascalCase; +use proc_macro2::TokenStream; +use quote::quote; +use serde::Deserialize; +use valence_build_utils::{ident, rerun_if_changed}; + +#[derive(Deserialize, Debug)] +pub struct Sound { + id: u16, + name: String, +} + +pub fn build() -> anyhow::Result { + rerun_if_changed(["extracted/sounds.json"]); + + let sounds = serde_json::from_str::>(include_str!("../extracted/sounds.json"))?; + + let sound_count = sounds.len(); + + let sound_from_raw_id_arms = sounds + .iter() + .map(|sound| { + let id = &sound.id; + let name = ident(sound.name.to_pascal_case()); + + quote! { + #id => Some(Self::#name), + } + }) + .collect::(); + + let sound_to_raw_id_arms = sounds + .iter() + .map(|sound| { + let id = &sound.id; + let name = ident(sound.name.to_pascal_case()); + + quote! { + Self::#name => #id, + } + }) + .collect::(); + + let sound_from_ident_arms = sounds + .iter() + .map(|sound| { + // TODO: put the full resource identifier in the extracted JSON. + let path_name = &sound.name; + let ident_name = format!("minecraft:{}", &sound.name); + + let name = ident(path_name.to_pascal_case()); + quote! { + #ident_name => Some(Self::#name), + } + }) + .collect::(); + + let sound_to_ident_arms = sounds + .iter() + .map(|sound| { + let str_name = &sound.name; + let name = ident(str_name.to_pascal_case()); + quote! { + Self::#name => ident!(#str_name), + } + }) + .collect::(); + + let sound_variants = sounds + .iter() + .map(|sound| ident(sound.name.to_pascal_case())) + .collect::>(); + + Ok(quote! { + use valence_ident::{Ident, ident}; + + /// Represents a sound from the game + #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] + pub enum Sound { + #(#sound_variants,)* + } + + impl Sound { + /// Constructs a sound from a raw item ID. + /// + /// If the given ID is invalid, `None` is returned. + pub const fn from_raw(id: u16) -> Option { + match id { + #sound_from_raw_id_arms + _ => None + } + } + + /// Gets the raw sound ID from the sound + pub const fn to_raw(self) -> u16 { + match self { + #sound_to_raw_id_arms + } + } + + /// Construct a sound from its snake_case name. + /// + /// Returns `None` if the name is invalid. + pub fn from_ident(id: Ident) -> Option { + match id.as_str() { + #sound_from_ident_arms + _ => None + } + } + + /// Gets the identifier of this sound. + pub const fn to_ident(self) -> Ident { + match self { + #sound_to_ident_arms + } + } + + /// An array of all sounds. + pub const ALL: [Self; #sound_count] = [#(Self::#sound_variants,)*]; + } + }) +} diff --git a/vendor/valence/crates/valence_generated/build/status_effects.rs b/vendor/valence/crates/valence_generated/build/status_effects.rs new file mode 100644 index 00000000..0c7563d1 --- /dev/null +++ b/vendor/valence/crates/valence_generated/build/status_effects.rs @@ -0,0 +1,286 @@ +use heck::ToPascalCase; +use proc_macro2::TokenStream; +use quote::quote; +use serde::Deserialize; +use valence_build_utils::{ident, rerun_if_changed}; + +#[derive(Deserialize, Debug)] +pub enum StatusEffectCategory { + Beneficial, + Harmful, + Neutral, +} + +#[derive(Deserialize, Debug)] +pub struct AttributeModifiers { + attribute: u8, + operation: u8, + value: f64, + uuid: String, +} + +#[derive(Deserialize, Debug)] +pub struct StatusEffect { + id: u16, + name: String, + translation_key: String, + category: StatusEffectCategory, + color: u32, + instant: bool, + attribute_modifiers: Option>, +} + +pub fn build() -> anyhow::Result { + rerun_if_changed(["extracted/effects.json"]); + + let effects = + serde_json::from_str::>(include_str!("../extracted/effects.json"))?; + + let effect_count = effects.len(); + + let effect_from_raw_id_arms = effects + .iter() + .map(|effect| { + let id = &effect.id; + let name = ident(effect.name.to_pascal_case()); + + quote! { + #id => Some(Self::#name), + } + }) + .collect::(); + + let effect_to_raw_id_arms = effects + .iter() + .map(|effect| { + let id = &effect.id; + let name = ident(effect.name.to_pascal_case()); + + quote! { + Self::#name => #id, + } + }) + .collect::(); + + let effect_from_ident_arms = effects + .iter() + .map(|effect| { + let path_name = &effect.name; + let ident_name = format!("minecraft:{}", &effect.name); + + let name = ident(path_name.to_pascal_case()); + quote! { + #ident_name => Some(Self::#name), + } + }) + .collect::(); + + let effect_to_ident_arms = effects + .iter() + .map(|effect| { + let str_name = &effect.name; + let name = ident(str_name.to_pascal_case()); + quote! { + Self::#name => ident!(#str_name), + } + }) + .collect::(); + + let effect_to_translation_key_arms = effects + .iter() + .map(|effect| { + let str_name = &effect.translation_key; + let name = ident(effect.name.to_pascal_case()); + quote! { + Self::#name => #str_name, + } + }) + .collect::(); + + let effect_to_category_arms = effects + .iter() + .map(|effect| { + let category = match &effect.category { + StatusEffectCategory::Beneficial => quote! { StatusEffectCategory::Beneficial }, + StatusEffectCategory::Harmful => quote! { StatusEffectCategory::Harmful }, + StatusEffectCategory::Neutral => quote! { StatusEffectCategory::Neutral }, + }; + + let name = ident(effect.name.to_pascal_case()); + quote! { + Self::#name => #category, + } + }) + .collect::(); + + let effect_to_color_arms = effects + .iter() + .map(|effect| { + let color = &effect.color; + let name = ident(effect.name.to_pascal_case()); + quote! { + Self::#name => #color, + } + }) + .collect::(); + + let effect_to_instant_arms = effects + .iter() + .map(|effect| { + let instant = &effect.instant; + let name = ident(effect.name.to_pascal_case()); + quote! { + Self::#name => #instant, + } + }) + .collect::(); + + let effect_to_attribute_modifiers_arms = effects + .iter() + .filter_map(|effect| { + effect.attribute_modifiers.as_ref().map(|modifiers| { + let name = ident(effect.name.to_pascal_case()); + let modifiers = modifiers.iter().map(|modifier| { + let attribute = &modifier.attribute; + let operation = &modifier.operation; + let value = &modifier.value; + let uuid = &modifier.uuid; + + quote! { + AttributeModifier { + attribute: EntityAttribute::from_id(#attribute).unwrap(), + operation: EntityAttributeOperation::from_raw(#operation).unwrap(), + value: #value, + uuid: Uuid::parse_str(#uuid).unwrap(), + } + } + }); + + quote! { + Self::#name => vec![#(#modifiers,)*], + } + }) + }) + .collect::(); + + let effect_variants = effects + .iter() + .map(|effect| ident(effect.name.to_pascal_case())) + .collect::>(); + + Ok(quote! { + use uuid::Uuid; + use valence_ident::{Ident, ident}; + use super::attributes::{EntityAttribute, EntityAttributeOperation}; + + /// Represents an attribute modifier. + #[derive(Debug, Clone, Copy, PartialEq)] + pub struct AttributeModifier { + /// The attribute that this modifier modifies. + pub attribute: EntityAttribute, + /// The operation that this modifier applies. + pub operation: EntityAttributeOperation, + /// The value of this modifier. + pub value: f64, + /// The UUID of this modifier. + pub uuid: Uuid, + } + + /// Represents a status effect category + #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] + pub enum StatusEffectCategory { + Beneficial, + Harmful, + Neutral, + } + + /// Represents a status effect from the game + #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] + pub enum StatusEffect { + #(#effect_variants,)* + } + + impl StatusEffect { + /// Constructs a effect from a raw item ID. + /// + /// If the given ID is invalid, `None` is returned. + pub const fn from_raw(id: u16) -> Option { + match id { + #effect_from_raw_id_arms + _ => None + } + } + + /// Gets the raw effect ID from the effect + pub const fn to_raw(self) -> u16 { + match self { + #effect_to_raw_id_arms + } + } + + /// Construct a effect from its snake_case name. + /// + /// Returns `None` if the name is invalid. + pub fn from_ident(id: Ident) -> Option { + match id.as_str() { + #effect_from_ident_arms + _ => None + } + } + + /// Gets the identifier of this effect. + pub const fn to_ident(self) -> Ident { + match self { + #effect_to_ident_arms + } + } + + /// Gets the name of this effect. + /// Same as [`StatusEffect::to_ident`], but doesn't take ownership. + pub const fn name(&self) -> Ident { + match self { + #effect_to_ident_arms + } + } + + /// Gets the translation key of this effect. + pub const fn translation_key(&self) -> &'static str { + match self { + #effect_to_translation_key_arms + } + } + + /// Gets the category of this effect. + pub const fn category(&self) -> StatusEffectCategory { + match self { + #effect_to_category_arms + } + } + + /// Gets the color of this effect. + pub const fn color(&self) -> u32 { + match self { + #effect_to_color_arms + } + } + + /// Gets whether this effect is instant. + pub const fn instant(&self) -> bool { + match self { + #effect_to_instant_arms + } + } + + /// Gets the attribute modifiers of this effect. + pub fn attribute_modifiers(&self) -> Vec { + match self { + #effect_to_attribute_modifiers_arms + _ => vec![], + } + } + + /// An array of all effects. + pub const ALL: [Self; #effect_count] = [#(Self::#effect_variants,)*]; + } + }) +} diff --git a/vendor/valence/crates/valence_generated/extracted/attributes.json b/vendor/valence/crates/valence_generated/extracted/attributes.json new file mode 100644 index 00000000..dcb9b134 --- /dev/null +++ b/vendor/valence/crates/valence_generated/extracted/attributes.json @@ -0,0 +1,119 @@ +{ + "generic.max_health": { + "id": 0, + "name": "generic.max_health", + "default_value": 20.0, + "translation_key": "attribute.name.generic.max_health", + "tracked": true, + "min_value": 1.0, + "max_value": 1024.0 + }, + "generic.follow_range": { + "id": 1, + "name": "generic.follow_range", + "default_value": 32.0, + "translation_key": "attribute.name.generic.follow_range", + "tracked": false, + "min_value": 0.0, + "max_value": 2048.0 + }, + "generic.knockback_resistance": { + "id": 2, + "name": "generic.knockback_resistance", + "default_value": 0.0, + "translation_key": "attribute.name.generic.knockback_resistance", + "tracked": false, + "min_value": 0.0, + "max_value": 1.0 + }, + "generic.movement_speed": { + "id": 3, + "name": "generic.movement_speed", + "default_value": 0.699999988079071, + "translation_key": "attribute.name.generic.movement_speed", + "tracked": true, + "min_value": 0.0, + "max_value": 1024.0 + }, + "generic.flying_speed": { + "id": 4, + "name": "generic.flying_speed", + "default_value": 0.4000000059604645, + "translation_key": "attribute.name.generic.flying_speed", + "tracked": true, + "min_value": 0.0, + "max_value": 1024.0 + }, + "generic.attack_damage": { + "id": 5, + "name": "generic.attack_damage", + "default_value": 2.0, + "translation_key": "attribute.name.generic.attack_damage", + "tracked": false, + "min_value": 0.0, + "max_value": 2048.0 + }, + "generic.attack_knockback": { + "id": 6, + "name": "generic.attack_knockback", + "default_value": 0.0, + "translation_key": "attribute.name.generic.attack_knockback", + "tracked": false, + "min_value": 0.0, + "max_value": 5.0 + }, + "generic.attack_speed": { + "id": 7, + "name": "generic.attack_speed", + "default_value": 4.0, + "translation_key": "attribute.name.generic.attack_speed", + "tracked": true, + "min_value": 0.0, + "max_value": 1024.0 + }, + "generic.armor": { + "id": 8, + "name": "generic.armor", + "default_value": 0.0, + "translation_key": "attribute.name.generic.armor", + "tracked": true, + "min_value": 0.0, + "max_value": 30.0 + }, + "generic.armor_toughness": { + "id": 9, + "name": "generic.armor_toughness", + "default_value": 0.0, + "translation_key": "attribute.name.generic.armor_toughness", + "tracked": true, + "min_value": 0.0, + "max_value": 20.0 + }, + "generic.luck": { + "id": 10, + "name": "generic.luck", + "default_value": 0.0, + "translation_key": "attribute.name.generic.luck", + "tracked": true, + "min_value": -1024.0, + "max_value": 1024.0 + }, + "zombie.spawn_reinforcements": { + "id": 11, + "name": "zombie.spawn_reinforcements", + "default_value": 0.0, + "translation_key": "attribute.name.zombie.spawn_reinforcements", + "tracked": false, + "min_value": 0.0, + "max_value": 1.0 + }, + "horse.jump_strength": { + "id": 12, + "name": "horse.jump_strength", + "default_value": 0.7, + "translation_key": "attribute.name.horse.jump_strength", + "tracked": true, + "min_value": 0.0, + "max_value": 2.0 + } +} \ No newline at end of file diff --git a/vendor/valence/crates/valence_generated/extracted/blocks.json b/vendor/valence/crates/valence_generated/extracted/blocks.json new file mode 100644 index 00000000..4a996bc7 --- /dev/null +++ b/vendor/valence/crates/valence_generated/extracted/blocks.json @@ -0,0 +1,289553 @@ +{ + "block_entity_types": [ + { + "id": 0, + "ident": "minecraft:furnace", + "name": "furnace" + }, + { + "id": 1, + "ident": "minecraft:chest", + "name": "chest" + }, + { + "id": 2, + "ident": "minecraft:trapped_chest", + "name": "trapped_chest" + }, + { + "id": 3, + "ident": "minecraft:ender_chest", + "name": "ender_chest" + }, + { + "id": 4, + "ident": "minecraft:jukebox", + "name": "jukebox" + }, + { + "id": 5, + "ident": "minecraft:dispenser", + "name": "dispenser" + }, + { + "id": 6, + "ident": "minecraft:dropper", + "name": "dropper" + }, + { + "id": 7, + "ident": "minecraft:sign", + "name": "sign" + }, + { + "id": 8, + "ident": "minecraft:hanging_sign", + "name": "hanging_sign" + }, + { + "id": 9, + "ident": "minecraft:mob_spawner", + "name": "mob_spawner" + }, + { + "id": 10, + "ident": "minecraft:piston", + "name": "piston" + }, + { + "id": 11, + "ident": "minecraft:brewing_stand", + "name": "brewing_stand" + }, + { + "id": 12, + "ident": "minecraft:enchanting_table", + "name": "enchanting_table" + }, + { + "id": 13, + "ident": "minecraft:end_portal", + "name": "end_portal" + }, + { + "id": 14, + "ident": "minecraft:beacon", + "name": "beacon" + }, + { + "id": 15, + "ident": "minecraft:skull", + "name": "skull" + }, + { + "id": 16, + "ident": "minecraft:daylight_detector", + "name": "daylight_detector" + }, + { + "id": 17, + "ident": "minecraft:hopper", + "name": "hopper" + }, + { + "id": 18, + "ident": "minecraft:comparator", + "name": "comparator" + }, + { + "id": 19, + "ident": "minecraft:banner", + "name": "banner" + }, + { + "id": 20, + "ident": "minecraft:structure_block", + "name": "structure_block" + }, + { + "id": 21, + "ident": "minecraft:end_gateway", + "name": "end_gateway" + }, + { + "id": 22, + "ident": "minecraft:command_block", + "name": "command_block" + }, + { + "id": 23, + "ident": "minecraft:shulker_box", + "name": "shulker_box" + }, + { + "id": 24, + "ident": "minecraft:bed", + "name": "bed" + }, + { + "id": 25, + "ident": "minecraft:conduit", + "name": "conduit" + }, + { + "id": 26, + "ident": "minecraft:barrel", + "name": "barrel" + }, + { + "id": 27, + "ident": "minecraft:smoker", + "name": "smoker" + }, + { + "id": 28, + "ident": "minecraft:blast_furnace", + "name": "blast_furnace" + }, + { + "id": 29, + "ident": "minecraft:lectern", + "name": "lectern" + }, + { + "id": 30, + "ident": "minecraft:bell", + "name": "bell" + }, + { + "id": 31, + "ident": "minecraft:jigsaw", + "name": "jigsaw" + }, + { + "id": 32, + "ident": "minecraft:campfire", + "name": "campfire" + }, + { + "id": 33, + "ident": "minecraft:beehive", + "name": "beehive" + }, + { + "id": 34, + "ident": "minecraft:sculk_sensor", + "name": "sculk_sensor" + }, + { + "id": 35, + "ident": "minecraft:calibrated_sculk_sensor", + "name": "calibrated_sculk_sensor" + }, + { + "id": 36, + "ident": "minecraft:sculk_catalyst", + "name": "sculk_catalyst" + }, + { + "id": 37, + "ident": "minecraft:sculk_shrieker", + "name": "sculk_shrieker" + }, + { + "id": 38, + "ident": "minecraft:chiseled_bookshelf", + "name": "chiseled_bookshelf" + }, + { + "id": 39, + "ident": "minecraft:brushable_block", + "name": "brushable_block" + }, + { + "id": 40, + "ident": "minecraft:decorated_pot", + "name": "decorated_pot" + } + ], + "shapes": [ + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 0.1875, + "max_y": 0.5625, + "max_z": 0.1875 + }, + { + "min_x": 0.8125, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 0.5625, + "max_z": 0.1875 + }, + { + "min_x": 0.0, + "min_y": 0.1875, + "min_z": 0.1875, + "max_x": 1.0, + "max_y": 0.5625, + "max_z": 1.0 + }, + { + "min_x": 0.1875, + "min_y": 0.1875, + "min_z": 0.0, + "max_x": 0.8125, + "max_y": 0.5625, + "max_z": 0.1875 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.8125, + "max_x": 0.1875, + "max_y": 0.5625, + "max_z": 1.0 + }, + { + "min_x": 0.8125, + "min_y": 0.0, + "min_z": 0.8125, + "max_x": 1.0, + "max_y": 0.5625, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.1875, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 0.5625, + "max_z": 0.8125 + }, + { + "min_x": 0.1875, + "min_y": 0.1875, + "min_z": 0.8125, + "max_x": 0.8125, + "max_y": 0.5625, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.1875, + "min_z": 0.1875, + "max_x": 1.0, + "max_y": 0.5625, + "max_z": 0.8125 + }, + { + "min_x": 0.1875, + "min_y": 0.1875, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 0.5625, + "max_z": 0.1875 + }, + { + "min_x": 0.1875, + "min_y": 0.1875, + "min_z": 0.8125, + "max_x": 1.0, + "max_y": 0.5625, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.1875, + "min_z": 0.0, + "max_x": 0.8125, + "max_y": 0.5625, + "max_z": 1.0 + }, + { + "min_x": 0.8125, + "min_y": 0.1875, + "min_z": 0.1875, + "max_x": 1.0, + "max_y": 0.5625, + "max_z": 0.8125 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.25, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 0.75, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.75 + }, + { + "min_x": 0.25, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 0.75, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.25, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.25 + }, + { + "min_x": 0.375, + "min_y": 0.375, + "min_z": 0.25, + "max_x": 0.625, + "max_y": 0.625, + "max_z": 1.0 + }, + { + "min_x": 0.375, + "min_y": 0.375, + "min_z": 0.25, + "max_x": 0.625, + "max_y": 0.625, + "max_z": 1.25 + }, + { + "min_x": 0.75, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.375, + "min_z": 0.375, + "max_x": 0.75, + "max_y": 0.625, + "max_z": 0.625 + }, + { + "min_x": -0.25, + "min_y": 0.375, + "min_z": 0.375, + "max_x": 0.75, + "max_y": 0.625, + "max_z": 0.625 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.75, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.375, + "min_y": 0.375, + "min_z": 0.0, + "max_x": 0.625, + "max_y": 0.625, + "max_z": 0.75 + }, + { + "min_x": 0.375, + "min_y": 0.375, + "min_z": -0.25, + "max_x": 0.625, + "max_y": 0.625, + "max_z": 0.75 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 0.25, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.25, + "min_y": 0.375, + "min_z": 0.375, + "max_x": 1.0, + "max_y": 0.625, + "max_z": 0.625 + }, + { + "min_x": 0.25, + "min_y": 0.375, + "min_z": 0.375, + "max_x": 1.25, + "max_y": 0.625, + "max_z": 0.625 + }, + { + "min_x": 0.375, + "min_y": 0.0, + "min_z": 0.375, + "max_x": 0.625, + "max_y": 1.0, + "max_z": 0.625 + }, + { + "min_x": 0.0, + "min_y": 0.75, + "min_z": 0.0, + "max_x": 0.375, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.375, + "min_y": 0.75, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.375 + }, + { + "min_x": 0.375, + "min_y": 0.75, + "min_z": 0.625, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.625, + "min_y": 0.75, + "min_z": 0.375, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.625 + }, + { + "min_x": 0.375, + "min_y": -0.25, + "min_z": 0.375, + "max_x": 0.625, + "max_y": 1.0, + "max_z": 0.625 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 0.25, + "max_z": 1.0 + }, + { + "min_x": 0.375, + "min_y": 0.25, + "min_z": 0.375, + "max_x": 0.625, + "max_y": 1.0, + "max_z": 0.625 + }, + { + "min_x": 0.375, + "min_y": 0.25, + "min_z": 0.375, + "max_x": 0.625, + "max_y": 1.25, + "max_z": 0.625 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.5 + }, + { + "min_x": 0.0, + "min_y": 0.5, + "min_z": 0.5, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 0.5, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.5, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.5 + }, + { + "min_x": 0.5, + "min_y": 0.5, + "min_z": 0.5, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.5, + "min_y": 0.0, + "min_z": 0.5, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.5, + "min_z": 0.5, + "max_x": 0.5, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 0.5, + "max_y": 1.0, + "max_z": 0.5 + }, + { + "min_x": 0.5, + "min_y": 0.5, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.5 + }, + { + "min_x": 0.0, + "min_y": 0.5, + "min_z": 0.0, + "max_x": 0.5, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 0.5, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.5, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.5 + }, + { + "min_x": 0.0, + "min_y": 0.5, + "min_z": 0.0, + "max_x": 0.5, + "max_y": 1.0, + "max_z": 0.5 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.5, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.5, + "max_x": 0.5, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.5, + "min_y": 0.5, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.5, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.0625, + "min_y": 0.0, + "min_z": 0.0625, + "max_x": 0.9375, + "max_y": 0.875, + "max_z": 0.9375 + }, + { + "min_x": 0.0625, + "min_y": 0.0, + "min_z": 0.0625, + "max_x": 1.0, + "max_y": 0.875, + "max_z": 0.9375 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0625, + "max_x": 0.9375, + "max_y": 0.875, + "max_z": 0.9375 + }, + { + "min_x": 0.0625, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 0.9375, + "max_y": 0.875, + "max_z": 0.9375 + }, + { + "min_x": 0.0625, + "min_y": 0.0, + "min_z": 0.0625, + "max_x": 0.9375, + "max_y": 0.875, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 0.9375, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 0.1875, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.8125, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.8125, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.1875 + }, + { + "min_x": 0.0, + "min_y": 0.875, + "min_z": 0.375, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.625 + }, + { + "min_x": 0.375, + "min_y": 0.875, + "min_z": 0.0, + "max_x": 0.625, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 0.125, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 0.375, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 0.625, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 0.875, + "max_z": 1.0 + }, + { + "min_x": 0.0625, + "min_y": 0.0, + "min_z": 0.0625, + "max_x": 0.9375, + "max_y": 0.9375, + "max_z": 0.9375 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.375, + "max_x": 1.0, + "max_y": 1.5, + "max_z": 0.625 + }, + { + "min_x": 0.375, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 0.625, + "max_y": 1.5, + "max_z": 0.375 + }, + { + "min_x": 0.375, + "min_y": 0.0, + "min_z": 0.625, + "max_x": 0.625, + "max_y": 1.5, + "max_z": 1.0 + }, + { + "min_x": 0.375, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 0.625, + "max_y": 1.5, + "max_z": 1.0 + }, + { + "min_x": 0.625, + "min_y": 0.0, + "min_z": 0.375, + "max_x": 1.0, + "max_y": 1.5, + "max_z": 0.625 + }, + { + "min_x": 0.375, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 0.625, + "max_y": 1.5, + "max_z": 0.625 + }, + { + "min_x": 0.375, + "min_y": 0.0, + "min_z": 0.375, + "max_x": 0.625, + "max_y": 1.5, + "max_z": 1.0 + }, + { + "min_x": 0.375, + "min_y": 0.0, + "min_z": 0.375, + "max_x": 1.0, + "max_y": 1.5, + "max_z": 0.625 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.375, + "max_x": 0.625, + "max_y": 1.5, + "max_z": 0.625 + }, + { + "min_x": 0.375, + "min_y": 0.0, + "min_z": 0.375, + "max_x": 0.625, + "max_y": 1.5, + "max_z": 0.625 + }, + { + "min_x": 0.0625, + "min_y": 0.0, + "min_z": 0.0625, + "max_x": 0.9375, + "max_y": 0.5, + "max_z": 0.9375 + }, + { + "min_x": 0.1875, + "min_y": 0.0, + "min_z": 0.0625, + "max_x": 0.9375, + "max_y": 0.5, + "max_z": 0.9375 + }, + { + "min_x": 0.3125, + "min_y": 0.0, + "min_z": 0.0625, + "max_x": 0.9375, + "max_y": 0.5, + "max_z": 0.9375 + }, + { + "min_x": 0.4375, + "min_y": 0.0, + "min_z": 0.0625, + "max_x": 0.9375, + "max_y": 0.5, + "max_z": 0.9375 + }, + { + "min_x": 0.5625, + "min_y": 0.0, + "min_z": 0.0625, + "max_x": 0.9375, + "max_y": 0.5, + "max_z": 0.9375 + }, + { + "min_x": 0.6875, + "min_y": 0.0, + "min_z": 0.0625, + "max_x": 0.9375, + "max_y": 0.5, + "max_z": 0.9375 + }, + { + "min_x": 0.8125, + "min_y": 0.0, + "min_z": 0.0625, + "max_x": 0.9375, + "max_y": 0.5, + "max_z": 0.9375 + }, + { + "min_x": 0.0, + "min_y": 0.8125, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 0.1875, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.4375, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.5625 + }, + { + "min_x": 0.4375, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 0.5625, + "max_y": 1.0, + "max_z": 0.4375 + }, + { + "min_x": 0.4375, + "min_y": 0.0, + "min_z": 0.5625, + "max_x": 0.5625, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.4375, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 0.5625, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.5625, + "min_y": 0.0, + "min_z": 0.4375, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.5625 + }, + { + "min_x": 0.4375, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 0.5625, + "max_y": 1.0, + "max_z": 0.5625 + }, + { + "min_x": 0.4375, + "min_y": 0.0, + "min_z": 0.4375, + "max_x": 0.5625, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.4375, + "min_y": 0.0, + "min_z": 0.4375, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.5625 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.4375, + "max_x": 0.5625, + "max_y": 1.0, + "max_z": 0.5625 + }, + { + "min_x": 0.4375, + "min_y": 0.0, + "min_z": 0.4375, + "max_x": 0.5625, + "max_y": 1.0, + "max_z": 0.5625 + }, + { + "min_x": 0.0, + "min_y": 0.40625, + "min_z": 0.40625, + "max_x": 1.0, + "max_y": 0.59375, + "max_z": 0.59375 + }, + { + "min_x": 0.40625, + "min_y": 0.0, + "min_z": 0.40625, + "max_x": 0.59375, + "max_y": 1.0, + "max_z": 0.59375 + }, + { + "min_x": 0.40625, + "min_y": 0.40625, + "min_z": 0.0, + "max_x": 0.59375, + "max_y": 0.59375, + "max_z": 1.0 + }, + { + "min_x": 0.0625, + "min_y": 0.0, + "min_z": 0.0625, + "max_x": 0.9375, + "max_y": 0.09375, + "max_z": 0.9375 + }, + { + "min_x": 0.0625, + "min_y": 0.0, + "min_z": 0.0625, + "max_x": 0.9375, + "max_y": 0.125, + "max_z": 0.9375 + }, + { + "min_x": 0.4375, + "min_y": 0.125, + "min_z": 0.4375, + "max_x": 0.5625, + "max_y": 0.875, + "max_z": 0.5625 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 0.125, + "max_y": 1.0, + "max_z": 0.25 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.75, + "max_x": 0.125, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.125, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 0.25, + "max_y": 1.0, + "max_z": 0.125 + }, + { + "min_x": 0.125, + "min_y": 0.0, + "min_z": 0.875, + "max_x": 0.25, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.75, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.125 + }, + { + "min_x": 0.75, + "min_y": 0.0, + "min_z": 0.875, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.875, + "min_y": 0.0, + "min_z": 0.125, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.25 + }, + { + "min_x": 0.875, + "min_y": 0.0, + "min_z": 0.75, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.875 + }, + { + "min_x": 0.0, + "min_y": 0.1875, + "min_z": 0.25, + "max_x": 1.0, + "max_y": 0.25, + "max_z": 0.75 + }, + { + "min_x": 0.125, + "min_y": 0.1875, + "min_z": 0.125, + "max_x": 0.875, + "max_y": 0.25, + "max_z": 0.25 + }, + { + "min_x": 0.125, + "min_y": 0.1875, + "min_z": 0.75, + "max_x": 0.875, + "max_y": 0.25, + "max_z": 0.875 + }, + { + "min_x": 0.25, + "min_y": 0.1875, + "min_z": 0.0, + "max_x": 0.75, + "max_y": 1.0, + "max_z": 0.125 + }, + { + "min_x": 0.25, + "min_y": 0.1875, + "min_z": 0.875, + "max_x": 0.75, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.25, + "min_z": 0.25, + "max_x": 0.125, + "max_y": 1.0, + "max_z": 0.75 + }, + { + "min_x": 0.875, + "min_y": 0.25, + "min_z": 0.25, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.75 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 0.8125, + "max_z": 1.0 + }, + { + "min_x": 0.25, + "min_y": 0.8125, + "min_z": 0.25, + "max_x": 0.75, + "max_y": 1.0, + "max_z": 0.75 + }, + { + "min_x": 0.0625, + "min_y": 0.0, + "min_z": 0.0625, + "max_x": 0.9375, + "max_y": 1.0, + "max_z": 0.9375 + }, + { + "min_x": 0.375, + "min_y": 0.4375, + "min_z": 0.0625, + "max_x": 0.625, + "max_y": 0.75, + "max_z": 0.3125 + }, + { + "min_x": 0.375, + "min_y": 0.4375, + "min_z": 0.6875, + "max_x": 0.625, + "max_y": 0.75, + "max_z": 0.9375 + }, + { + "min_x": 0.0625, + "min_y": 0.4375, + "min_z": 0.375, + "max_x": 0.3125, + "max_y": 0.75, + "max_z": 0.625 + }, + { + "min_x": 0.6875, + "min_y": 0.4375, + "min_z": 0.375, + "max_x": 0.9375, + "max_y": 0.75, + "max_z": 0.625 + }, + { + "min_x": 0.3125, + "min_y": 0.3125, + "min_z": 0.0625, + "max_x": 0.6875, + "max_y": 0.75, + "max_z": 0.4375 + }, + { + "min_x": 0.3125, + "min_y": 0.3125, + "min_z": 0.5625, + "max_x": 0.6875, + "max_y": 0.75, + "max_z": 0.9375 + }, + { + "min_x": 0.0625, + "min_y": 0.3125, + "min_z": 0.3125, + "max_x": 0.4375, + "max_y": 0.75, + "max_z": 0.6875 + }, + { + "min_x": 0.5625, + "min_y": 0.3125, + "min_z": 0.3125, + "max_x": 0.9375, + "max_y": 0.75, + "max_z": 0.6875 + }, + { + "min_x": 0.25, + "min_y": 0.1875, + "min_z": 0.0625, + "max_x": 0.75, + "max_y": 0.75, + "max_z": 0.5625 + }, + { + "min_x": 0.25, + "min_y": 0.1875, + "min_z": 0.4375, + "max_x": 0.75, + "max_y": 0.75, + "max_z": 0.9375 + }, + { + "min_x": 0.0625, + "min_y": 0.1875, + "min_z": 0.25, + "max_x": 0.5625, + "max_y": 0.75, + "max_z": 0.75 + }, + { + "min_x": 0.4375, + "min_y": 0.1875, + "min_z": 0.25, + "max_x": 0.9375, + "max_y": 0.75, + "max_z": 0.75 + }, + { + "min_x": 0.25, + "min_y": 0.0, + "min_z": 0.25, + "max_x": 0.75, + "max_y": 1.5, + "max_z": 0.75 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.3125, + "max_x": 0.75, + "max_y": 1.5, + "max_z": 0.6875 + }, + { + "min_x": 0.25, + "min_y": 0.0, + "min_z": 0.25, + "max_x": 0.75, + "max_y": 1.5, + "max_z": 0.3125 + }, + { + "min_x": 0.25, + "min_y": 0.0, + "min_z": 0.6875, + "max_x": 0.75, + "max_y": 1.5, + "max_z": 0.75 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.3125, + "max_x": 0.6875, + "max_y": 1.5, + "max_z": 0.6875 + }, + { + "min_x": 0.3125, + "min_y": 0.0, + "min_z": 0.75, + "max_x": 0.6875, + "max_y": 1.5, + "max_z": 1.0 + }, + { + "min_x": 0.3125, + "min_y": 0.0, + "min_z": 0.3125, + "max_x": 0.6875, + "max_y": 1.5, + "max_z": 1.0 + }, + { + "min_x": 0.3125, + "min_y": 0.0, + "min_z": 0.6875, + "max_x": 0.6875, + "max_y": 1.5, + "max_z": 1.0 + }, + { + "min_x": 0.3125, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 0.6875, + "max_y": 1.5, + "max_z": 0.25 + }, + { + "min_x": 0.3125, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 0.6875, + "max_y": 1.5, + "max_z": 0.6875 + }, + { + "min_x": 0.3125, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 0.6875, + "max_y": 1.5, + "max_z": 0.3125 + }, + { + "min_x": 0.3125, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 0.6875, + "max_y": 1.5, + "max_z": 1.0 + }, + { + "min_x": 0.75, + "min_y": 0.0, + "min_z": 0.3125, + "max_x": 1.0, + "max_y": 1.5, + "max_z": 0.6875 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.3125, + "max_x": 1.0, + "max_y": 1.5, + "max_z": 0.6875 + }, + { + "min_x": 0.3125, + "min_y": 0.0, + "min_z": 0.3125, + "max_x": 1.0, + "max_y": 1.5, + "max_z": 0.6875 + }, + { + "min_x": 0.6875, + "min_y": 0.0, + "min_z": 0.3125, + "max_x": 1.0, + "max_y": 1.5, + "max_z": 0.6875 + }, + { + "min_x": 0.3125, + "min_y": 0.0, + "min_z": 0.3125, + "max_x": 0.6875, + "max_y": 0.375, + "max_z": 0.6875 + }, + { + "min_x": 0.25, + "min_y": 0.0, + "min_z": 0.25, + "max_x": 0.75, + "max_y": 0.5, + "max_z": 0.75 + }, + { + "min_x": 0.25, + "min_y": 0.25, + "min_z": 0.5, + "max_x": 0.75, + "max_y": 0.75, + "max_z": 1.0 + }, + { + "min_x": 0.25, + "min_y": 0.25, + "min_z": 0.0, + "max_x": 0.75, + "max_y": 0.75, + "max_z": 0.5 + }, + { + "min_x": 0.5, + "min_y": 0.25, + "min_z": 0.25, + "max_x": 1.0, + "max_y": 0.75, + "max_z": 0.75 + }, + { + "min_x": 0.0, + "min_y": 0.25, + "min_z": 0.25, + "max_x": 0.5, + "max_y": 0.75, + "max_z": 0.75 + }, + { + "min_x": 0.1875, + "min_y": 0.0, + "min_z": 0.1875, + "max_x": 0.8125, + "max_y": 0.5, + "max_z": 0.8125 + }, + { + "min_x": 0.1875, + "min_y": 0.25, + "min_z": 0.5, + "max_x": 0.8125, + "max_y": 0.75, + "max_z": 1.0 + }, + { + "min_x": 0.1875, + "min_y": 0.25, + "min_z": 0.0, + "max_x": 0.8125, + "max_y": 0.75, + "max_z": 0.5 + }, + { + "min_x": 0.5, + "min_y": 0.25, + "min_z": 0.1875, + "max_x": 1.0, + "max_y": 0.75, + "max_z": 0.8125 + }, + { + "min_x": 0.0, + "min_y": 0.25, + "min_z": 0.1875, + "max_x": 0.5, + "max_y": 0.75, + "max_z": 0.8125 + }, + { + "min_x": 0.125, + "min_y": 0.0, + "min_z": 0.125, + "max_x": 0.875, + "max_y": 0.25, + "max_z": 0.875 + }, + { + "min_x": 0.25, + "min_y": 0.25, + "min_z": 0.1875, + "max_x": 0.75, + "max_y": 0.3125, + "max_z": 0.8125 + }, + { + "min_x": 0.375, + "min_y": 0.3125, + "min_z": 0.25, + "max_x": 0.625, + "max_y": 1.0, + "max_z": 0.75 + }, + { + "min_x": 0.1875, + "min_y": 0.625, + "min_z": 0.0, + "max_x": 0.375, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.375, + "min_y": 0.625, + "min_z": 0.0, + "max_x": 0.8125, + "max_y": 1.0, + "max_z": 0.25 + }, + { + "min_x": 0.375, + "min_y": 0.625, + "min_z": 0.75, + "max_x": 0.8125, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.625, + "min_y": 0.625, + "min_z": 0.25, + "max_x": 0.8125, + "max_y": 1.0, + "max_z": 0.75 + }, + { + "min_x": 0.1875, + "min_y": 0.25, + "min_z": 0.25, + "max_x": 0.8125, + "max_y": 0.3125, + "max_z": 0.75 + }, + { + "min_x": 0.25, + "min_y": 0.3125, + "min_z": 0.375, + "max_x": 0.75, + "max_y": 1.0, + "max_z": 0.625 + }, + { + "min_x": 0.0, + "min_y": 0.625, + "min_z": 0.1875, + "max_x": 0.25, + "max_y": 1.0, + "max_z": 0.8125 + }, + { + "min_x": 0.25, + "min_y": 0.625, + "min_z": 0.1875, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.375 + }, + { + "min_x": 0.25, + "min_y": 0.625, + "min_z": 0.625, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.8125 + }, + { + "min_x": 0.75, + "min_y": 0.625, + "min_z": 0.375, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.625 + }, + { + "min_x": 0.375, + "min_y": 0.0, + "min_z": 0.375, + "max_x": 0.625, + "max_y": 0.6875, + "max_z": 0.625 + }, + { + "min_x": 0.25, + "min_y": 0.25, + "min_z": 0.25, + "max_x": 0.375, + "max_y": 0.6875, + "max_z": 0.75 + }, + { + "min_x": 0.375, + "min_y": 0.25, + "min_z": 0.25, + "max_x": 0.75, + "max_y": 0.6875, + "max_z": 0.375 + }, + { + "min_x": 0.375, + "min_y": 0.25, + "min_z": 0.625, + "max_x": 0.75, + "max_y": 0.6875, + "max_z": 0.75 + }, + { + "min_x": 0.625, + "min_y": 0.25, + "min_z": 0.375, + "max_x": 0.75, + "max_y": 0.6875, + "max_z": 0.625 + }, + { + "min_x": 0.0, + "min_y": 0.625, + "min_z": 0.0, + "max_x": 0.25, + "max_y": 0.6875, + "max_z": 1.0 + }, + { + "min_x": 0.25, + "min_y": 0.625, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 0.6875, + "max_z": 0.25 + }, + { + "min_x": 0.25, + "min_y": 0.625, + "min_z": 0.75, + "max_x": 1.0, + "max_y": 0.6875, + "max_z": 1.0 + }, + { + "min_x": 0.75, + "min_y": 0.625, + "min_z": 0.25, + "max_x": 1.0, + "max_y": 0.6875, + "max_z": 0.75 + }, + { + "min_x": 0.0, + "min_y": 0.6875, + "min_z": 0.0, + "max_x": 0.125, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.125, + "min_y": 0.6875, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.125 + }, + { + "min_x": 0.125, + "min_y": 0.6875, + "min_z": 0.875, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.875, + "min_y": 0.6875, + "min_z": 0.125, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.875 + }, + { + "min_x": 0.25, + "min_y": 0.25, + "min_z": 0.25, + "max_x": 0.75, + "max_y": 0.6875, + "max_z": 0.75 + }, + { + "min_x": 0.375, + "min_y": 0.25, + "min_z": 0.0, + "max_x": 0.625, + "max_y": 0.5, + "max_z": 0.25 + }, + { + "min_x": 0.375, + "min_y": 0.25, + "min_z": 0.75, + "max_x": 0.625, + "max_y": 0.5, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.25, + "min_z": 0.375, + "max_x": 0.75, + "max_y": 0.5, + "max_z": 0.625 + }, + { + "min_x": 0.25, + "min_y": 0.25, + "min_z": 0.25, + "max_x": 0.75, + "max_y": 0.6875, + "max_z": 0.375 + }, + { + "min_x": 0.25, + "min_y": 0.25, + "min_z": 0.625, + "max_x": 0.75, + "max_y": 0.6875, + "max_z": 0.75 + }, + { + "min_x": 0.25, + "min_y": 0.5, + "min_z": 0.375, + "max_x": 0.75, + "max_y": 0.6875, + "max_z": 0.625 + }, + { + "min_x": 0.75, + "min_y": 0.25, + "min_z": 0.375, + "max_x": 1.0, + "max_y": 0.5, + "max_z": 0.625 + }, + { + "min_x": 0.0, + "min_y": 0.5, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 0.0625, + "max_z": 1.0 + }, + { + "min_x": 0.375, + "min_y": 0.375, + "min_z": 0.0, + "max_x": 0.625, + "max_y": 0.625, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.375, + "min_z": 0.375, + "max_x": 1.0, + "max_y": 0.625, + "max_z": 0.625 + }, + { + "min_x": 0.1875, + "min_y": 0.0, + "min_z": 0.1875, + "max_x": 0.8125, + "max_y": 1.0, + "max_z": 0.8125 + }, + { + "min_x": 0.0, + "min_y": 0.1875, + "min_z": 0.1875, + "max_x": 0.1875, + "max_y": 0.8125, + "max_z": 0.8125 + }, + { + "min_x": 0.1875, + "min_y": 0.1875, + "min_z": 0.0, + "max_x": 0.8125, + "max_y": 0.8125, + "max_z": 0.1875 + }, + { + "min_x": 0.1875, + "min_y": 0.1875, + "min_z": 0.8125, + "max_x": 0.8125, + "max_y": 0.8125, + "max_z": 1.0 + }, + { + "min_x": 0.8125, + "min_y": 0.1875, + "min_z": 0.1875, + "max_x": 1.0, + "max_y": 0.8125, + "max_z": 0.8125 + }, + { + "min_x": 0.1875, + "min_y": 0.0, + "min_z": 0.1875, + "max_x": 0.8125, + "max_y": 0.8125, + "max_z": 0.8125 + }, + { + "min_x": 0.0, + "min_y": 0.1875, + "min_z": 0.1875, + "max_x": 1.0, + "max_y": 0.8125, + "max_z": 0.8125 + }, + { + "min_x": 0.1875, + "min_y": 0.8125, + "min_z": 0.1875, + "max_x": 0.8125, + "max_y": 1.0, + "max_z": 0.8125 + }, + { + "min_x": 0.1875, + "min_y": 0.1875, + "min_z": 0.0, + "max_x": 0.8125, + "max_y": 0.8125, + "max_z": 1.0 + }, + { + "min_x": 0.1875, + "min_y": 0.1875, + "min_z": 0.0, + "max_x": 0.8125, + "max_y": 0.8125, + "max_z": 0.8125 + }, + { + "min_x": 0.1875, + "min_y": 0.1875, + "min_z": 0.1875, + "max_x": 0.8125, + "max_y": 0.8125, + "max_z": 1.0 + }, + { + "min_x": 0.1875, + "min_y": 0.1875, + "min_z": 0.1875, + "max_x": 1.0, + "max_y": 0.8125, + "max_z": 0.8125 + }, + { + "min_x": 0.0, + "min_y": 0.1875, + "min_z": 0.1875, + "max_x": 0.8125, + "max_y": 0.8125, + "max_z": 0.8125 + }, + { + "min_x": 0.1875, + "min_y": 0.1875, + "min_z": 0.1875, + "max_x": 0.8125, + "max_y": 1.0, + "max_z": 0.8125 + }, + { + "min_x": 0.1875, + "min_y": 0.1875, + "min_z": 0.1875, + "max_x": 0.8125, + "max_y": 0.8125, + "max_z": 0.8125 + }, + { + "min_x": 0.3125, + "min_y": -0.0625, + "min_z": 0.3125, + "max_x": 0.6875, + "max_y": 0.1875, + "max_z": 0.6875 + }, + { + "min_x": 0.1875, + "min_y": -0.0625, + "min_z": 0.1875, + "max_x": 0.8125, + "max_y": 0.3125, + "max_z": 0.8125 + }, + { + "min_x": 0.1875, + "min_y": 0.0, + "min_z": 0.1875, + "max_x": 0.75, + "max_y": 0.4375, + "max_z": 0.75 + }, + { + "min_x": 0.0625, + "min_y": 0.0, + "min_z": 0.0625, + "max_x": 0.9375, + "max_y": 0.4375, + "max_z": 0.9375 + }, + { + "min_x": 0.0625, + "min_y": 0.0, + "min_z": 0.125, + "max_x": 0.9375, + "max_y": 1.0, + "max_z": 0.875 + }, + { + "min_x": 0.375, + "min_y": 0.0, + "min_z": 0.375, + "max_x": 0.625, + "max_y": 0.375, + "max_z": 0.625 + }, + { + "min_x": 0.1875, + "min_y": 0.0, + "min_z": 0.1875, + "max_x": 0.8125, + "max_y": 0.375, + "max_z": 0.8125 + }, + { + "min_x": 0.125, + "min_y": 0.0, + "min_z": 0.125, + "max_x": 0.875, + "max_y": 0.375, + "max_z": 0.875 + }, + { + "min_x": 0.125, + "min_y": 0.0, + "min_z": 0.125, + "max_x": 0.875, + "max_y": 0.4375, + "max_z": 0.875 + }, + { + "min_x": 0.3125, + "min_y": 0.3125, + "min_z": 0.3125, + "max_x": 0.6875, + "max_y": 0.6875, + "max_z": 0.6875 + }, + { + "min_x": 0.15625, + "min_y": 0.0, + "min_z": 0.15625, + "max_x": 0.34375, + "max_y": 1.0, + "max_z": 0.34375 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 0.125, + "max_y": 1.0, + "max_z": 0.125 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.875, + "max_x": 0.125, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.875, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.125 + }, + { + "min_x": 0.875, + "min_y": 0.0, + "min_z": 0.875, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.875, + "min_z": 0.125, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.875 + }, + { + "min_x": 0.125, + "min_y": 0.875, + "min_z": 0.0, + "max_x": 0.875, + "max_y": 1.0, + "max_z": 0.125 + }, + { + "min_x": 0.125, + "min_y": 0.875, + "min_z": 0.875, + "max_x": 0.875, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.125, + "min_y": 0.0, + "min_z": 0.375, + "max_x": 0.25, + "max_y": 0.8125, + "max_z": 0.625 + }, + { + "min_x": 0.75, + "min_y": 0.0, + "min_z": 0.375, + "max_x": 0.875, + "max_y": 0.8125, + "max_z": 0.625 + }, + { + "min_x": 0.25, + "min_y": 0.25, + "min_z": 0.125, + "max_x": 0.75, + "max_y": 1.0, + "max_z": 0.875 + }, + { + "min_x": 0.125, + "min_y": 0.4375, + "min_z": 0.3125, + "max_x": 0.25, + "max_y": 0.8125, + "max_z": 0.375 + }, + { + "min_x": 0.125, + "min_y": 0.4375, + "min_z": 0.625, + "max_x": 0.25, + "max_y": 0.8125, + "max_z": 0.6875 + }, + { + "min_x": 0.75, + "min_y": 0.4375, + "min_z": 0.3125, + "max_x": 0.875, + "max_y": 0.8125, + "max_z": 0.375 + }, + { + "min_x": 0.75, + "min_y": 0.4375, + "min_z": 0.625, + "max_x": 0.875, + "max_y": 0.8125, + "max_z": 0.6875 + }, + { + "min_x": 0.375, + "min_y": 0.0, + "min_z": 0.125, + "max_x": 0.625, + "max_y": 0.8125, + "max_z": 0.25 + }, + { + "min_x": 0.375, + "min_y": 0.0, + "min_z": 0.75, + "max_x": 0.625, + "max_y": 0.8125, + "max_z": 0.875 + }, + { + "min_x": 0.125, + "min_y": 0.25, + "min_z": 0.25, + "max_x": 0.875, + "max_y": 1.0, + "max_z": 0.75 + }, + { + "min_x": 0.3125, + "min_y": 0.4375, + "min_z": 0.125, + "max_x": 0.375, + "max_y": 0.8125, + "max_z": 0.25 + }, + { + "min_x": 0.3125, + "min_y": 0.4375, + "min_z": 0.75, + "max_x": 0.375, + "max_y": 0.8125, + "max_z": 0.875 + }, + { + "min_x": 0.625, + "min_y": 0.4375, + "min_z": 0.125, + "max_x": 0.6875, + "max_y": 0.8125, + "max_z": 0.25 + }, + { + "min_x": 0.625, + "min_y": 0.4375, + "min_z": 0.75, + "max_x": 0.6875, + "max_y": 0.8125, + "max_z": 0.875 + }, + { + "min_x": 0.25, + "min_y": 0.125, + "min_z": 0.0, + "max_x": 0.75, + "max_y": 0.875, + "max_z": 0.75 + }, + { + "min_x": 0.125, + "min_y": 0.3125, + "min_z": 0.1875, + "max_x": 0.25, + "max_y": 0.6875, + "max_z": 0.5625 + }, + { + "min_x": 0.75, + "min_y": 0.3125, + "min_z": 0.1875, + "max_x": 0.875, + "max_y": 0.6875, + "max_z": 0.5625 + }, + { + "min_x": 0.125, + "min_y": 0.375, + "min_z": 0.5625, + "max_x": 0.25, + "max_y": 0.625, + "max_z": 1.0 + }, + { + "min_x": 0.75, + "min_y": 0.375, + "min_z": 0.5625, + "max_x": 0.875, + "max_y": 0.625, + "max_z": 1.0 + }, + { + "min_x": 0.25, + "min_y": 0.125, + "min_z": 0.25, + "max_x": 0.75, + "max_y": 0.875, + "max_z": 1.0 + }, + { + "min_x": 0.125, + "min_y": 0.3125, + "min_z": 0.4375, + "max_x": 0.25, + "max_y": 0.6875, + "max_z": 0.8125 + }, + { + "min_x": 0.75, + "min_y": 0.3125, + "min_z": 0.4375, + "max_x": 0.875, + "max_y": 0.6875, + "max_z": 0.8125 + }, + { + "min_x": 0.125, + "min_y": 0.375, + "min_z": 0.0, + "max_x": 0.25, + "max_y": 0.625, + "max_z": 0.4375 + }, + { + "min_x": 0.75, + "min_y": 0.375, + "min_z": 0.0, + "max_x": 0.875, + "max_y": 0.625, + "max_z": 0.4375 + }, + { + "min_x": 0.0, + "min_y": 0.125, + "min_z": 0.25, + "max_x": 0.75, + "max_y": 0.875, + "max_z": 0.75 + }, + { + "min_x": 0.1875, + "min_y": 0.3125, + "min_z": 0.125, + "max_x": 0.5625, + "max_y": 0.6875, + "max_z": 0.25 + }, + { + "min_x": 0.1875, + "min_y": 0.3125, + "min_z": 0.75, + "max_x": 0.5625, + "max_y": 0.6875, + "max_z": 0.875 + }, + { + "min_x": 0.5625, + "min_y": 0.375, + "min_z": 0.125, + "max_x": 1.0, + "max_y": 0.625, + "max_z": 0.25 + }, + { + "min_x": 0.5625, + "min_y": 0.375, + "min_z": 0.75, + "max_x": 1.0, + "max_y": 0.625, + "max_z": 0.875 + }, + { + "min_x": 0.25, + "min_y": 0.125, + "min_z": 0.25, + "max_x": 1.0, + "max_y": 0.875, + "max_z": 0.75 + }, + { + "min_x": 0.4375, + "min_y": 0.3125, + "min_z": 0.125, + "max_x": 0.8125, + "max_y": 0.6875, + "max_z": 0.25 + }, + { + "min_x": 0.4375, + "min_y": 0.3125, + "min_z": 0.75, + "max_x": 0.8125, + "max_y": 0.6875, + "max_z": 0.875 + }, + { + "min_x": 0.0, + "min_y": 0.375, + "min_z": 0.125, + "max_x": 0.4375, + "max_y": 0.625, + "max_z": 0.25 + }, + { + "min_x": 0.0, + "min_y": 0.375, + "min_z": 0.75, + "max_x": 0.4375, + "max_y": 0.625, + "max_z": 0.875 + }, + { + "min_x": 0.25, + "min_y": 0.0, + "min_z": 0.125, + "max_x": 0.75, + "max_y": 0.75, + "max_z": 0.875 + }, + { + "min_x": 0.125, + "min_y": 0.1875, + "min_z": 0.3125, + "max_x": 0.25, + "max_y": 0.5625, + "max_z": 0.6875 + }, + { + "min_x": 0.75, + "min_y": 0.1875, + "min_z": 0.3125, + "max_x": 0.875, + "max_y": 0.5625, + "max_z": 0.6875 + }, + { + "min_x": 0.125, + "min_y": 0.5625, + "min_z": 0.375, + "max_x": 0.25, + "max_y": 1.0, + "max_z": 0.625 + }, + { + "min_x": 0.75, + "min_y": 0.5625, + "min_z": 0.375, + "max_x": 0.875, + "max_y": 1.0, + "max_z": 0.625 + }, + { + "min_x": 0.125, + "min_y": 0.0, + "min_z": 0.25, + "max_x": 0.875, + "max_y": 0.75, + "max_z": 0.75 + }, + { + "min_x": 0.3125, + "min_y": 0.1875, + "min_z": 0.125, + "max_x": 0.6875, + "max_y": 0.5625, + "max_z": 0.25 + }, + { + "min_x": 0.3125, + "min_y": 0.1875, + "min_z": 0.75, + "max_x": 0.6875, + "max_y": 0.5625, + "max_z": 0.875 + }, + { + "min_x": 0.375, + "min_y": 0.5625, + "min_z": 0.125, + "max_x": 0.625, + "max_y": 1.0, + "max_z": 0.25 + }, + { + "min_x": 0.375, + "min_y": 0.5625, + "min_z": 0.75, + "max_x": 0.625, + "max_y": 1.0, + "max_z": 0.875 + }, + { + "min_x": 0.25, + "min_y": 0.125, + "min_z": 0.25, + "max_x": 0.75, + "max_y": 0.875, + "max_z": 0.75 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 0.5625, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.25, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.75 + }, + { + "min_x": 0.25, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 0.75, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.25, + "min_y": 0.25, + "min_z": 0.25, + "max_x": 0.75, + "max_y": 0.375, + "max_z": 0.75 + }, + { + "min_x": 0.3125, + "min_y": 0.375, + "min_z": 0.3125, + "max_x": 0.6875, + "max_y": 0.8125, + "max_z": 0.6875 + }, + { + "min_x": 0.4375, + "min_y": 0.8125, + "min_z": 0.4375, + "max_x": 0.5625, + "max_y": 1.0, + "max_z": 0.5625 + }, + { + "min_x": 0.4375, + "min_y": 0.8125, + "min_z": 0.0, + "max_x": 0.5625, + "max_y": 0.9375, + "max_z": 0.8125 + }, + { + "min_x": 0.4375, + "min_y": 0.8125, + "min_z": 0.1875, + "max_x": 0.5625, + "max_y": 0.9375, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.8125, + "min_z": 0.4375, + "max_x": 0.8125, + "max_y": 0.9375, + "max_z": 0.5625 + }, + { + "min_x": 0.1875, + "min_y": 0.8125, + "min_z": 0.4375, + "max_x": 1.0, + "max_y": 0.9375, + "max_z": 0.5625 + }, + { + "min_x": 0.4375, + "min_y": 0.8125, + "min_z": 0.0, + "max_x": 0.5625, + "max_y": 0.9375, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.8125, + "min_z": 0.4375, + "max_x": 1.0, + "max_y": 0.9375, + "max_z": 0.5625 + }, + { + "min_x": 0.3125, + "min_y": 0.0625, + "min_z": 0.3125, + "max_x": 0.6875, + "max_y": 0.5, + "max_z": 0.6875 + }, + { + "min_x": 0.375, + "min_y": 0.5, + "min_z": 0.375, + "max_x": 0.625, + "max_y": 0.625, + "max_z": 0.625 + }, + { + "min_x": 0.3125, + "min_y": 0.0, + "min_z": 0.3125, + "max_x": 0.6875, + "max_y": 0.4375, + "max_z": 0.6875 + }, + { + "min_x": 0.375, + "min_y": 0.4375, + "min_z": 0.375, + "max_x": 0.625, + "max_y": 0.5625, + "max_z": 0.625 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 0.4375, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.125, + "min_z": 0.0, + "max_x": 0.125, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.125, + "min_y": 0.125, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.125 + }, + { + "min_x": 0.125, + "min_y": 0.125, + "min_z": 0.875, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.875, + "min_y": 0.125, + "min_z": 0.125, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.875 + }, + { + "min_x": 0.4375, + "min_y": 0.0, + "min_z": 0.4375, + "max_x": 0.5625, + "max_y": 0.375, + "max_z": 0.5625 + }, + { + "min_x": 0.3125, + "min_y": 0.0, + "min_z": 0.375, + "max_x": 0.6875, + "max_y": 0.375, + "max_z": 0.5625 + }, + { + "min_x": 0.3125, + "min_y": 0.0, + "min_z": 0.375, + "max_x": 0.625, + "max_y": 0.375, + "max_z": 0.6875 + }, + { + "min_x": 0.3125, + "min_y": 0.0, + "min_z": 0.3125, + "max_x": 0.6875, + "max_y": 0.375, + "max_z": 0.625 + }, + { + "min_x": 0.4375, + "min_y": 0.5, + "min_z": 0.4375, + "max_x": 0.5625, + "max_y": 0.875, + "max_z": 0.5625 + }, + { + "min_x": 0.1875, + "min_y": 0.1875, + "min_z": 0.5625, + "max_x": 0.8125, + "max_y": 0.8125, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.1875, + "min_z": 0.1875, + "max_x": 0.4375, + "max_y": 0.8125, + "max_z": 0.8125 + }, + { + "min_x": 0.1875, + "min_y": 0.1875, + "min_z": 0.0, + "max_x": 0.8125, + "max_y": 0.8125, + "max_z": 0.4375 + }, + { + "min_x": 0.5625, + "min_y": 0.1875, + "min_z": 0.1875, + "max_x": 1.0, + "max_y": 0.8125, + "max_z": 0.8125 + }, + { + "min_x": 0.1875, + "min_y": 0.0, + "min_z": 0.1875, + "max_x": 0.8125, + "max_y": 0.4375, + "max_z": 0.8125 + }, + { + "min_x": 0.1875, + "min_y": 0.5625, + "min_z": 0.1875, + "max_x": 0.8125, + "max_y": 1.0, + "max_z": 0.8125 + }, + { + "min_x": 0.1875, + "min_y": 0.1875, + "min_z": 0.6875, + "max_x": 0.8125, + "max_y": 0.8125, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.1875, + "min_z": 0.1875, + "max_x": 0.3125, + "max_y": 0.8125, + "max_z": 0.8125 + }, + { + "min_x": 0.1875, + "min_y": 0.1875, + "min_z": 0.0, + "max_x": 0.8125, + "max_y": 0.8125, + "max_z": 0.3125 + }, + { + "min_x": 0.6875, + "min_y": 0.1875, + "min_z": 0.1875, + "max_x": 1.0, + "max_y": 0.8125, + "max_z": 0.8125 + }, + { + "min_x": 0.1875, + "min_y": 0.0, + "min_z": 0.1875, + "max_x": 0.8125, + "max_y": 0.3125, + "max_z": 0.8125 + }, + { + "min_x": 0.1875, + "min_y": 0.6875, + "min_z": 0.1875, + "max_x": 0.8125, + "max_y": 1.0, + "max_z": 0.8125 + }, + { + "min_x": 0.1875, + "min_y": 0.1875, + "min_z": 0.75, + "max_x": 0.8125, + "max_y": 0.8125, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.1875, + "min_z": 0.1875, + "max_x": 0.25, + "max_y": 0.8125, + "max_z": 0.8125 + }, + { + "min_x": 0.1875, + "min_y": 0.1875, + "min_z": 0.0, + "max_x": 0.8125, + "max_y": 0.8125, + "max_z": 0.25 + }, + { + "min_x": 0.75, + "min_y": 0.1875, + "min_z": 0.1875, + "max_x": 1.0, + "max_y": 0.8125, + "max_z": 0.8125 + }, + { + "min_x": 0.1875, + "min_y": 0.0, + "min_z": 0.1875, + "max_x": 0.8125, + "max_y": 0.25, + "max_z": 0.8125 + }, + { + "min_x": 0.1875, + "min_y": 0.75, + "min_z": 0.1875, + "max_x": 0.8125, + "max_y": 1.0, + "max_z": 0.8125 + }, + { + "min_x": 0.25, + "min_y": 0.25, + "min_z": 0.8125, + "max_x": 0.75, + "max_y": 0.75, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.25, + "min_z": 0.25, + "max_x": 0.1875, + "max_y": 0.75, + "max_z": 0.75 + }, + { + "min_x": 0.25, + "min_y": 0.25, + "min_z": 0.0, + "max_x": 0.75, + "max_y": 0.75, + "max_z": 0.1875 + }, + { + "min_x": 0.8125, + "min_y": 0.25, + "min_z": 0.25, + "max_x": 1.0, + "max_y": 0.75, + "max_z": 0.75 + }, + { + "min_x": 0.25, + "min_y": 0.0, + "min_z": 0.25, + "max_x": 0.75, + "max_y": 0.1875, + "max_z": 0.75 + }, + { + "min_x": 0.1875, + "min_y": 0.0, + "min_z": 0.1875, + "max_x": 0.5625, + "max_y": 1.0, + "max_z": 0.5625 + }, + { + "min_x": 0.1875, + "min_y": 0.0, + "min_z": 0.1875, + "max_x": 0.5625, + "max_y": 0.6875, + "max_z": 0.5625 + }, + { + "min_x": 0.1875, + "min_y": 0.3125, + "min_z": 0.1875, + "max_x": 0.5625, + "max_y": 1.0, + "max_z": 0.5625 + }, + { + "min_x": 0.125, + "min_y": 0.0, + "min_z": 0.125, + "max_x": 0.625, + "max_y": 1.0, + "max_z": 0.625 + }, + { + "min_x": 0.0625, + "min_y": 0.0, + "min_z": 0.0625, + "max_x": 0.6875, + "max_y": 1.0, + "max_z": 0.6875 + }, + { + "min_x": 0.0, + "min_y": 0.0, + "min_z": 0.0, + "max_x": 0.75, + "max_y": 1.0, + "max_z": 0.75 + }, + { + "min_x": 0.0, + "min_y": 0.5, + "min_z": 0.0, + "max_x": 0.375, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.375, + "min_y": 0.5, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.375 + }, + { + "min_x": 0.375, + "min_y": 0.5, + "min_z": 0.625, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 1.0 + }, + { + "min_x": 0.625, + "min_y": 0.5, + "min_z": 0.375, + "max_x": 1.0, + "max_y": 1.0, + "max_z": 0.625 + }, + { + "min_x": 0.0, + "min_y": 0.6875, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 0.9375, + "max_z": 1.0 + }, + { + "min_x": 0.0, + "min_y": 0.6875, + "min_z": 0.0, + "max_x": 1.0, + "max_y": 0.8125, + "max_z": 1.0 + } + ], + "blocks": [ + { + "id": 0, + "name": "air", + "translation_key": "block.minecraft.air", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 0, + "states": [ + { + "id": 0, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 1, + "name": "stone", + "translation_key": "block.minecraft.stone", + "item_id": 1, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 1, + "states": [ + { + "id": 1, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 2, + "name": "granite", + "translation_key": "block.minecraft.granite", + "item_id": 2, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2, + "states": [ + { + "id": 2, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 3, + "name": "polished_granite", + "translation_key": "block.minecraft.polished_granite", + "item_id": 3, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 3, + "states": [ + { + "id": 3, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 4, + "name": "diorite", + "translation_key": "block.minecraft.diorite", + "item_id": 4, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 4, + "states": [ + { + "id": 4, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 5, + "name": "polished_diorite", + "translation_key": "block.minecraft.polished_diorite", + "item_id": 5, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5, + "states": [ + { + "id": 5, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 6, + "name": "andesite", + "translation_key": "block.minecraft.andesite", + "item_id": 6, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 6, + "states": [ + { + "id": 6, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 7, + "name": "polished_andesite", + "translation_key": "block.minecraft.polished_andesite", + "item_id": 7, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 7, + "states": [ + { + "id": 7, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 8, + "name": "grass_block", + "translation_key": "block.minecraft.grass_block", + "item_id": 14, + "hardness": 0.6, + "blast_resistance": 0.6, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "snowy", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9, + "states": [ + { + "id": 8, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 9, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 9, + "name": "dirt", + "translation_key": "block.minecraft.dirt", + "item_id": 15, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10, + "states": [ + { + "id": 10, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 10, + "name": "coarse_dirt", + "translation_key": "block.minecraft.coarse_dirt", + "item_id": 16, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 11, + "states": [ + { + "id": 11, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 11, + "name": "podzol", + "translation_key": "block.minecraft.podzol", + "item_id": 17, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "snowy", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 13, + "states": [ + { + "id": 12, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 13, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 12, + "name": "cobblestone", + "translation_key": "block.minecraft.cobblestone", + "item_id": 22, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 14, + "states": [ + { + "id": 14, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 13, + "name": "oak_planks", + "translation_key": "block.minecraft.oak_planks", + "item_id": 23, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 15, + "states": [ + { + "id": 15, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 14, + "name": "spruce_planks", + "translation_key": "block.minecraft.spruce_planks", + "item_id": 24, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 16, + "states": [ + { + "id": 16, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 15, + "name": "birch_planks", + "translation_key": "block.minecraft.birch_planks", + "item_id": 25, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 17, + "states": [ + { + "id": 17, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 16, + "name": "jungle_planks", + "translation_key": "block.minecraft.jungle_planks", + "item_id": 26, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 18, + "states": [ + { + "id": 18, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 17, + "name": "acacia_planks", + "translation_key": "block.minecraft.acacia_planks", + "item_id": 27, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 19, + "states": [ + { + "id": 19, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 18, + "name": "cherry_planks", + "translation_key": "block.minecraft.cherry_planks", + "item_id": 28, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 20, + "states": [ + { + "id": 20, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 19, + "name": "dark_oak_planks", + "translation_key": "block.minecraft.dark_oak_planks", + "item_id": 29, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 21, + "states": [ + { + "id": 21, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 20, + "name": "mangrove_planks", + "translation_key": "block.minecraft.mangrove_planks", + "item_id": 30, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 22, + "states": [ + { + "id": 22, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 21, + "name": "bamboo_planks", + "translation_key": "block.minecraft.bamboo_planks", + "item_id": 31, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 23, + "states": [ + { + "id": 23, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 22, + "name": "bamboo_mosaic", + "translation_key": "block.minecraft.bamboo_mosaic", + "item_id": 34, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 24, + "states": [ + { + "id": 24, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 23, + "name": "oak_sapling", + "translation_key": "block.minecraft.oak_sapling", + "item_id": 35, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "stage", + "values": [ + "0", + "1" + ] + } + ], + "default_state_id": 25, + "states": [ + { + "id": 25, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 26, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 24, + "name": "spruce_sapling", + "translation_key": "block.minecraft.spruce_sapling", + "item_id": 36, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "stage", + "values": [ + "0", + "1" + ] + } + ], + "default_state_id": 27, + "states": [ + { + "id": 27, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 28, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 25, + "name": "birch_sapling", + "translation_key": "block.minecraft.birch_sapling", + "item_id": 37, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "stage", + "values": [ + "0", + "1" + ] + } + ], + "default_state_id": 29, + "states": [ + { + "id": 29, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 30, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 26, + "name": "jungle_sapling", + "translation_key": "block.minecraft.jungle_sapling", + "item_id": 38, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "stage", + "values": [ + "0", + "1" + ] + } + ], + "default_state_id": 31, + "states": [ + { + "id": 31, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 32, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 27, + "name": "acacia_sapling", + "translation_key": "block.minecraft.acacia_sapling", + "item_id": 39, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "stage", + "values": [ + "0", + "1" + ] + } + ], + "default_state_id": 33, + "states": [ + { + "id": 33, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 34, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 28, + "name": "cherry_sapling", + "translation_key": "block.minecraft.cherry_sapling", + "item_id": 40, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "stage", + "values": [ + "0", + "1" + ] + } + ], + "default_state_id": 35, + "states": [ + { + "id": 35, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 36, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 29, + "name": "dark_oak_sapling", + "translation_key": "block.minecraft.dark_oak_sapling", + "item_id": 41, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "stage", + "values": [ + "0", + "1" + ] + } + ], + "default_state_id": 37, + "states": [ + { + "id": 37, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 38, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 30, + "name": "mangrove_propagule", + "translation_key": "block.minecraft.mangrove_propagule", + "item_id": 42, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "age", + "values": [ + "0", + "1", + "2", + "3", + "4" + ] + }, + { + "name": "hanging", + "values": [ + "true", + "false" + ] + }, + { + "name": "stage", + "values": [ + "0", + "1" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 44, + "states": [ + { + "id": 39, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 40, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 41, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 42, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 43, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 44, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 45, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 46, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 47, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 48, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 49, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 50, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 51, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 52, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 53, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 54, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 55, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 56, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 57, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 58, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 59, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 60, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 61, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 62, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 63, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 64, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 65, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 66, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 67, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 68, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 69, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 70, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 71, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 72, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 73, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 74, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 75, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 76, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 77, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 78, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 31, + "name": "bedrock", + "translation_key": "block.minecraft.bedrock", + "item_id": 43, + "hardness": -1.0, + "blast_resistance": 3600000.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 79, + "states": [ + { + "id": 79, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 32, + "name": "water", + "translation_key": "block.minecraft.water", + "item_id": 0, + "hardness": 100.0, + "blast_resistance": 100.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "level", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 80, + "states": [ + { + "id": 80, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 81, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 82, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 83, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 84, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 85, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 86, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 87, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 88, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 89, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 90, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 91, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 92, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 93, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 94, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 95, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 33, + "name": "lava", + "translation_key": "block.minecraft.lava", + "item_id": 0, + "hardness": 100.0, + "blast_resistance": 100.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "level", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 96, + "states": [ + { + "id": 96, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 97, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 98, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 99, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 100, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 101, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 102, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 103, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 104, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 105, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 106, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 107, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 108, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 109, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 110, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 111, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 34, + "name": "sand", + "translation_key": "block.minecraft.sand", + "item_id": 44, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 112, + "states": [ + { + "id": 112, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 35, + "name": "suspicious_sand", + "translation_key": "block.minecraft.suspicious_sand", + "item_id": 45, + "hardness": 0.25, + "blast_resistance": 0.25, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "dusted", + "values": [ + "0", + "1", + "2", + "3" + ] + } + ], + "default_state_id": 113, + "states": [ + { + "id": 113, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 39 + }, + { + "id": 114, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 39 + }, + { + "id": 115, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 39 + }, + { + "id": 116, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 39 + } + ] + }, + { + "id": 36, + "name": "red_sand", + "translation_key": "block.minecraft.red_sand", + "item_id": 47, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 117, + "states": [ + { + "id": 117, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 37, + "name": "gravel", + "translation_key": "block.minecraft.gravel", + "item_id": 48, + "hardness": 0.6, + "blast_resistance": 0.6, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 118, + "states": [ + { + "id": 118, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 38, + "name": "suspicious_gravel", + "translation_key": "block.minecraft.suspicious_gravel", + "item_id": 46, + "hardness": 0.25, + "blast_resistance": 0.25, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "dusted", + "values": [ + "0", + "1", + "2", + "3" + ] + } + ], + "default_state_id": 119, + "states": [ + { + "id": 119, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 39 + }, + { + "id": 120, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 39 + }, + { + "id": 121, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 39 + }, + { + "id": 122, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 39 + } + ] + }, + { + "id": 39, + "name": "gold_ore", + "translation_key": "block.minecraft.gold_ore", + "item_id": 55, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 123, + "states": [ + { + "id": 123, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 40, + "name": "deepslate_gold_ore", + "translation_key": "block.minecraft.deepslate_gold_ore", + "item_id": 56, + "hardness": 4.5, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 124, + "states": [ + { + "id": 124, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 41, + "name": "iron_ore", + "translation_key": "block.minecraft.iron_ore", + "item_id": 51, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 125, + "states": [ + { + "id": 125, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 42, + "name": "deepslate_iron_ore", + "translation_key": "block.minecraft.deepslate_iron_ore", + "item_id": 52, + "hardness": 4.5, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 126, + "states": [ + { + "id": 126, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 43, + "name": "coal_ore", + "translation_key": "block.minecraft.coal_ore", + "item_id": 49, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 127, + "states": [ + { + "id": 127, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 44, + "name": "deepslate_coal_ore", + "translation_key": "block.minecraft.deepslate_coal_ore", + "item_id": 50, + "hardness": 4.5, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 128, + "states": [ + { + "id": 128, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 45, + "name": "nether_gold_ore", + "translation_key": "block.minecraft.nether_gold_ore", + "item_id": 65, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 129, + "states": [ + { + "id": 129, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 46, + "name": "oak_log", + "translation_key": "block.minecraft.oak_log", + "item_id": 110, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 131, + "states": [ + { + "id": 130, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 131, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 132, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 47, + "name": "spruce_log", + "translation_key": "block.minecraft.spruce_log", + "item_id": 111, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 134, + "states": [ + { + "id": 133, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 134, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 135, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 48, + "name": "birch_log", + "translation_key": "block.minecraft.birch_log", + "item_id": 112, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 137, + "states": [ + { + "id": 136, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 137, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 138, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 49, + "name": "jungle_log", + "translation_key": "block.minecraft.jungle_log", + "item_id": 113, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 140, + "states": [ + { + "id": 139, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 140, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 141, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 50, + "name": "acacia_log", + "translation_key": "block.minecraft.acacia_log", + "item_id": 114, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 143, + "states": [ + { + "id": 142, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 143, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 144, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 51, + "name": "cherry_log", + "translation_key": "block.minecraft.cherry_log", + "item_id": 115, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 146, + "states": [ + { + "id": 145, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 146, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 147, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 52, + "name": "dark_oak_log", + "translation_key": "block.minecraft.dark_oak_log", + "item_id": 116, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 149, + "states": [ + { + "id": 148, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 149, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 150, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 53, + "name": "mangrove_log", + "translation_key": "block.minecraft.mangrove_log", + "item_id": 117, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 152, + "states": [ + { + "id": 151, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 152, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 153, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 54, + "name": "mangrove_roots", + "translation_key": "block.minecraft.mangrove_roots", + "item_id": 118, + "hardness": 0.7, + "blast_resistance": 0.7, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 155, + "states": [ + { + "id": 154, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 155, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 55, + "name": "muddy_mangrove_roots", + "translation_key": "block.minecraft.muddy_mangrove_roots", + "item_id": 119, + "hardness": 0.7, + "blast_resistance": 0.7, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 157, + "states": [ + { + "id": 156, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 157, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 158, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 56, + "name": "bamboo_block", + "translation_key": "block.minecraft.bamboo_block", + "item_id": 122, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 160, + "states": [ + { + "id": 159, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 160, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 161, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 57, + "name": "stripped_spruce_log", + "translation_key": "block.minecraft.stripped_spruce_log", + "item_id": 124, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 163, + "states": [ + { + "id": 162, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 163, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 164, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 58, + "name": "stripped_birch_log", + "translation_key": "block.minecraft.stripped_birch_log", + "item_id": 125, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 166, + "states": [ + { + "id": 165, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 166, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 167, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 59, + "name": "stripped_jungle_log", + "translation_key": "block.minecraft.stripped_jungle_log", + "item_id": 126, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 169, + "states": [ + { + "id": 168, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 169, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 170, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 60, + "name": "stripped_acacia_log", + "translation_key": "block.minecraft.stripped_acacia_log", + "item_id": 127, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 172, + "states": [ + { + "id": 171, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 172, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 173, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 61, + "name": "stripped_cherry_log", + "translation_key": "block.minecraft.stripped_cherry_log", + "item_id": 128, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 175, + "states": [ + { + "id": 174, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 175, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 176, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 62, + "name": "stripped_dark_oak_log", + "translation_key": "block.minecraft.stripped_dark_oak_log", + "item_id": 129, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 178, + "states": [ + { + "id": 177, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 178, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 179, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 63, + "name": "stripped_oak_log", + "translation_key": "block.minecraft.stripped_oak_log", + "item_id": 123, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 181, + "states": [ + { + "id": 180, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 181, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 182, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 64, + "name": "stripped_mangrove_log", + "translation_key": "block.minecraft.stripped_mangrove_log", + "item_id": 130, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 184, + "states": [ + { + "id": 183, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 184, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 185, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 65, + "name": "stripped_bamboo_block", + "translation_key": "block.minecraft.stripped_bamboo_block", + "item_id": 143, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 187, + "states": [ + { + "id": 186, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 187, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 188, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 66, + "name": "oak_wood", + "translation_key": "block.minecraft.oak_wood", + "item_id": 144, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 190, + "states": [ + { + "id": 189, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 190, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 191, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 67, + "name": "spruce_wood", + "translation_key": "block.minecraft.spruce_wood", + "item_id": 145, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 193, + "states": [ + { + "id": 192, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 193, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 194, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 68, + "name": "birch_wood", + "translation_key": "block.minecraft.birch_wood", + "item_id": 146, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 196, + "states": [ + { + "id": 195, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 196, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 197, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 69, + "name": "jungle_wood", + "translation_key": "block.minecraft.jungle_wood", + "item_id": 147, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 199, + "states": [ + { + "id": 198, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 199, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 200, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 70, + "name": "acacia_wood", + "translation_key": "block.minecraft.acacia_wood", + "item_id": 148, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 202, + "states": [ + { + "id": 201, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 202, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 203, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 71, + "name": "cherry_wood", + "translation_key": "block.minecraft.cherry_wood", + "item_id": 149, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 205, + "states": [ + { + "id": 204, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 205, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 206, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 72, + "name": "dark_oak_wood", + "translation_key": "block.minecraft.dark_oak_wood", + "item_id": 150, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 208, + "states": [ + { + "id": 207, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 208, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 209, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 73, + "name": "mangrove_wood", + "translation_key": "block.minecraft.mangrove_wood", + "item_id": 151, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 211, + "states": [ + { + "id": 210, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 211, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 212, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 74, + "name": "stripped_oak_wood", + "translation_key": "block.minecraft.stripped_oak_wood", + "item_id": 133, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 214, + "states": [ + { + "id": 213, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 214, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 215, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 75, + "name": "stripped_spruce_wood", + "translation_key": "block.minecraft.stripped_spruce_wood", + "item_id": 134, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 217, + "states": [ + { + "id": 216, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 217, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 218, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 76, + "name": "stripped_birch_wood", + "translation_key": "block.minecraft.stripped_birch_wood", + "item_id": 135, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 220, + "states": [ + { + "id": 219, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 220, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 221, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 77, + "name": "stripped_jungle_wood", + "translation_key": "block.minecraft.stripped_jungle_wood", + "item_id": 136, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 223, + "states": [ + { + "id": 222, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 223, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 224, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 78, + "name": "stripped_acacia_wood", + "translation_key": "block.minecraft.stripped_acacia_wood", + "item_id": 137, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 226, + "states": [ + { + "id": 225, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 226, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 227, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 79, + "name": "stripped_cherry_wood", + "translation_key": "block.minecraft.stripped_cherry_wood", + "item_id": 138, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 229, + "states": [ + { + "id": 228, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 229, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 230, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 80, + "name": "stripped_dark_oak_wood", + "translation_key": "block.minecraft.stripped_dark_oak_wood", + "item_id": 139, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 232, + "states": [ + { + "id": 231, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 232, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 233, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 81, + "name": "stripped_mangrove_wood", + "translation_key": "block.minecraft.stripped_mangrove_wood", + "item_id": 140, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 235, + "states": [ + { + "id": 234, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 235, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 236, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 82, + "name": "oak_leaves", + "translation_key": "block.minecraft.oak_leaves", + "item_id": 154, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "distance", + "values": [ + "1", + "2", + "3", + "4", + "5", + "6", + "7" + ] + }, + { + "name": "persistent", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 264, + "states": [ + { + "id": 237, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 238, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 239, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 240, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 241, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 242, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 243, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 244, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 245, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 246, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 247, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 248, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 249, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 250, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 251, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 252, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 253, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 254, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 255, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 256, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 257, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 258, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 259, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 260, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 261, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 262, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 263, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 264, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 83, + "name": "spruce_leaves", + "translation_key": "block.minecraft.spruce_leaves", + "item_id": 155, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "distance", + "values": [ + "1", + "2", + "3", + "4", + "5", + "6", + "7" + ] + }, + { + "name": "persistent", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 292, + "states": [ + { + "id": 265, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 266, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 267, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 268, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 269, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 270, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 271, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 272, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 273, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 274, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 275, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 276, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 277, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 278, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 279, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 280, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 281, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 282, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 283, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 284, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 285, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 286, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 287, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 288, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 289, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 290, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 291, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 292, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 84, + "name": "birch_leaves", + "translation_key": "block.minecraft.birch_leaves", + "item_id": 156, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "distance", + "values": [ + "1", + "2", + "3", + "4", + "5", + "6", + "7" + ] + }, + { + "name": "persistent", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 320, + "states": [ + { + "id": 293, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 294, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 295, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 296, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 297, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 298, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 299, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 300, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 301, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 302, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 303, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 304, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 305, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 306, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 307, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 308, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 309, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 310, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 311, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 312, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 313, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 314, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 315, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 316, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 317, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 318, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 319, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 320, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 85, + "name": "jungle_leaves", + "translation_key": "block.minecraft.jungle_leaves", + "item_id": 157, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "distance", + "values": [ + "1", + "2", + "3", + "4", + "5", + "6", + "7" + ] + }, + { + "name": "persistent", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 348, + "states": [ + { + "id": 321, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 322, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 323, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 324, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 325, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 326, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 327, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 328, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 329, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 330, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 331, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 332, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 333, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 334, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 335, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 336, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 337, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 338, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 339, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 340, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 341, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 342, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 343, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 344, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 345, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 346, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 347, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 348, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 86, + "name": "acacia_leaves", + "translation_key": "block.minecraft.acacia_leaves", + "item_id": 158, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "distance", + "values": [ + "1", + "2", + "3", + "4", + "5", + "6", + "7" + ] + }, + { + "name": "persistent", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 376, + "states": [ + { + "id": 349, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 350, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 351, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 352, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 353, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 354, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 355, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 356, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 357, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 358, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 359, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 360, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 361, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 362, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 363, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 364, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 365, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 366, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 367, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 368, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 369, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 370, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 371, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 372, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 373, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 374, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 375, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 376, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 87, + "name": "cherry_leaves", + "translation_key": "block.minecraft.cherry_leaves", + "item_id": 159, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "distance", + "values": [ + "1", + "2", + "3", + "4", + "5", + "6", + "7" + ] + }, + { + "name": "persistent", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 404, + "states": [ + { + "id": 377, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 378, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 379, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 380, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 381, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 382, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 383, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 384, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 385, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 386, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 387, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 388, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 389, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 390, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 391, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 392, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 393, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 394, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 395, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 396, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 397, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 398, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 399, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 400, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 401, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 402, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 403, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 404, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 88, + "name": "dark_oak_leaves", + "translation_key": "block.minecraft.dark_oak_leaves", + "item_id": 160, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "distance", + "values": [ + "1", + "2", + "3", + "4", + "5", + "6", + "7" + ] + }, + { + "name": "persistent", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 432, + "states": [ + { + "id": 405, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 406, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 407, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 408, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 409, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 410, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 411, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 412, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 413, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 414, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 415, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 416, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 417, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 418, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 419, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 420, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 421, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 422, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 423, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 424, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 425, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 426, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 427, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 428, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 429, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 430, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 431, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 432, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 89, + "name": "mangrove_leaves", + "translation_key": "block.minecraft.mangrove_leaves", + "item_id": 161, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "distance", + "values": [ + "1", + "2", + "3", + "4", + "5", + "6", + "7" + ] + }, + { + "name": "persistent", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 460, + "states": [ + { + "id": 433, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 434, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 435, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 436, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 437, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 438, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 439, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 440, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 441, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 442, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 443, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 444, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 445, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 446, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 447, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 448, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 449, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 450, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 451, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 452, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 453, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 454, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 455, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 456, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 457, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 458, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 459, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 460, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 90, + "name": "azalea_leaves", + "translation_key": "block.minecraft.azalea_leaves", + "item_id": 162, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "distance", + "values": [ + "1", + "2", + "3", + "4", + "5", + "6", + "7" + ] + }, + { + "name": "persistent", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 488, + "states": [ + { + "id": 461, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 462, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 463, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 464, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 465, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 466, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 467, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 468, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 469, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 470, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 471, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 472, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 473, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 474, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 475, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 476, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 477, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 478, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 479, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 480, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 481, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 482, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 483, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 484, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 485, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 486, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 487, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 488, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 91, + "name": "flowering_azalea_leaves", + "translation_key": "block.minecraft.flowering_azalea_leaves", + "item_id": 163, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "distance", + "values": [ + "1", + "2", + "3", + "4", + "5", + "6", + "7" + ] + }, + { + "name": "persistent", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 516, + "states": [ + { + "id": 489, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 490, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 491, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 492, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 493, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 494, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 495, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 496, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 497, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 498, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 499, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 500, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 501, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 502, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 503, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 504, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 505, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 506, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 507, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 508, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 509, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 510, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 511, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 512, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 513, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 514, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 515, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 516, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 92, + "name": "sponge", + "translation_key": "block.minecraft.sponge", + "item_id": 164, + "hardness": 0.6, + "blast_resistance": 0.6, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 517, + "states": [ + { + "id": 517, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 93, + "name": "wet_sponge", + "translation_key": "block.minecraft.wet_sponge", + "item_id": 165, + "hardness": 0.6, + "blast_resistance": 0.6, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 518, + "states": [ + { + "id": 518, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 94, + "name": "glass", + "translation_key": "block.minecraft.glass", + "item_id": 166, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 519, + "states": [ + { + "id": 519, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 95, + "name": "lapis_ore", + "translation_key": "block.minecraft.lapis_ore", + "item_id": 61, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 520, + "states": [ + { + "id": 520, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 96, + "name": "deepslate_lapis_ore", + "translation_key": "block.minecraft.deepslate_lapis_ore", + "item_id": 62, + "hardness": 4.5, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 521, + "states": [ + { + "id": 521, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 97, + "name": "lapis_block", + "translation_key": "block.minecraft.lapis_block", + "item_id": 168, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 522, + "states": [ + { + "id": 522, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 98, + "name": "dispenser", + "translation_key": "block.minecraft.dispenser", + "item_id": 646, + "hardness": 3.5, + "blast_resistance": 3.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + }, + { + "name": "triggered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 524, + "states": [ + { + "id": 523, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 5 + }, + { + "id": 524, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 5 + }, + { + "id": 525, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 5 + }, + { + "id": 526, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 5 + }, + { + "id": 527, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 5 + }, + { + "id": 528, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 5 + }, + { + "id": 529, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 5 + }, + { + "id": 530, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 5 + }, + { + "id": 531, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 5 + }, + { + "id": 532, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 5 + }, + { + "id": 533, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 5 + }, + { + "id": 534, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 5 + } + ] + }, + { + "id": 99, + "name": "sandstone", + "translation_key": "block.minecraft.sandstone", + "item_id": 169, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 535, + "states": [ + { + "id": 535, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 100, + "name": "chiseled_sandstone", + "translation_key": "block.minecraft.chiseled_sandstone", + "item_id": 170, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 536, + "states": [ + { + "id": 536, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 101, + "name": "cut_sandstone", + "translation_key": "block.minecraft.cut_sandstone", + "item_id": 171, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 537, + "states": [ + { + "id": 537, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 102, + "name": "note_block", + "translation_key": "block.minecraft.note_block", + "item_id": 659, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "instrument", + "values": [ + "harp", + "basedrum", + "snare", + "hat", + "bass", + "flute", + "bell", + "guitar", + "chime", + "xylophone", + "iron_xylophone", + "cow_bell", + "didgeridoo", + "bit", + "banjo", + "pling", + "zombie", + "skeleton", + "creeper", + "dragon", + "wither_skeleton", + "piglin", + "custom_head" + ] + }, + { + "name": "note", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 539, + "states": [ + { + "id": 538, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 539, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 540, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 541, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 542, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 543, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 544, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 545, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 546, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 547, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 548, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 549, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 550, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 551, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 552, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 553, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 554, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 555, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 556, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 557, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 558, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 559, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 560, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 561, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 562, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 563, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 564, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 565, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 566, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 567, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 568, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 569, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 570, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 571, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 572, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 573, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 574, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 575, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 576, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 577, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 578, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 579, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 580, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 581, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 582, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 583, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 584, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 585, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 586, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 587, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 588, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 589, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 590, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 591, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 592, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 593, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 594, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 595, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 596, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 597, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 598, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 599, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 600, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 601, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 602, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 603, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 604, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 605, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 606, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 607, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 608, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 609, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 610, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 611, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 612, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 613, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 614, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 615, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 616, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 617, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 618, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 619, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 620, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 621, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 622, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 623, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 624, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 625, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 626, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 627, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 628, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 629, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 630, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 631, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 632, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 633, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 634, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 635, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 636, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 637, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 638, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 639, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 640, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 641, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 642, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 643, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 644, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 645, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 646, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 647, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 648, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 649, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 650, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 651, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 652, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 653, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 654, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 655, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 656, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 657, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 658, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 659, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 660, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 661, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 662, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 663, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 664, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 665, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 666, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 667, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 668, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 669, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 670, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 671, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 672, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 673, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 674, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 675, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 676, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 677, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 678, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 679, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 680, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 681, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 682, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 683, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 684, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 685, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 686, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 687, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 688, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 689, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 690, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 691, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 692, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 693, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 694, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 695, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 696, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 697, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 698, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 699, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 700, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 701, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 702, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 703, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 704, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 705, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 706, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 707, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 708, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 709, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 710, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 711, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 712, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 713, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 714, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 715, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 716, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 717, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 718, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 719, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 720, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 721, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 722, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 723, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 724, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 725, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 726, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 727, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 728, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 729, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 730, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 731, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 732, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 733, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 734, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 735, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 736, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 737, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 738, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 739, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 740, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 741, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 742, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 743, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 744, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 745, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 746, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 747, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 748, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 749, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 750, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 751, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 752, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 753, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 754, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 755, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 756, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 757, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 758, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 759, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 760, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 761, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 762, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 763, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 764, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 765, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 766, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 767, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 768, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 769, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 770, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 771, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 772, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 773, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 774, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 775, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 776, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 777, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 778, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 779, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 780, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 781, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 782, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 783, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 784, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 785, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 786, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 787, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 788, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 789, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 790, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 791, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 792, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 793, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 794, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 795, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 796, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 797, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 798, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 799, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 800, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 801, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 802, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 803, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 804, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 805, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 806, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 807, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 808, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 809, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 810, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 811, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 812, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 813, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 814, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 815, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 816, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 817, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 818, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 819, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 820, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 821, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 822, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 823, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 824, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 825, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 826, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 827, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 828, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 829, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 830, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 831, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 832, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 833, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 834, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 835, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 836, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 837, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 838, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 839, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 840, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 841, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 842, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 843, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 844, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 845, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 846, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 847, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 848, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 849, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 850, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 851, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 852, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 853, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 854, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 855, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 856, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 857, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 858, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 859, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 860, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 861, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 862, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 863, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 864, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 865, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 866, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 867, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 868, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 869, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 870, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 871, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 872, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 873, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 874, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 875, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 876, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 877, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 878, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 879, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 880, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 881, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 882, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 883, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 884, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 885, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 886, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 887, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 888, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 889, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 890, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 891, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 892, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 893, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 894, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 895, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 896, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 897, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 898, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 899, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 900, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 901, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 902, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 903, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 904, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 905, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 906, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 907, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 908, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 909, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 910, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 911, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 912, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 913, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 914, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 915, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 916, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 917, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 918, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 919, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 920, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 921, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 922, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 923, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 924, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 925, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 926, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 927, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 928, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 929, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 930, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 931, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 932, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 933, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 934, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 935, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 936, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 937, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 938, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 939, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 940, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 941, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 942, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 943, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 944, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 945, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 946, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 947, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 948, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 949, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 950, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 951, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 952, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 953, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 954, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 955, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 956, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 957, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 958, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 959, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 960, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 961, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 962, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 963, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 964, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 965, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 966, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 967, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 968, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 969, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 970, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 971, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 972, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 973, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 974, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 975, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 976, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 977, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 978, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 979, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 980, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 981, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 982, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 983, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 984, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 985, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 986, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 987, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 988, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 989, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 990, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 991, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 992, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 993, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 994, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 995, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 996, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 997, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 998, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 999, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1000, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1001, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1002, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1003, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1004, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1005, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1006, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1007, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1008, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1009, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1010, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1011, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1012, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1013, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1014, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1015, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1016, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1017, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1018, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1019, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1020, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1021, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1022, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1023, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1024, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1025, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1026, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1027, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1028, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1029, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1030, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1031, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1032, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1033, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1034, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1035, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1036, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1037, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1038, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1039, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1040, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1041, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1042, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1043, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1044, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1045, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1046, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1047, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1048, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1049, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1050, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1051, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1052, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1053, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1054, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1055, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1056, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1057, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1058, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1059, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1060, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1061, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1062, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1063, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1064, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1065, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1066, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1067, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1068, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1069, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1070, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1071, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1072, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1073, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1074, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1075, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1076, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1077, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1078, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1079, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1080, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1081, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1082, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1083, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1084, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1085, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1086, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1087, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1088, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1089, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1090, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1091, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1092, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1093, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1094, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1095, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1096, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1097, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1098, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1099, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1100, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1101, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1102, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1103, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1104, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1105, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1106, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1107, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1108, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1109, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1110, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1111, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1112, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1113, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1114, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1115, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1116, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1117, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1118, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1119, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1120, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1121, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1122, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1123, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1124, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1125, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1126, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1127, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1128, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1129, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1130, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1131, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1132, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1133, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1134, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1135, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1136, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1137, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1138, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1139, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1140, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1141, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1142, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1143, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1144, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1145, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1146, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1147, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1148, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1149, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1150, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1151, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1152, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1153, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1154, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1155, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1156, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1157, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1158, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1159, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1160, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1161, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1162, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1163, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1164, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1165, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1166, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1167, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1168, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1169, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1170, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1171, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1172, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1173, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1174, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1175, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1176, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1177, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1178, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1179, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1180, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1181, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1182, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1183, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1184, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1185, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1186, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1187, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1188, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1189, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1190, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1191, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1192, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1193, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1194, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1195, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1196, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1197, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1198, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1199, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1200, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1201, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1202, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1203, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1204, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1205, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1206, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1207, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1208, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1209, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1210, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1211, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1212, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1213, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1214, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1215, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1216, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1217, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1218, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1219, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1220, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1221, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1222, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1223, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1224, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1225, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1226, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1227, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1228, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1229, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1230, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1231, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1232, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1233, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1234, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1235, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1236, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1237, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1238, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1239, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1240, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1241, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1242, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1243, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1244, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1245, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1246, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1247, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1248, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1249, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1250, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1251, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1252, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1253, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1254, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1255, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1256, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1257, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1258, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1259, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1260, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1261, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1262, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1263, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1264, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1265, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1266, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1267, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1268, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1269, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1270, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1271, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1272, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1273, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1274, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1275, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1276, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1277, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1278, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1279, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1280, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1281, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1282, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1283, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1284, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1285, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1286, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1287, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1288, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1289, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1290, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1291, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1292, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1293, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1294, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1295, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1296, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1297, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1298, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1299, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1300, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1301, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1302, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1303, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1304, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1305, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1306, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1307, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1308, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1309, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1310, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1311, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1312, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1313, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1314, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1315, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1316, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1317, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1318, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1319, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1320, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1321, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1322, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1323, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1324, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1325, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1326, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1327, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1328, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1329, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1330, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1331, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1332, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1333, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1334, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1335, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1336, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1337, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1338, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1339, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1340, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1341, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1342, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1343, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1344, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1345, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1346, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1347, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1348, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1349, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1350, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1351, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1352, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1353, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1354, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1355, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1356, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1357, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1358, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1359, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1360, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1361, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1362, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1363, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1364, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1365, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1366, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1367, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1368, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1369, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1370, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1371, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1372, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1373, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1374, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1375, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1376, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1377, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1378, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1379, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1380, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1381, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1382, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1383, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1384, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1385, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1386, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1387, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1388, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1389, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1390, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1391, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1392, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1393, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1394, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1395, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1396, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1397, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1398, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1399, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1400, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1401, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1402, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1403, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1404, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1405, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1406, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1407, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1408, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1409, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1410, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1411, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1412, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1413, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1414, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1415, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1416, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1417, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1418, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1419, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1420, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1421, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1422, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1423, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1424, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1425, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1426, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1427, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1428, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1429, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1430, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1431, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1432, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1433, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1434, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1435, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1436, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1437, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1438, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1439, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1440, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1441, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1442, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1443, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1444, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1445, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1446, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1447, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1448, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1449, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1450, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1451, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1452, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1453, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1454, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1455, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1456, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1457, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1458, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1459, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1460, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1461, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1462, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1463, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1464, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1465, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1466, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1467, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1468, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1469, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1470, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1471, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1472, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1473, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1474, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1475, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1476, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1477, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1478, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1479, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1480, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1481, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1482, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1483, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1484, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1485, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1486, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1487, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1488, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1489, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1490, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1491, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1492, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1493, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1494, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1495, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1496, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1497, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1498, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1499, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1500, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1501, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1502, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1503, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1504, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1505, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1506, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1507, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1508, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1509, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1510, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1511, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1512, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1513, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1514, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1515, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1516, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1517, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1518, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1519, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1520, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1521, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1522, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1523, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1524, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1525, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1526, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1527, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1528, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1529, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1530, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1531, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1532, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1533, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1534, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1535, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1536, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1537, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1538, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1539, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1540, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1541, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1542, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1543, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1544, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1545, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1546, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1547, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1548, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1549, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1550, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1551, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1552, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1553, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1554, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1555, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1556, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1557, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1558, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1559, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1560, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1561, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1562, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1563, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1564, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1565, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1566, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1567, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1568, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1569, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1570, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1571, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1572, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1573, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1574, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1575, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1576, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1577, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1578, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1579, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1580, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1581, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1582, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1583, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1584, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1585, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1586, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1587, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1588, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1589, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1590, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1591, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1592, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1593, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1594, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1595, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1596, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1597, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1598, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1599, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1600, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1601, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1602, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1603, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1604, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1605, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1606, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1607, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1608, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1609, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1610, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1611, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1612, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1613, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1614, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1615, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1616, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1617, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1618, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1619, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1620, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1621, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1622, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1623, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1624, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1625, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1626, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1627, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1628, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1629, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1630, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1631, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1632, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1633, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1634, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1635, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1636, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1637, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1638, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1639, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1640, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1641, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1642, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1643, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1644, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1645, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1646, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1647, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1648, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1649, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1650, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1651, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1652, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1653, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1654, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1655, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1656, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1657, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1658, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1659, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1660, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1661, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1662, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1663, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1664, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1665, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1666, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1667, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1668, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1669, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1670, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1671, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1672, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1673, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1674, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1675, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1676, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1677, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1678, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1679, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1680, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1681, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1682, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1683, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1684, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1685, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1686, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1687, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 103, + "name": "white_bed", + "translation_key": "block.minecraft.white_bed", + "item_id": 924, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "occupied", + "values": [ + "true", + "false" + ] + }, + { + "name": "part", + "values": [ + "head", + "foot" + ] + } + ], + "default_state_id": 1691, + "states": [ + { + "id": 1688, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1689, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1690, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1691, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1692, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1693, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1694, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1695, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1696, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1697, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1698, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1699, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1700, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1701, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1702, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1703, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + } + ] + }, + { + "id": 104, + "name": "orange_bed", + "translation_key": "block.minecraft.orange_bed", + "item_id": 925, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "occupied", + "values": [ + "true", + "false" + ] + }, + { + "name": "part", + "values": [ + "head", + "foot" + ] + } + ], + "default_state_id": 1707, + "states": [ + { + "id": 1704, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1705, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1706, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1707, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1708, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1709, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1710, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1711, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1712, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1713, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1714, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1715, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1716, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1717, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1718, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1719, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + } + ] + }, + { + "id": 105, + "name": "magenta_bed", + "translation_key": "block.minecraft.magenta_bed", + "item_id": 926, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "occupied", + "values": [ + "true", + "false" + ] + }, + { + "name": "part", + "values": [ + "head", + "foot" + ] + } + ], + "default_state_id": 1723, + "states": [ + { + "id": 1720, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1721, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1722, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1723, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1724, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1725, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1726, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1727, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1728, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1729, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1730, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1731, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1732, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1733, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1734, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1735, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + } + ] + }, + { + "id": 106, + "name": "light_blue_bed", + "translation_key": "block.minecraft.light_blue_bed", + "item_id": 927, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "occupied", + "values": [ + "true", + "false" + ] + }, + { + "name": "part", + "values": [ + "head", + "foot" + ] + } + ], + "default_state_id": 1739, + "states": [ + { + "id": 1736, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1737, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1738, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1739, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1740, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1741, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1742, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1743, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1744, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1745, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1746, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1747, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1748, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1749, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1750, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1751, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + } + ] + }, + { + "id": 107, + "name": "yellow_bed", + "translation_key": "block.minecraft.yellow_bed", + "item_id": 928, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "occupied", + "values": [ + "true", + "false" + ] + }, + { + "name": "part", + "values": [ + "head", + "foot" + ] + } + ], + "default_state_id": 1755, + "states": [ + { + "id": 1752, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1753, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1754, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1755, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1756, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1757, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1758, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1759, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1760, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1761, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1762, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1763, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1764, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1765, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1766, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1767, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + } + ] + }, + { + "id": 108, + "name": "lime_bed", + "translation_key": "block.minecraft.lime_bed", + "item_id": 929, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "occupied", + "values": [ + "true", + "false" + ] + }, + { + "name": "part", + "values": [ + "head", + "foot" + ] + } + ], + "default_state_id": 1771, + "states": [ + { + "id": 1768, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1769, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1770, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1771, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1772, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1773, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1774, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1775, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1776, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1777, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1778, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1779, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1780, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1781, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1782, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1783, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + } + ] + }, + { + "id": 109, + "name": "pink_bed", + "translation_key": "block.minecraft.pink_bed", + "item_id": 930, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "occupied", + "values": [ + "true", + "false" + ] + }, + { + "name": "part", + "values": [ + "head", + "foot" + ] + } + ], + "default_state_id": 1787, + "states": [ + { + "id": 1784, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1785, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1786, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1787, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1788, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1789, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1790, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1791, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1792, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1793, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1794, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1795, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1796, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1797, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1798, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1799, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + } + ] + }, + { + "id": 110, + "name": "gray_bed", + "translation_key": "block.minecraft.gray_bed", + "item_id": 931, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "occupied", + "values": [ + "true", + "false" + ] + }, + { + "name": "part", + "values": [ + "head", + "foot" + ] + } + ], + "default_state_id": 1803, + "states": [ + { + "id": 1800, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1801, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1802, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1803, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1804, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1805, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1806, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1807, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1808, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1809, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1810, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1811, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1812, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1813, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1814, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1815, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + } + ] + }, + { + "id": 111, + "name": "light_gray_bed", + "translation_key": "block.minecraft.light_gray_bed", + "item_id": 932, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "occupied", + "values": [ + "true", + "false" + ] + }, + { + "name": "part", + "values": [ + "head", + "foot" + ] + } + ], + "default_state_id": 1819, + "states": [ + { + "id": 1816, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1817, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1818, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1819, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1820, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1821, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1822, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1823, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1824, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1825, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1826, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1827, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1828, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1829, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1830, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1831, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + } + ] + }, + { + "id": 112, + "name": "cyan_bed", + "translation_key": "block.minecraft.cyan_bed", + "item_id": 933, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "occupied", + "values": [ + "true", + "false" + ] + }, + { + "name": "part", + "values": [ + "head", + "foot" + ] + } + ], + "default_state_id": 1835, + "states": [ + { + "id": 1832, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1833, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1834, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1835, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1836, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1837, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1838, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1839, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1840, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1841, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1842, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1843, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1844, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1845, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1846, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1847, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + } + ] + }, + { + "id": 113, + "name": "purple_bed", + "translation_key": "block.minecraft.purple_bed", + "item_id": 934, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "occupied", + "values": [ + "true", + "false" + ] + }, + { + "name": "part", + "values": [ + "head", + "foot" + ] + } + ], + "default_state_id": 1851, + "states": [ + { + "id": 1848, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1849, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1850, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1851, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1852, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1853, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1854, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1855, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1856, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1857, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1858, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1859, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1860, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1861, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1862, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1863, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + } + ] + }, + { + "id": 114, + "name": "blue_bed", + "translation_key": "block.minecraft.blue_bed", + "item_id": 935, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "occupied", + "values": [ + "true", + "false" + ] + }, + { + "name": "part", + "values": [ + "head", + "foot" + ] + } + ], + "default_state_id": 1867, + "states": [ + { + "id": 1864, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1865, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1866, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1867, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1868, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1869, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1870, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1871, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1872, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1873, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1874, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1875, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1876, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1877, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1878, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1879, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + } + ] + }, + { + "id": 115, + "name": "brown_bed", + "translation_key": "block.minecraft.brown_bed", + "item_id": 936, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "occupied", + "values": [ + "true", + "false" + ] + }, + { + "name": "part", + "values": [ + "head", + "foot" + ] + } + ], + "default_state_id": 1883, + "states": [ + { + "id": 1880, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1881, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1882, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1883, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1884, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1885, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1886, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1887, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1888, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1889, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1890, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1891, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1892, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1893, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1894, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1895, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + } + ] + }, + { + "id": 116, + "name": "green_bed", + "translation_key": "block.minecraft.green_bed", + "item_id": 937, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "occupied", + "values": [ + "true", + "false" + ] + }, + { + "name": "part", + "values": [ + "head", + "foot" + ] + } + ], + "default_state_id": 1899, + "states": [ + { + "id": 1896, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1897, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1898, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1899, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1900, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1901, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1902, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1903, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1904, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1905, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1906, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1907, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1908, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1909, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1910, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1911, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + } + ] + }, + { + "id": 117, + "name": "red_bed", + "translation_key": "block.minecraft.red_bed", + "item_id": 938, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "occupied", + "values": [ + "true", + "false" + ] + }, + { + "name": "part", + "values": [ + "head", + "foot" + ] + } + ], + "default_state_id": 1915, + "states": [ + { + "id": 1912, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1913, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1914, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1915, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1916, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1917, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1918, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1919, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1920, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1921, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1922, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1923, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1924, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1925, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1926, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1927, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + } + ] + }, + { + "id": 118, + "name": "black_bed", + "translation_key": "block.minecraft.black_bed", + "item_id": 939, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "occupied", + "values": [ + "true", + "false" + ] + }, + { + "name": "part", + "values": [ + "head", + "foot" + ] + } + ], + "default_state_id": 1931, + "states": [ + { + "id": 1928, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1929, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1930, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1931, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1932, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1933, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1934, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 5, + 6, + 7, + 8 + ], + "block_entity_type": 24 + }, + { + "id": 1935, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 2, + 3, + 4 + ], + "block_entity_type": 24 + }, + { + "id": 1936, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1937, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1938, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1939, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1940, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1941, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + }, + { + "id": 1942, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 2, + 6, + 12, + 13 + ], + "block_entity_type": 24 + }, + { + "id": 1943, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 1, + 5, + 9, + 10, + 11 + ], + "block_entity_type": 24 + } + ] + }, + { + "id": 119, + "name": "powered_rail", + "translation_key": "block.minecraft.powered_rail", + "item_id": 723, + "hardness": 0.7, + "blast_resistance": 0.7, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "powered", + "values": [ + "true", + "false" + ] + }, + { + "name": "shape", + "values": [ + "north_south", + "east_west", + "ascending_east", + "ascending_west", + "ascending_north", + "ascending_south" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 1957, + "states": [ + { + "id": 1944, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1945, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1946, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1947, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1948, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1949, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1950, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1951, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1952, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1953, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1954, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1955, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1956, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1957, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1958, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1959, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1960, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1961, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1962, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1963, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1964, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1965, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1966, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1967, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 120, + "name": "detector_rail", + "translation_key": "block.minecraft.detector_rail", + "item_id": 724, + "hardness": 0.7, + "blast_resistance": 0.7, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "powered", + "values": [ + "true", + "false" + ] + }, + { + "name": "shape", + "values": [ + "north_south", + "east_west", + "ascending_east", + "ascending_west", + "ascending_north", + "ascending_south" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 1981, + "states": [ + { + "id": 1968, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1969, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1970, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1971, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1972, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1973, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1974, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1975, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1976, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1977, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1978, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1979, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1980, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1981, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1982, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1983, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1984, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1985, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1986, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1987, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1988, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1989, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1990, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 1991, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 121, + "name": "sticky_piston", + "translation_key": "block.minecraft.sticky_piston", + "item_id": 641, + "hardness": 1.5, + "blast_resistance": 1.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "extended", + "values": [ + "true", + "false" + ] + }, + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + } + ], + "default_state_id": 1998, + "states": [ + { + "id": 1992, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 14 + ] + }, + { + "id": 1993, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 15 + ] + }, + { + "id": 1994, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 16 + ] + }, + { + "id": 1995, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 17 + ] + }, + { + "id": 1996, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 18 + ] + }, + { + "id": 1997, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 19 + ] + }, + { + "id": 1998, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 1999, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 2000, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 2001, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 2002, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 2003, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 122, + "name": "cobweb", + "translation_key": "block.minecraft.cobweb", + "item_id": 172, + "hardness": 4.0, + "blast_resistance": 4.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2004, + "states": [ + { + "id": 2004, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 123, + "name": "grass", + "translation_key": "block.minecraft.grass", + "item_id": 173, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2005, + "states": [ + { + "id": 2005, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 124, + "name": "fern", + "translation_key": "block.minecraft.fern", + "item_id": 174, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2006, + "states": [ + { + "id": 2006, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 125, + "name": "dead_bush", + "translation_key": "block.minecraft.dead_bush", + "item_id": 177, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2007, + "states": [ + { + "id": 2007, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 126, + "name": "seagrass", + "translation_key": "block.minecraft.seagrass", + "item_id": 178, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2008, + "states": [ + { + "id": 2008, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 127, + "name": "tall_seagrass", + "translation_key": "block.minecraft.tall_seagrass", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "half", + "values": [ + "upper", + "lower" + ] + } + ], + "default_state_id": 2010, + "states": [ + { + "id": 2009, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2010, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 128, + "name": "piston", + "translation_key": "block.minecraft.piston", + "item_id": 640, + "hardness": 1.5, + "blast_resistance": 1.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "extended", + "values": [ + "true", + "false" + ] + }, + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + } + ], + "default_state_id": 2017, + "states": [ + { + "id": 2011, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 14 + ] + }, + { + "id": 2012, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 15 + ] + }, + { + "id": 2013, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 16 + ] + }, + { + "id": 2014, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 17 + ] + }, + { + "id": 2015, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 18 + ] + }, + { + "id": 2016, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 19 + ] + }, + { + "id": 2017, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 2018, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 2019, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 2020, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 2021, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 2022, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 129, + "name": "piston_head", + "translation_key": "block.minecraft.piston_head", + "item_id": 0, + "hardness": 1.5, + "blast_resistance": 1.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + }, + { + "name": "short", + "values": [ + "true", + "false" + ] + }, + { + "name": "type", + "values": [ + "normal", + "sticky" + ] + } + ], + "default_state_id": 2025, + "states": [ + { + "id": 2023, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 20, + 21 + ] + }, + { + "id": 2024, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 20, + 21 + ] + }, + { + "id": 2025, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 20, + 22 + ] + }, + { + "id": 2026, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 20, + 22 + ] + }, + { + "id": 2027, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 23, + 24 + ] + }, + { + "id": 2028, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 23, + 24 + ] + }, + { + "id": 2029, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 23, + 25 + ] + }, + { + "id": 2030, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 23, + 25 + ] + }, + { + "id": 2031, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 26, + 27 + ] + }, + { + "id": 2032, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 26, + 27 + ] + }, + { + "id": 2033, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 26, + 28 + ] + }, + { + "id": 2034, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 26, + 28 + ] + }, + { + "id": 2035, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 29, + 30 + ] + }, + { + "id": 2036, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 29, + 30 + ] + }, + { + "id": 2037, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 29, + 31 + ] + }, + { + "id": 2038, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 29, + 31 + ] + }, + { + "id": 2039, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 32, + 33, + 34, + 35, + 36 + ] + }, + { + "id": 2040, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 32, + 33, + 34, + 35, + 36 + ] + }, + { + "id": 2041, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 37, + 33, + 34, + 35, + 36 + ] + }, + { + "id": 2042, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 37, + 33, + 34, + 35, + 36 + ] + }, + { + "id": 2043, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 38, + 39 + ] + }, + { + "id": 2044, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 38, + 39 + ] + }, + { + "id": 2045, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 38, + 40 + ] + }, + { + "id": 2046, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 38, + 40 + ] + } + ] + }, + { + "id": 130, + "name": "white_wool", + "translation_key": "block.minecraft.white_wool", + "item_id": 180, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2047, + "states": [ + { + "id": 2047, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 131, + "name": "orange_wool", + "translation_key": "block.minecraft.orange_wool", + "item_id": 181, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2048, + "states": [ + { + "id": 2048, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 132, + "name": "magenta_wool", + "translation_key": "block.minecraft.magenta_wool", + "item_id": 182, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2049, + "states": [ + { + "id": 2049, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 133, + "name": "light_blue_wool", + "translation_key": "block.minecraft.light_blue_wool", + "item_id": 183, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2050, + "states": [ + { + "id": 2050, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 134, + "name": "yellow_wool", + "translation_key": "block.minecraft.yellow_wool", + "item_id": 184, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2051, + "states": [ + { + "id": 2051, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 135, + "name": "lime_wool", + "translation_key": "block.minecraft.lime_wool", + "item_id": 185, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2052, + "states": [ + { + "id": 2052, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 136, + "name": "pink_wool", + "translation_key": "block.minecraft.pink_wool", + "item_id": 186, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2053, + "states": [ + { + "id": 2053, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 137, + "name": "gray_wool", + "translation_key": "block.minecraft.gray_wool", + "item_id": 187, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2054, + "states": [ + { + "id": 2054, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 138, + "name": "light_gray_wool", + "translation_key": "block.minecraft.light_gray_wool", + "item_id": 188, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2055, + "states": [ + { + "id": 2055, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 139, + "name": "cyan_wool", + "translation_key": "block.minecraft.cyan_wool", + "item_id": 189, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2056, + "states": [ + { + "id": 2056, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 140, + "name": "purple_wool", + "translation_key": "block.minecraft.purple_wool", + "item_id": 190, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2057, + "states": [ + { + "id": 2057, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 141, + "name": "blue_wool", + "translation_key": "block.minecraft.blue_wool", + "item_id": 191, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2058, + "states": [ + { + "id": 2058, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 142, + "name": "brown_wool", + "translation_key": "block.minecraft.brown_wool", + "item_id": 192, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2059, + "states": [ + { + "id": 2059, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 143, + "name": "green_wool", + "translation_key": "block.minecraft.green_wool", + "item_id": 193, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2060, + "states": [ + { + "id": 2060, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 144, + "name": "red_wool", + "translation_key": "block.minecraft.red_wool", + "item_id": 194, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2061, + "states": [ + { + "id": 2061, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 145, + "name": "black_wool", + "translation_key": "block.minecraft.black_wool", + "item_id": 195, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2062, + "states": [ + { + "id": 2062, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 146, + "name": "moving_piston", + "translation_key": "block.minecraft.moving_piston", + "item_id": 0, + "hardness": -1.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + }, + { + "name": "type", + "values": [ + "normal", + "sticky" + ] + } + ], + "default_state_id": 2063, + "states": [ + { + "id": 2063, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 10 + }, + { + "id": 2064, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 10 + }, + { + "id": 2065, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 10 + }, + { + "id": 2066, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 10 + }, + { + "id": 2067, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 10 + }, + { + "id": 2068, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 10 + }, + { + "id": 2069, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 10 + }, + { + "id": 2070, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 10 + }, + { + "id": 2071, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 10 + }, + { + "id": 2072, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 10 + }, + { + "id": 2073, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 10 + }, + { + "id": 2074, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 10 + } + ] + }, + { + "id": 147, + "name": "dandelion", + "translation_key": "block.minecraft.dandelion", + "item_id": 196, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2075, + "states": [ + { + "id": 2075, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 148, + "name": "torchflower", + "translation_key": "block.minecraft.torchflower", + "item_id": 209, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2076, + "states": [ + { + "id": 2076, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 149, + "name": "poppy", + "translation_key": "block.minecraft.poppy", + "item_id": 197, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2077, + "states": [ + { + "id": 2077, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 150, + "name": "blue_orchid", + "translation_key": "block.minecraft.blue_orchid", + "item_id": 198, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2078, + "states": [ + { + "id": 2078, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 151, + "name": "allium", + "translation_key": "block.minecraft.allium", + "item_id": 199, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2079, + "states": [ + { + "id": 2079, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 152, + "name": "azure_bluet", + "translation_key": "block.minecraft.azure_bluet", + "item_id": 200, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2080, + "states": [ + { + "id": 2080, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 153, + "name": "red_tulip", + "translation_key": "block.minecraft.red_tulip", + "item_id": 201, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2081, + "states": [ + { + "id": 2081, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 154, + "name": "orange_tulip", + "translation_key": "block.minecraft.orange_tulip", + "item_id": 202, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2082, + "states": [ + { + "id": 2082, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 155, + "name": "white_tulip", + "translation_key": "block.minecraft.white_tulip", + "item_id": 203, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2083, + "states": [ + { + "id": 2083, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 156, + "name": "pink_tulip", + "translation_key": "block.minecraft.pink_tulip", + "item_id": 204, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2084, + "states": [ + { + "id": 2084, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 157, + "name": "oxeye_daisy", + "translation_key": "block.minecraft.oxeye_daisy", + "item_id": 205, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2085, + "states": [ + { + "id": 2085, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 158, + "name": "cornflower", + "translation_key": "block.minecraft.cornflower", + "item_id": 206, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2086, + "states": [ + { + "id": 2086, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 159, + "name": "wither_rose", + "translation_key": "block.minecraft.wither_rose", + "item_id": 208, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2087, + "states": [ + { + "id": 2087, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 160, + "name": "lily_of_the_valley", + "translation_key": "block.minecraft.lily_of_the_valley", + "item_id": 207, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2088, + "states": [ + { + "id": 2088, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 161, + "name": "brown_mushroom", + "translation_key": "block.minecraft.brown_mushroom", + "item_id": 212, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2089, + "states": [ + { + "id": 2089, + "luminance": 1, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 162, + "name": "red_mushroom", + "translation_key": "block.minecraft.red_mushroom", + "item_id": 213, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2090, + "states": [ + { + "id": 2090, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 163, + "name": "gold_block", + "translation_key": "block.minecraft.gold_block", + "item_id": 76, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2091, + "states": [ + { + "id": 2091, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 164, + "name": "iron_block", + "translation_key": "block.minecraft.iron_block", + "item_id": 74, + "hardness": 5.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2092, + "states": [ + { + "id": 2092, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 165, + "name": "bricks", + "translation_key": "block.minecraft.bricks", + "item_id": 263, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2093, + "states": [ + { + "id": 2093, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 166, + "name": "tnt", + "translation_key": "block.minecraft.tnt", + "item_id": 657, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "unstable", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 2095, + "states": [ + { + "id": 2094, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 2095, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 167, + "name": "bookshelf", + "translation_key": "block.minecraft.bookshelf", + "item_id": 264, + "hardness": 1.5, + "blast_resistance": 1.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2096, + "states": [ + { + "id": 2096, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 168, + "name": "chiseled_bookshelf", + "translation_key": "block.minecraft.chiseled_bookshelf", + "item_id": 265, + "hardness": 1.5, + "blast_resistance": 1.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "slot_0_occupied", + "values": [ + "true", + "false" + ] + }, + { + "name": "slot_1_occupied", + "values": [ + "true", + "false" + ] + }, + { + "name": "slot_2_occupied", + "values": [ + "true", + "false" + ] + }, + { + "name": "slot_3_occupied", + "values": [ + "true", + "false" + ] + }, + { + "name": "slot_4_occupied", + "values": [ + "true", + "false" + ] + }, + { + "name": "slot_5_occupied", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 2160, + "states": [ + { + "id": 2097, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2098, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2099, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2100, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2101, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2102, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2103, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2104, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2105, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2106, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2107, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2108, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2109, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2110, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2111, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2112, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2113, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2114, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2115, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2116, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2117, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2118, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2119, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2120, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2121, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2122, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2123, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2124, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2125, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2126, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2127, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2128, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2129, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2130, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2131, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2132, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2133, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2134, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2135, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2136, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2137, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2138, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2139, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2140, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2141, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2142, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2143, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2144, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2145, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2146, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2147, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2148, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2149, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2150, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2151, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2152, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2153, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2154, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2155, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2156, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2157, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2158, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2159, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2160, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2161, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2162, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2163, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2164, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2165, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2166, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2167, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2168, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2169, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2170, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2171, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2172, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2173, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2174, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2175, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2176, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2177, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2178, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2179, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2180, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2181, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2182, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2183, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2184, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2185, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2186, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2187, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2188, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2189, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2190, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2191, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2192, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2193, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2194, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2195, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2196, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2197, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2198, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2199, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2200, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2201, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2202, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2203, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2204, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2205, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2206, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2207, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2208, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2209, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2210, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2211, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2212, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2213, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2214, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2215, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2216, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2217, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2218, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2219, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2220, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2221, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2222, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2223, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2224, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2225, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2226, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2227, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2228, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2229, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2230, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2231, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2232, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2233, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2234, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2235, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2236, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2237, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2238, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2239, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2240, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2241, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2242, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2243, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2244, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2245, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2246, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2247, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2248, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2249, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2250, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2251, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2252, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2253, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2254, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2255, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2256, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2257, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2258, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2259, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2260, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2261, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2262, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2263, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2264, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2265, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2266, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2267, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2268, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2269, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2270, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2271, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2272, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2273, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2274, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2275, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2276, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2277, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2278, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2279, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2280, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2281, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2282, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2283, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2284, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2285, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2286, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2287, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2288, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2289, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2290, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2291, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2292, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2293, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2294, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2295, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2296, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2297, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2298, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2299, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2300, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2301, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2302, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2303, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2304, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2305, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2306, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2307, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2308, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2309, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2310, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2311, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2312, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2313, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2314, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2315, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2316, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2317, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2318, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2319, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2320, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2321, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2322, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2323, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2324, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2325, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2326, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2327, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2328, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2329, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2330, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2331, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2332, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2333, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2334, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2335, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2336, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2337, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2338, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2339, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2340, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2341, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2342, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2343, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2344, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2345, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2346, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2347, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2348, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2349, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2350, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2351, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + }, + { + "id": 2352, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 38 + } + ] + }, + { + "id": 169, + "name": "mossy_cobblestone", + "translation_key": "block.minecraft.mossy_cobblestone", + "item_id": 267, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2353, + "states": [ + { + "id": 2353, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 170, + "name": "obsidian", + "translation_key": "block.minecraft.obsidian", + "item_id": 268, + "hardness": 50.0, + "blast_resistance": 1200.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2354, + "states": [ + { + "id": 2354, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 171, + "name": "torch", + "translation_key": "block.minecraft.torch", + "item_id": 269, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 172, + "properties": [], + "default_state_id": 2355, + "states": [ + { + "id": 2355, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 172, + "name": "wall_torch", + "translation_key": "block.minecraft.torch", + "item_id": 269, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 2356, + "states": [ + { + "id": 2356, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2357, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2358, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2359, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 173, + "name": "fire", + "translation_key": "block.minecraft.fire", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "age", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 2391, + "states": [ + { + "id": 2360, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2361, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2362, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2363, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2364, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2365, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2366, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2367, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2368, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2369, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2370, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2371, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2372, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2373, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2374, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2375, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2376, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2377, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2378, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2379, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2380, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2381, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2382, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2383, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2384, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2385, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2386, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2387, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2388, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2389, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2390, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2391, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2392, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2393, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2394, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2395, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2396, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2397, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2398, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2399, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2400, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2401, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2402, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2403, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2404, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2405, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2406, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2407, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2408, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2409, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2410, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2411, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2412, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2413, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2414, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2415, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2416, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2417, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2418, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2419, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2420, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2421, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2422, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2423, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2424, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2425, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2426, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2427, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2428, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2429, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2430, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2431, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2432, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2433, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2434, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2435, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2436, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2437, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2438, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2439, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2440, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2441, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2442, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2443, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2444, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2445, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2446, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2447, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2448, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2449, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2450, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2451, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2452, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2453, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2454, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2455, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2456, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2457, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2458, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2459, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2460, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2461, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2462, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2463, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2464, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2465, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2466, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2467, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2468, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2469, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2470, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2471, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2472, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2473, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2474, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2475, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2476, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2477, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2478, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2479, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2480, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2481, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2482, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2483, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2484, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2485, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2486, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2487, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2488, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2489, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2490, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2491, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2492, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2493, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2494, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2495, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2496, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2497, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2498, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2499, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2500, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2501, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2502, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2503, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2504, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2505, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2506, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2507, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2508, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2509, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2510, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2511, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2512, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2513, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2514, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2515, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2516, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2517, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2518, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2519, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2520, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2521, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2522, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2523, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2524, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2525, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2526, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2527, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2528, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2529, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2530, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2531, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2532, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2533, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2534, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2535, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2536, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2537, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2538, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2539, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2540, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2541, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2542, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2543, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2544, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2545, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2546, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2547, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2548, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2549, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2550, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2551, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2552, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2553, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2554, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2555, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2556, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2557, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2558, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2559, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2560, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2561, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2562, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2563, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2564, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2565, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2566, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2567, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2568, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2569, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2570, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2571, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2572, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2573, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2574, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2575, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2576, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2577, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2578, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2579, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2580, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2581, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2582, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2583, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2584, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2585, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2586, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2587, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2588, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2589, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2590, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2591, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2592, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2593, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2594, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2595, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2596, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2597, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2598, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2599, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2600, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2601, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2602, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2603, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2604, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2605, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2606, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2607, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2608, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2609, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2610, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2611, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2612, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2613, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2614, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2615, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2616, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2617, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2618, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2619, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2620, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2621, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2622, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2623, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2624, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2625, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2626, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2627, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2628, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2629, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2630, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2631, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2632, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2633, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2634, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2635, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2636, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2637, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2638, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2639, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2640, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2641, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2642, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2643, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2644, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2645, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2646, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2647, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2648, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2649, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2650, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2651, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2652, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2653, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2654, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2655, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2656, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2657, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2658, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2659, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2660, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2661, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2662, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2663, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2664, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2665, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2666, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2667, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2668, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2669, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2670, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2671, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2672, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2673, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2674, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2675, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2676, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2677, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2678, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2679, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2680, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2681, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2682, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2683, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2684, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2685, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2686, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2687, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2688, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2689, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2690, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2691, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2692, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2693, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2694, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2695, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2696, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2697, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2698, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2699, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2700, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2701, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2702, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2703, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2704, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2705, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2706, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2707, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2708, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2709, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2710, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2711, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2712, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2713, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2714, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2715, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2716, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2717, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2718, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2719, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2720, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2721, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2722, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2723, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2724, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2725, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2726, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2727, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2728, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2729, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2730, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2731, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2732, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2733, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2734, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2735, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2736, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2737, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2738, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2739, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2740, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2741, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2742, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2743, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2744, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2745, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2746, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2747, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2748, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2749, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2750, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2751, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2752, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2753, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2754, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2755, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2756, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2757, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2758, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2759, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2760, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2761, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2762, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2763, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2764, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2765, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2766, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2767, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2768, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2769, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2770, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2771, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2772, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2773, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2774, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2775, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2776, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2777, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2778, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2779, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2780, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2781, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2782, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2783, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2784, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2785, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2786, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2787, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2788, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2789, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2790, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2791, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2792, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2793, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2794, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2795, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2796, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2797, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2798, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2799, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2800, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2801, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2802, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2803, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2804, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2805, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2806, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2807, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2808, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2809, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2810, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2811, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2812, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2813, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2814, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2815, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2816, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2817, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2818, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2819, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2820, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2821, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2822, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2823, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2824, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2825, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2826, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2827, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2828, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2829, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2830, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2831, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2832, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2833, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2834, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2835, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2836, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2837, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2838, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2839, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2840, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2841, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2842, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2843, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2844, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2845, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2846, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2847, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2848, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2849, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2850, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2851, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2852, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2853, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2854, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2855, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2856, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2857, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2858, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2859, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2860, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2861, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2862, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2863, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2864, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2865, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2866, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2867, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2868, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2869, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2870, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2871, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 174, + "name": "soul_fire", + "translation_key": "block.minecraft.soul_fire", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2872, + "states": [ + { + "id": 2872, + "luminance": 10, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 175, + "name": "spawner", + "translation_key": "block.minecraft.spawner", + "item_id": 276, + "hardness": 5.0, + "blast_resistance": 5.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 2873, + "states": [ + { + "id": 2873, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 9 + } + ] + }, + { + "id": 176, + "name": "oak_stairs", + "translation_key": "block.minecraft.oak_stairs", + "item_id": 361, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 2885, + "states": [ + { + "id": 2874, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 2875, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 2876, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 2877, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 2878, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 2879, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 2880, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 2881, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 2882, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 2883, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 2884, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 2885, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 2886, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 2887, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 2888, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 2889, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 2890, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 2891, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 2892, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 2893, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 2894, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 2895, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 2896, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 2897, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 2898, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 2899, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 2900, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 2901, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 2902, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 2903, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 2904, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 2905, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 2906, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 2907, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 2908, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 2909, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 2910, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 2911, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 2912, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 2913, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 2914, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 2915, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 2916, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 2917, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 2918, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 2919, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 2920, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 2921, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 2922, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 2923, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 2924, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 2925, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 2926, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 2927, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 2928, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 2929, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 2930, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 2931, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 2932, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 2933, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 2934, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 2935, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 2936, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 2937, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 2938, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 2939, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 2940, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 2941, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 2942, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 2943, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 2944, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 2945, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 2946, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 2947, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 2948, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 2949, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 2950, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 2951, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 2952, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 2953, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 177, + "name": "chest", + "translation_key": "block.minecraft.chest", + "item_id": 277, + "hardness": 2.5, + "blast_resistance": 2.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "type", + "values": [ + "single", + "left", + "right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 2955, + "states": [ + { + "id": 2954, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 58 + ], + "block_entity_type": 1 + }, + { + "id": 2955, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 58 + ], + "block_entity_type": 1 + }, + { + "id": 2956, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 59 + ], + "block_entity_type": 1 + }, + { + "id": 2957, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 59 + ], + "block_entity_type": 1 + }, + { + "id": 2958, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 60 + ], + "block_entity_type": 1 + }, + { + "id": 2959, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 60 + ], + "block_entity_type": 1 + }, + { + "id": 2960, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 58 + ], + "block_entity_type": 1 + }, + { + "id": 2961, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 58 + ], + "block_entity_type": 1 + }, + { + "id": 2962, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 60 + ], + "block_entity_type": 1 + }, + { + "id": 2963, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 60 + ], + "block_entity_type": 1 + }, + { + "id": 2964, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 59 + ], + "block_entity_type": 1 + }, + { + "id": 2965, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 59 + ], + "block_entity_type": 1 + }, + { + "id": 2966, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 58 + ], + "block_entity_type": 1 + }, + { + "id": 2967, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 58 + ], + "block_entity_type": 1 + }, + { + "id": 2968, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 61 + ], + "block_entity_type": 1 + }, + { + "id": 2969, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 61 + ], + "block_entity_type": 1 + }, + { + "id": 2970, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 62 + ], + "block_entity_type": 1 + }, + { + "id": 2971, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 62 + ], + "block_entity_type": 1 + }, + { + "id": 2972, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 58 + ], + "block_entity_type": 1 + }, + { + "id": 2973, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 58 + ], + "block_entity_type": 1 + }, + { + "id": 2974, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 62 + ], + "block_entity_type": 1 + }, + { + "id": 2975, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 62 + ], + "block_entity_type": 1 + }, + { + "id": 2976, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 61 + ], + "block_entity_type": 1 + }, + { + "id": 2977, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 61 + ], + "block_entity_type": 1 + } + ] + }, + { + "id": 178, + "name": "redstone_wire", + "translation_key": "block.minecraft.redstone_wire", + "item_id": 635, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "up", + "side", + "none" + ] + }, + { + "name": "north", + "values": [ + "up", + "side", + "none" + ] + }, + { + "name": "power", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "south", + "values": [ + "up", + "side", + "none" + ] + }, + { + "name": "west", + "values": [ + "up", + "side", + "none" + ] + } + ], + "default_state_id": 4138, + "states": [ + { + "id": 2978, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2979, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2980, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2981, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2982, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2983, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2984, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2985, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2986, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2987, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2988, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2989, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2990, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2991, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2992, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2993, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2994, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2995, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2996, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2997, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2998, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 2999, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3000, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3001, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3002, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3003, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3004, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3005, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3006, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3007, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3008, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3009, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3010, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3011, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3012, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3013, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3014, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3015, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3016, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3017, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3018, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3019, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3020, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3021, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3022, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3023, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3024, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3025, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3026, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3027, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3028, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3029, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3030, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3031, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3032, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3033, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3034, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3035, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3036, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3037, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3038, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3039, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3040, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3041, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3042, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3043, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3044, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3045, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3046, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3047, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3048, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3049, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3050, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3051, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3052, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3053, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3054, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3055, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3056, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3057, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3058, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3059, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3060, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3061, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3062, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3063, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3064, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3065, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3066, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3067, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3068, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3069, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3070, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3071, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3072, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3073, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3074, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3075, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3076, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3077, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3078, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3079, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3080, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3081, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3082, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3083, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3084, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3085, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3086, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3087, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3088, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3089, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3090, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3091, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3092, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3093, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3094, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3095, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3096, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3097, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3098, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3099, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3100, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3101, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3102, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3103, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3104, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3105, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3106, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3107, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3108, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3109, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3110, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3111, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3112, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3113, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3114, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3115, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3116, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3117, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3118, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3119, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3120, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3121, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3122, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3123, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3124, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3125, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3126, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3127, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3128, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3129, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3130, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3131, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3132, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3133, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3134, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3135, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3136, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3137, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3138, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3139, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3140, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3141, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3142, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3143, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3144, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3145, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3146, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3147, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3148, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3149, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3150, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3151, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3152, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3153, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3154, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3155, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3156, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3157, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3158, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3159, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3160, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3161, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3162, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3163, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3164, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3165, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3166, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3167, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3168, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3169, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3170, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3171, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3172, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3173, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3174, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3175, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3176, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3177, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3178, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3179, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3180, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3181, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3182, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3183, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3184, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3185, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3186, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3187, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3188, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3189, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3190, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3191, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3192, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3193, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3194, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3195, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3196, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3197, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3198, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3199, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3200, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3201, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3202, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3203, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3204, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3205, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3206, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3207, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3208, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3209, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3210, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3211, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3212, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3213, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3214, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3215, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3216, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3217, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3218, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3219, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3220, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3221, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3222, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3223, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3224, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3225, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3226, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3227, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3228, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3229, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3230, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3231, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3232, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3233, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3234, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3235, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3236, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3237, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3238, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3239, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3240, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3241, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3242, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3243, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3244, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3245, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3246, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3247, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3248, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3249, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3250, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3251, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3252, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3253, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3254, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3255, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3256, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3257, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3258, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3259, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3260, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3261, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3262, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3263, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3264, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3265, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3266, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3267, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3268, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3269, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3270, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3271, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3272, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3273, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3274, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3275, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3276, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3277, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3278, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3279, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3280, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3281, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3282, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3283, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3284, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3285, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3286, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3287, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3288, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3289, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3290, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3291, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3292, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3293, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3294, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3295, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3296, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3297, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3298, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3299, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3300, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3301, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3302, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3303, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3304, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3305, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3306, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3307, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3308, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3309, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3310, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3311, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3312, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3313, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3314, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3315, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3316, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3317, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3318, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3319, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3320, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3321, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3322, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3323, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3324, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3325, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3326, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3327, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3328, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3329, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3330, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3331, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3332, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3333, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3334, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3335, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3336, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3337, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3338, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3339, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3340, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3341, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3342, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3343, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3344, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3345, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3346, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3347, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3348, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3349, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3350, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3351, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3352, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3353, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3354, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3355, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3356, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3357, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3358, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3359, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3360, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3361, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3362, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3363, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3364, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3365, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3366, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3367, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3368, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3369, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3370, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3371, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3372, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3373, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3374, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3375, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3376, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3377, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3378, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3379, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3380, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3381, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3382, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3383, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3384, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3385, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3386, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3387, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3388, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3389, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3390, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3391, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3392, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3393, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3394, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3395, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3396, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3397, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3398, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3399, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3400, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3401, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3402, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3403, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3404, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3405, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3406, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3407, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3408, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3409, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3410, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3411, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3412, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3413, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3414, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3415, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3416, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3417, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3418, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3419, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3420, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3421, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3422, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3423, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3424, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3425, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3426, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3427, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3428, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3429, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3430, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3431, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3432, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3433, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3434, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3435, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3436, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3437, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3438, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3439, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3440, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3441, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3442, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3443, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3444, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3445, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3446, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3447, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3448, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3449, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3450, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3451, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3452, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3453, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3454, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3455, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3456, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3457, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3458, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3459, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3460, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3461, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3462, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3463, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3464, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3465, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3466, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3467, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3468, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3469, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3470, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3471, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3472, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3473, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3474, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3475, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3476, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3477, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3478, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3479, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3480, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3481, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3482, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3483, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3484, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3485, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3486, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3487, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3488, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3489, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3490, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3491, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3492, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3493, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3494, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3495, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3496, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3497, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3498, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3499, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3500, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3501, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3502, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3503, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3504, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3505, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3506, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3507, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3508, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3509, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3510, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3511, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3512, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3513, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3514, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3515, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3516, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3517, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3518, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3519, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3520, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3521, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3522, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3523, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3524, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3525, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3526, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3527, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3528, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3529, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3530, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3531, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3532, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3533, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3534, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3535, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3536, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3537, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3538, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3539, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3540, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3541, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3542, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3543, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3544, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3545, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3546, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3547, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3548, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3549, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3550, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3551, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3552, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3553, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3554, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3555, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3556, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3557, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3558, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3559, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3560, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3561, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3562, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3563, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3564, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3565, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3566, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3567, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3568, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3569, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3570, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3571, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3572, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3573, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3574, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3575, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3576, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3577, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3578, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3579, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3580, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3581, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3582, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3583, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3584, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3585, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3586, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3587, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3588, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3589, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3590, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3591, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3592, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3593, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3594, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3595, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3596, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3597, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3598, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3599, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3600, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3601, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3602, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3603, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3604, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3605, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3606, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3607, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3608, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3609, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3610, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3611, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3612, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3613, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3614, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3615, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3616, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3617, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3618, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3619, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3620, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3621, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3622, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3623, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3624, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3625, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3626, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3627, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3628, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3629, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3630, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3631, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3632, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3633, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3634, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3635, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3636, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3637, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3638, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3639, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3640, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3641, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3642, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3643, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3644, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3645, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3646, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3647, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3648, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3649, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3650, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3651, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3652, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3653, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3654, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3655, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3656, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3657, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3658, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3659, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3660, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3661, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3662, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3663, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3664, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3665, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3666, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3667, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3668, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3669, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3670, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3671, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3672, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3673, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3674, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3675, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3676, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3677, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3678, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3679, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3680, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3681, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3682, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3683, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3684, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3685, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3686, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3687, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3688, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3689, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3690, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3691, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3692, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3693, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3694, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3695, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3696, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3697, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3698, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3699, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3700, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3701, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3702, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3703, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3704, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3705, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3706, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3707, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3708, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3709, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3710, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3711, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3712, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3713, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3714, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3715, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3716, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3717, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3718, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3719, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3720, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3721, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3722, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3723, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3724, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3725, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3726, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3727, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3728, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3729, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3730, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3731, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3732, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3733, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3734, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3735, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3736, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3737, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3738, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3739, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3740, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3741, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3742, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3743, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3744, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3745, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3746, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3747, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3748, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3749, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3750, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3751, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3752, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3753, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3754, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3755, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3756, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3757, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3758, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3759, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3760, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3761, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3762, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3763, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3764, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3765, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3766, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3767, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3768, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3769, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3770, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3771, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3772, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3773, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3774, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3775, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3776, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3777, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3778, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3779, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3780, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3781, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3782, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3783, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3784, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3785, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3786, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3787, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3788, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3789, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3790, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3791, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3792, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3793, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3794, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3795, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3796, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3797, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3798, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3799, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3800, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3801, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3802, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3803, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3804, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3805, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3806, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3807, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3808, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3809, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3810, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3811, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3812, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3813, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3814, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3815, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3816, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3817, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3818, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3819, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3820, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3821, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3822, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3823, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3824, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3825, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3826, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3827, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3828, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3829, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3830, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3831, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3832, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3833, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3834, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3835, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3836, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3837, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3838, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3839, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3840, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3841, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3842, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3843, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3844, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3845, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3846, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3847, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3848, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3849, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3850, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3851, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3852, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3853, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3854, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3855, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3856, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3857, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3858, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3859, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3860, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3861, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3862, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3863, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3864, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3865, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3866, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3867, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3868, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3869, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3870, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3871, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3872, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3873, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3874, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3875, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3876, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3877, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3878, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3879, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3880, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3881, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3882, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3883, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3884, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3885, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3886, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3887, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3888, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3889, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3890, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3891, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3892, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3893, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3894, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3895, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3896, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3897, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3898, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3899, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3900, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3901, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3902, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3903, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3904, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3905, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3906, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3907, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3908, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3909, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3910, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3911, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3912, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3913, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3914, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3915, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3916, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3917, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3918, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3919, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3920, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3921, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3922, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3923, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3924, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3925, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3926, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3927, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3928, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3929, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3930, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3931, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3932, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3933, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3934, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3935, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3936, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3937, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3938, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3939, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3940, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3941, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3942, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3943, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3944, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3945, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3946, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3947, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3948, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3949, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3950, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3951, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3952, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3953, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3954, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3955, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3956, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3957, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3958, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3959, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3960, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3961, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3962, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3963, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3964, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3965, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3966, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3967, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3968, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3969, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3970, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3971, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3972, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3973, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3974, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3975, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3976, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3977, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3978, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3979, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3980, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3981, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3982, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3983, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3984, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3985, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3986, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3987, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3988, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3989, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3990, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3991, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3992, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3993, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3994, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3995, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3996, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3997, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3998, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 3999, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4000, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4001, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4002, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4003, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4004, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4005, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4006, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4007, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4008, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4009, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4010, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4011, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4012, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4013, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4014, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4015, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4016, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4017, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4018, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4019, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4020, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4021, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4022, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4023, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4024, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4025, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4026, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4027, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4028, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4029, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4030, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4031, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4032, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4033, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4034, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4035, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4036, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4037, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4038, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4039, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4040, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4041, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4042, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4043, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4044, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4045, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4046, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4047, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4048, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4049, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4050, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4051, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4052, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4053, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4054, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4055, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4056, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4057, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4058, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4059, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4060, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4061, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4062, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4063, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4064, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4065, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4066, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4067, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4068, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4069, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4070, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4071, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4072, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4073, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4074, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4075, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4076, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4077, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4078, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4079, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4080, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4081, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4082, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4083, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4084, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4085, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4086, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4087, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4088, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4089, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4090, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4091, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4092, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4093, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4094, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4095, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4096, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4097, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4098, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4099, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4100, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4101, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4102, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4103, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4104, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4105, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4106, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4107, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4108, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4109, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4110, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4111, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4112, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4113, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4114, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4115, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4116, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4117, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4118, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4119, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4120, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4121, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4122, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4123, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4124, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4125, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4126, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4127, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4128, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4129, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4130, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4131, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4132, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4133, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4134, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4135, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4136, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4137, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4138, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4139, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4140, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4141, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4142, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4143, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4144, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4145, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4146, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4147, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4148, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4149, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4150, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4151, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4152, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4153, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4154, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4155, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4156, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4157, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4158, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4159, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4160, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4161, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4162, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4163, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4164, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4165, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4166, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4167, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4168, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4169, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4170, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4171, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4172, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4173, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4174, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4175, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4176, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4177, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4178, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4179, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4180, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4181, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4182, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4183, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4184, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4185, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4186, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4187, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4188, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4189, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4190, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4191, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4192, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4193, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4194, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4195, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4196, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4197, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4198, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4199, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4200, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4201, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4202, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4203, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4204, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4205, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4206, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4207, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4208, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4209, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4210, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4211, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4212, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4213, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4214, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4215, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4216, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4217, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4218, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4219, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4220, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4221, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4222, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4223, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4224, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4225, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4226, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4227, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4228, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4229, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4230, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4231, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4232, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4233, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4234, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4235, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4236, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4237, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4238, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4239, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4240, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4241, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4242, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4243, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4244, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4245, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4246, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4247, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4248, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4249, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4250, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4251, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4252, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4253, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4254, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4255, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4256, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4257, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4258, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4259, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4260, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4261, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4262, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4263, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4264, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4265, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4266, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4267, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4268, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4269, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4270, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4271, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4272, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4273, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 179, + "name": "diamond_ore", + "translation_key": "block.minecraft.diamond_ore", + "item_id": 63, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 4274, + "states": [ + { + "id": 4274, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 180, + "name": "deepslate_diamond_ore", + "translation_key": "block.minecraft.deepslate_diamond_ore", + "item_id": 64, + "hardness": 4.5, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 4275, + "states": [ + { + "id": 4275, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 181, + "name": "diamond_block", + "translation_key": "block.minecraft.diamond_block", + "item_id": 77, + "hardness": 5.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 4276, + "states": [ + { + "id": 4276, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 182, + "name": "crafting_table", + "translation_key": "block.minecraft.crafting_table", + "item_id": 278, + "hardness": 2.5, + "blast_resistance": 2.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 4277, + "states": [ + { + "id": 4277, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 183, + "name": "wheat", + "translation_key": "block.minecraft.wheat", + "item_id": 813, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "age", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7" + ] + } + ], + "default_state_id": 4278, + "states": [ + { + "id": 4278, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4279, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4280, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4281, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4282, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4283, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4284, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4285, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 184, + "name": "farmland", + "translation_key": "block.minecraft.farmland", + "item_id": 279, + "hardness": 0.6, + "blast_resistance": 0.6, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "moisture", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7" + ] + } + ], + "default_state_id": 4286, + "states": [ + { + "id": 4286, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 63 + ] + }, + { + "id": 4287, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 63 + ] + }, + { + "id": 4288, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 63 + ] + }, + { + "id": 4289, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 63 + ] + }, + { + "id": 4290, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 63 + ] + }, + { + "id": 4291, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 63 + ] + }, + { + "id": 4292, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 63 + ] + }, + { + "id": 4293, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 63 + ] + } + ] + }, + { + "id": 185, + "name": "furnace", + "translation_key": "block.minecraft.furnace", + "item_id": 280, + "hardness": 3.5, + "blast_resistance": 3.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4295, + "states": [ + { + "id": 4294, + "luminance": 13, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 0 + }, + { + "id": 4295, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 0 + }, + { + "id": 4296, + "luminance": 13, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 0 + }, + { + "id": 4297, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 0 + }, + { + "id": 4298, + "luminance": 13, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 0 + }, + { + "id": 4299, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 0 + }, + { + "id": 4300, + "luminance": 13, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 0 + }, + { + "id": 4301, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 0 + } + ] + }, + { + "id": 186, + "name": "oak_sign", + "translation_key": "block.minecraft.oak_sign", + "item_id": 846, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 199, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4303, + "states": [ + { + "id": 4302, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4303, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4304, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4305, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4306, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4307, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4308, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4309, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4310, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4311, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4312, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4313, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4314, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4315, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4316, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4317, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4318, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4319, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4320, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4321, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4322, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4323, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4324, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4325, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4326, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4327, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4328, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4329, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4330, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4331, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4332, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4333, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + } + ] + }, + { + "id": 187, + "name": "spruce_sign", + "translation_key": "block.minecraft.spruce_sign", + "item_id": 847, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 200, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4335, + "states": [ + { + "id": 4334, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4335, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4336, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4337, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4338, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4339, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4340, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4341, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4342, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4343, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4344, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4345, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4346, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4347, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4348, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4349, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4350, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4351, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4352, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4353, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4354, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4355, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4356, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4357, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4358, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4359, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4360, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4361, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4362, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4363, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4364, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4365, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + } + ] + }, + { + "id": 188, + "name": "birch_sign", + "translation_key": "block.minecraft.birch_sign", + "item_id": 848, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 201, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4367, + "states": [ + { + "id": 4366, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4367, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4368, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4369, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4370, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4371, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4372, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4373, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4374, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4375, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4376, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4377, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4378, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4379, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4380, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4381, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4382, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4383, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4384, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4385, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4386, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4387, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4388, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4389, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4390, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4391, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4392, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4393, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4394, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4395, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4396, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4397, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + } + ] + }, + { + "id": 189, + "name": "acacia_sign", + "translation_key": "block.minecraft.acacia_sign", + "item_id": 850, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 202, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4399, + "states": [ + { + "id": 4398, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4399, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4400, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4401, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4402, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4403, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4404, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4405, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4406, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4407, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4408, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4409, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4410, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4411, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4412, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4413, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4414, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4415, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4416, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4417, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4418, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4419, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4420, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4421, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4422, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4423, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4424, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4425, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4426, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4427, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4428, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4429, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + } + ] + }, + { + "id": 190, + "name": "cherry_sign", + "translation_key": "block.minecraft.cherry_sign", + "item_id": 851, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 203, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4431, + "states": [ + { + "id": 4430, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4431, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4432, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4433, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4434, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4435, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4436, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4437, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4438, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4439, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4440, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4441, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4442, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4443, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4444, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4445, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4446, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4447, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4448, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4449, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4450, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4451, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4452, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4453, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4454, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4455, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4456, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4457, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4458, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4459, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4460, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4461, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + } + ] + }, + { + "id": 191, + "name": "jungle_sign", + "translation_key": "block.minecraft.jungle_sign", + "item_id": 849, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 204, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4463, + "states": [ + { + "id": 4462, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4463, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4464, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4465, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4466, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4467, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4468, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4469, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4470, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4471, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4472, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4473, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4474, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4475, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4476, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4477, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4478, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4479, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4480, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4481, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4482, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4483, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4484, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4485, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4486, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4487, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4488, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4489, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4490, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4491, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4492, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4493, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + } + ] + }, + { + "id": 192, + "name": "dark_oak_sign", + "translation_key": "block.minecraft.dark_oak_sign", + "item_id": 852, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 205, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4495, + "states": [ + { + "id": 4494, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4495, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4496, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4497, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4498, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4499, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4500, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4501, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4502, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4503, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4504, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4505, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4506, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4507, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4508, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4509, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4510, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4511, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4512, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4513, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4514, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4515, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4516, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4517, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4518, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4519, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4520, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4521, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4522, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4523, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4524, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4525, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + } + ] + }, + { + "id": 193, + "name": "mangrove_sign", + "translation_key": "block.minecraft.mangrove_sign", + "item_id": 853, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 206, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4527, + "states": [ + { + "id": 4526, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4527, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4528, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4529, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4530, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4531, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4532, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4533, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4534, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4535, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4536, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4537, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4538, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4539, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4540, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4541, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4542, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4543, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4544, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4545, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4546, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4547, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4548, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4549, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4550, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4551, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4552, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4553, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4554, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4555, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4556, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4557, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + } + ] + }, + { + "id": 194, + "name": "bamboo_sign", + "translation_key": "block.minecraft.bamboo_sign", + "item_id": 854, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 207, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4559, + "states": [ + { + "id": 4558, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4559, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4560, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4561, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4562, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4563, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4564, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4565, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4566, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4567, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4568, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4569, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4570, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4571, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4572, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4573, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4574, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4575, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4576, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4577, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4578, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4579, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4580, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4581, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4582, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4583, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4584, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4585, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4586, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4587, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4588, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4589, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + } + ] + }, + { + "id": 195, + "name": "oak_door", + "translation_key": "block.minecraft.oak_door", + "item_id": 689, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "upper", + "lower" + ] + }, + { + "name": "hinge", + "values": [ + "left", + "right" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4601, + "states": [ + { + "id": 4590, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 4591, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 4592, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 4593, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 4594, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 4595, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 4596, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 4597, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 4598, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 4599, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 4600, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 4601, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 4602, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 4603, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 4604, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 4605, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 4606, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 4607, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 4608, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 4609, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 4610, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 4611, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 4612, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 4613, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 4614, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 4615, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 4616, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 4617, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 4618, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 4619, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 4620, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 4621, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 4622, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 4623, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 4624, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 4625, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 4626, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 4627, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 4628, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 4629, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 4630, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 4631, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 4632, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 4633, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 4634, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 4635, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 4636, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 4637, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 4638, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 4639, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 4640, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 4641, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 4642, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 4643, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 4644, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 4645, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 4646, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 4647, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 4648, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 4649, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 4650, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 4651, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 4652, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 4653, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + } + ] + }, + { + "id": 196, + "name": "ladder", + "translation_key": "block.minecraft.ladder", + "item_id": 281, + "hardness": 0.4, + "blast_resistance": 0.4, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4655, + "states": [ + { + "id": 4654, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 65 + ] + }, + { + "id": 4655, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 65 + ] + }, + { + "id": 4656, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 67 + ] + }, + { + "id": 4657, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 67 + ] + }, + { + "id": 4658, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 66 + ] + }, + { + "id": 4659, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 66 + ] + }, + { + "id": 4660, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 64 + ] + }, + { + "id": 4661, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 64 + ] + } + ] + }, + { + "id": 197, + "name": "rail", + "translation_key": "block.minecraft.rail", + "item_id": 725, + "hardness": 0.7, + "blast_resistance": 0.7, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "shape", + "values": [ + "north_south", + "east_west", + "ascending_east", + "ascending_west", + "ascending_north", + "ascending_south", + "south_east", + "south_west", + "north_west", + "north_east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4663, + "states": [ + { + "id": 4662, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4663, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4664, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4665, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4666, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4667, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4668, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4669, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4670, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4671, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4672, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4673, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4674, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4675, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4676, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4677, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4678, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4679, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4680, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 4681, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 198, + "name": "cobblestone_stairs", + "translation_key": "block.minecraft.cobblestone_stairs", + "item_id": 282, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4693, + "states": [ + { + "id": 4682, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 4683, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 4684, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 4685, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 4686, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 4687, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 4688, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 4689, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 4690, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 4691, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 4692, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 4693, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 4694, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 4695, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 4696, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 4697, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 4698, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 4699, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 4700, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 4701, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 4702, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 4703, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 4704, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 4705, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 4706, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 4707, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 4708, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 4709, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 4710, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 4711, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 4712, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 4713, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 4714, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 4715, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 4716, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 4717, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 4718, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 4719, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 4720, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 4721, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 4722, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 4723, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 4724, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 4725, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 4726, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 4727, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 4728, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 4729, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 4730, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 4731, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 4732, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 4733, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 4734, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 4735, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 4736, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 4737, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 4738, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 4739, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 4740, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 4741, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 4742, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 4743, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 4744, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 4745, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 4746, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 4747, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 4748, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 4749, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 4750, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 4751, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 4752, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 4753, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 4754, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 4755, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 4756, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 4757, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 4758, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 4759, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 4760, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 4761, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 199, + "name": "oak_wall_sign", + "translation_key": "block.minecraft.oak_sign", + "item_id": 846, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4763, + "states": [ + { + "id": 4762, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4763, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4764, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4765, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4766, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4767, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4768, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4769, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + } + ] + }, + { + "id": 200, + "name": "spruce_wall_sign", + "translation_key": "block.minecraft.spruce_sign", + "item_id": 847, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4771, + "states": [ + { + "id": 4770, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4771, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4772, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4773, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4774, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4775, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4776, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4777, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + } + ] + }, + { + "id": 201, + "name": "birch_wall_sign", + "translation_key": "block.minecraft.birch_sign", + "item_id": 848, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4779, + "states": [ + { + "id": 4778, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4779, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4780, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4781, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4782, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4783, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4784, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4785, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + } + ] + }, + { + "id": 202, + "name": "acacia_wall_sign", + "translation_key": "block.minecraft.acacia_sign", + "item_id": 850, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4787, + "states": [ + { + "id": 4786, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4787, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4788, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4789, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4790, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4791, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4792, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4793, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + } + ] + }, + { + "id": 203, + "name": "cherry_wall_sign", + "translation_key": "block.minecraft.cherry_sign", + "item_id": 851, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4795, + "states": [ + { + "id": 4794, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4795, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4796, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4797, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4798, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4799, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4800, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4801, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + } + ] + }, + { + "id": 204, + "name": "jungle_wall_sign", + "translation_key": "block.minecraft.jungle_sign", + "item_id": 849, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4803, + "states": [ + { + "id": 4802, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4803, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4804, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4805, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4806, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4807, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4808, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4809, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + } + ] + }, + { + "id": 205, + "name": "dark_oak_wall_sign", + "translation_key": "block.minecraft.dark_oak_sign", + "item_id": 852, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4811, + "states": [ + { + "id": 4810, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4811, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4812, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4813, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4814, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4815, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4816, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4817, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + } + ] + }, + { + "id": 206, + "name": "mangrove_wall_sign", + "translation_key": "block.minecraft.mangrove_sign", + "item_id": 853, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4819, + "states": [ + { + "id": 4818, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4819, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4820, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4821, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4822, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4823, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4824, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4825, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + } + ] + }, + { + "id": 207, + "name": "bamboo_wall_sign", + "translation_key": "block.minecraft.bamboo_sign", + "item_id": 854, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4827, + "states": [ + { + "id": 4826, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4827, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4828, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4829, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4830, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4831, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4832, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 4833, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + } + ] + }, + { + "id": 208, + "name": "oak_hanging_sign", + "translation_key": "block.minecraft.oak_hanging_sign", + "item_id": 857, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 219, + "properties": [ + { + "name": "attached", + "values": [ + "true", + "false" + ] + }, + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4867, + "states": [ + { + "id": 4834, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4835, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4836, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4837, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4838, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4839, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4840, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4841, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4842, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4843, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4844, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4845, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4846, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4847, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4848, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4849, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4850, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4851, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4852, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4853, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4854, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4855, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4856, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4857, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4858, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4859, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4860, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4861, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4862, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4863, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4864, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4865, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4866, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4867, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4868, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4869, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4870, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4871, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4872, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4873, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4874, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4875, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4876, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4877, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4878, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4879, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4880, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4881, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4882, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4883, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4884, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4885, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4886, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4887, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4888, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4889, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4890, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4891, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4892, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4893, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4894, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4895, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4896, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4897, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + } + ] + }, + { + "id": 209, + "name": "spruce_hanging_sign", + "translation_key": "block.minecraft.spruce_hanging_sign", + "item_id": 858, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 220, + "properties": [ + { + "name": "attached", + "values": [ + "true", + "false" + ] + }, + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4931, + "states": [ + { + "id": 4898, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4899, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4900, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4901, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4902, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4903, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4904, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4905, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4906, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4907, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4908, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4909, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4910, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4911, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4912, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4913, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4914, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4915, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4916, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4917, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4918, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4919, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4920, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4921, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4922, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4923, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4924, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4925, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4926, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4927, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4928, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4929, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4930, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4931, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4932, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4933, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4934, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4935, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4936, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4937, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4938, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4939, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4940, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4941, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4942, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4943, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4944, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4945, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4946, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4947, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4948, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4949, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4950, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4951, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4952, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4953, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4954, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4955, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4956, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4957, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4958, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4959, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4960, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4961, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + } + ] + }, + { + "id": 210, + "name": "birch_hanging_sign", + "translation_key": "block.minecraft.birch_hanging_sign", + "item_id": 859, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 221, + "properties": [ + { + "name": "attached", + "values": [ + "true", + "false" + ] + }, + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 4995, + "states": [ + { + "id": 4962, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4963, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4964, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4965, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4966, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4967, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4968, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4969, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4970, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4971, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4972, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4973, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4974, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4975, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4976, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4977, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4978, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4979, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4980, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4981, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4982, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4983, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4984, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4985, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4986, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4987, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4988, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4989, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4990, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4991, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4992, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4993, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4994, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4995, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4996, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4997, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4998, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 4999, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5000, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5001, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5002, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5003, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5004, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5005, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5006, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5007, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5008, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5009, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5010, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5011, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5012, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5013, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5014, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5015, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5016, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5017, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5018, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5019, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5020, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5021, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5022, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5023, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5024, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5025, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + } + ] + }, + { + "id": 211, + "name": "acacia_hanging_sign", + "translation_key": "block.minecraft.acacia_hanging_sign", + "item_id": 861, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 222, + "properties": [ + { + "name": "attached", + "values": [ + "true", + "false" + ] + }, + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5059, + "states": [ + { + "id": 5026, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5027, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5028, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5029, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5030, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5031, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5032, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5033, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5034, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5035, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5036, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5037, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5038, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5039, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5040, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5041, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5042, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5043, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5044, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5045, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5046, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5047, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5048, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5049, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5050, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5051, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5052, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5053, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5054, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5055, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5056, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5057, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5058, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5059, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5060, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5061, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5062, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5063, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5064, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5065, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5066, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5067, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5068, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5069, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5070, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5071, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5072, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5073, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5074, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5075, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5076, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5077, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5078, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5079, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5080, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5081, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5082, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5083, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5084, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5085, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5086, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5087, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5088, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5089, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + } + ] + }, + { + "id": 212, + "name": "cherry_hanging_sign", + "translation_key": "block.minecraft.cherry_hanging_sign", + "item_id": 862, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 223, + "properties": [ + { + "name": "attached", + "values": [ + "true", + "false" + ] + }, + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5123, + "states": [ + { + "id": 5090, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5091, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5092, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5093, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5094, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5095, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5096, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5097, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5098, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5099, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5100, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5101, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5102, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5103, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5104, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5105, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5106, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5107, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5108, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5109, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5110, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5111, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5112, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5113, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5114, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5115, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5116, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5117, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5118, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5119, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5120, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5121, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5122, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5123, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5124, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5125, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5126, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5127, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5128, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5129, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5130, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5131, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5132, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5133, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5134, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5135, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5136, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5137, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5138, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5139, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5140, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5141, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5142, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5143, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5144, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5145, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5146, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5147, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5148, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5149, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5150, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5151, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5152, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5153, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + } + ] + }, + { + "id": 213, + "name": "jungle_hanging_sign", + "translation_key": "block.minecraft.jungle_hanging_sign", + "item_id": 860, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 224, + "properties": [ + { + "name": "attached", + "values": [ + "true", + "false" + ] + }, + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5187, + "states": [ + { + "id": 5154, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5155, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5156, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5157, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5158, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5159, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5160, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5161, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5162, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5163, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5164, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5165, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5166, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5167, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5168, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5169, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5170, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5171, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5172, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5173, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5174, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5175, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5176, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5177, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5178, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5179, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5180, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5181, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5182, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5183, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5184, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5185, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5186, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5187, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5188, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5189, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5190, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5191, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5192, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5193, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5194, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5195, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5196, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5197, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5198, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5199, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5200, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5201, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5202, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5203, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5204, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5205, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5206, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5207, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5208, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5209, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5210, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5211, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5212, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5213, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5214, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5215, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5216, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5217, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + } + ] + }, + { + "id": 214, + "name": "dark_oak_hanging_sign", + "translation_key": "block.minecraft.dark_oak_hanging_sign", + "item_id": 863, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 225, + "properties": [ + { + "name": "attached", + "values": [ + "true", + "false" + ] + }, + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5251, + "states": [ + { + "id": 5218, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5219, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5220, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5221, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5222, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5223, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5224, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5225, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5226, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5227, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5228, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5229, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5230, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5231, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5232, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5233, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5234, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5235, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5236, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5237, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5238, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5239, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5240, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5241, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5242, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5243, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5244, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5245, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5246, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5247, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5248, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5249, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5250, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5251, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5252, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5253, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5254, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5255, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5256, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5257, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5258, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5259, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5260, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5261, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5262, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5263, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5264, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5265, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5266, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5267, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5268, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5269, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5270, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5271, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5272, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5273, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5274, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5275, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5276, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5277, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5278, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5279, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5280, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5281, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + } + ] + }, + { + "id": 215, + "name": "crimson_hanging_sign", + "translation_key": "block.minecraft.crimson_hanging_sign", + "item_id": 866, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 227, + "properties": [ + { + "name": "attached", + "values": [ + "true", + "false" + ] + }, + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5315, + "states": [ + { + "id": 5282, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5283, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5284, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5285, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5286, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5287, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5288, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5289, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5290, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5291, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5292, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5293, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5294, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5295, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5296, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5297, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5298, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5299, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5300, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5301, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5302, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5303, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5304, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5305, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5306, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5307, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5308, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5309, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5310, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5311, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5312, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5313, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5314, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5315, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5316, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5317, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5318, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5319, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5320, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5321, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5322, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5323, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5324, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5325, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5326, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5327, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5328, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5329, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5330, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5331, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5332, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5333, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5334, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5335, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5336, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5337, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5338, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5339, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5340, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5341, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5342, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5343, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5344, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5345, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + } + ] + }, + { + "id": 216, + "name": "warped_hanging_sign", + "translation_key": "block.minecraft.warped_hanging_sign", + "item_id": 867, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 228, + "properties": [ + { + "name": "attached", + "values": [ + "true", + "false" + ] + }, + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5379, + "states": [ + { + "id": 5346, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5347, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5348, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5349, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5350, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5351, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5352, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5353, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5354, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5355, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5356, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5357, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5358, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5359, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5360, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5361, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5362, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5363, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5364, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5365, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5366, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5367, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5368, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5369, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5370, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5371, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5372, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5373, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5374, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5375, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5376, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5377, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5378, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5379, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5380, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5381, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5382, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5383, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5384, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5385, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5386, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5387, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5388, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5389, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5390, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5391, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5392, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5393, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5394, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5395, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5396, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5397, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5398, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5399, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5400, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5401, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5402, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5403, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5404, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5405, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5406, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5407, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5408, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5409, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + } + ] + }, + { + "id": 217, + "name": "mangrove_hanging_sign", + "translation_key": "block.minecraft.mangrove_hanging_sign", + "item_id": 864, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 226, + "properties": [ + { + "name": "attached", + "values": [ + "true", + "false" + ] + }, + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5443, + "states": [ + { + "id": 5410, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5411, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5412, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5413, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5414, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5415, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5416, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5417, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5418, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5419, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5420, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5421, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5422, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5423, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5424, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5425, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5426, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5427, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5428, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5429, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5430, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5431, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5432, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5433, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5434, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5435, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5436, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5437, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5438, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5439, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5440, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5441, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5442, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5443, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5444, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5445, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5446, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5447, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5448, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5449, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5450, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5451, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5452, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5453, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5454, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5455, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5456, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5457, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5458, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5459, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5460, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5461, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5462, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5463, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5464, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5465, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5466, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5467, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5468, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5469, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5470, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5471, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5472, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5473, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + } + ] + }, + { + "id": 218, + "name": "bamboo_hanging_sign", + "translation_key": "block.minecraft.bamboo_hanging_sign", + "item_id": 865, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 229, + "properties": [ + { + "name": "attached", + "values": [ + "true", + "false" + ] + }, + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5507, + "states": [ + { + "id": 5474, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5475, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5476, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5477, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5478, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5479, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5480, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5481, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5482, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5483, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5484, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5485, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5486, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5487, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5488, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5489, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5490, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5491, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5492, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5493, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5494, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5495, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5496, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5497, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5498, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5499, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5500, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5501, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5502, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5503, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5504, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5505, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5506, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5507, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5508, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5509, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5510, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5511, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5512, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5513, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5514, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5515, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5516, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5517, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5518, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5519, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5520, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5521, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5522, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5523, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5524, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5525, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5526, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5527, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5528, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5529, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5530, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5531, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5532, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5533, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5534, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5535, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5536, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + }, + { + "id": 5537, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 8 + } + ] + }, + { + "id": 219, + "name": "oak_wall_hanging_sign", + "translation_key": "block.minecraft.oak_hanging_sign", + "item_id": 857, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5539, + "states": [ + { + "id": 5538, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5539, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5540, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5541, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5542, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5543, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5544, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5545, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + } + ] + }, + { + "id": 220, + "name": "spruce_wall_hanging_sign", + "translation_key": "block.minecraft.spruce_hanging_sign", + "item_id": 858, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5547, + "states": [ + { + "id": 5546, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5547, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5548, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5549, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5550, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5551, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5552, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5553, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + } + ] + }, + { + "id": 221, + "name": "birch_wall_hanging_sign", + "translation_key": "block.minecraft.birch_hanging_sign", + "item_id": 859, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5555, + "states": [ + { + "id": 5554, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5555, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5556, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5557, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5558, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5559, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5560, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5561, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + } + ] + }, + { + "id": 222, + "name": "acacia_wall_hanging_sign", + "translation_key": "block.minecraft.acacia_hanging_sign", + "item_id": 861, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5563, + "states": [ + { + "id": 5562, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5563, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5564, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5565, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5566, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5567, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5568, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5569, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + } + ] + }, + { + "id": 223, + "name": "cherry_wall_hanging_sign", + "translation_key": "block.minecraft.cherry_hanging_sign", + "item_id": 862, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5571, + "states": [ + { + "id": 5570, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5571, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5572, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5573, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5574, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5575, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5576, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5577, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + } + ] + }, + { + "id": 224, + "name": "jungle_wall_hanging_sign", + "translation_key": "block.minecraft.jungle_hanging_sign", + "item_id": 860, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5579, + "states": [ + { + "id": 5578, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5579, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5580, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5581, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5582, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5583, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5584, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5585, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + } + ] + }, + { + "id": 225, + "name": "dark_oak_wall_hanging_sign", + "translation_key": "block.minecraft.dark_oak_hanging_sign", + "item_id": 863, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5587, + "states": [ + { + "id": 5586, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5587, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5588, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5589, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5590, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5591, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5592, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5593, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + } + ] + }, + { + "id": 226, + "name": "mangrove_wall_hanging_sign", + "translation_key": "block.minecraft.mangrove_hanging_sign", + "item_id": 864, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5595, + "states": [ + { + "id": 5594, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5595, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5596, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5597, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5598, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5599, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5600, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5601, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + } + ] + }, + { + "id": 227, + "name": "crimson_wall_hanging_sign", + "translation_key": "block.minecraft.crimson_hanging_sign", + "item_id": 866, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5603, + "states": [ + { + "id": 5602, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5603, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5604, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5605, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5606, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5607, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5608, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5609, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + } + ] + }, + { + "id": 228, + "name": "warped_wall_hanging_sign", + "translation_key": "block.minecraft.warped_hanging_sign", + "item_id": 867, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5611, + "states": [ + { + "id": 5610, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5611, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5612, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5613, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5614, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5615, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5616, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5617, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + } + ] + }, + { + "id": 229, + "name": "bamboo_wall_hanging_sign", + "translation_key": "block.minecraft.bamboo_hanging_sign", + "item_id": 865, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5619, + "states": [ + { + "id": 5618, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5619, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5620, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5621, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 68 + ], + "block_entity_type": 8 + }, + { + "id": 5622, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5623, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5624, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + }, + { + "id": 5625, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 69 + ], + "block_entity_type": 8 + } + ] + }, + { + "id": 230, + "name": "lever", + "translation_key": "block.minecraft.lever", + "item_id": 650, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "face", + "values": [ + "floor", + "wall", + "ceiling" + ] + }, + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5635, + "states": [ + { + "id": 5626, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5627, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5628, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5629, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5630, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5631, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5632, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5633, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5634, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5635, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5636, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5637, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5638, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5639, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5640, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5641, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5642, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5643, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5644, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5645, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5646, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5647, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5648, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5649, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 231, + "name": "stone_pressure_plate", + "translation_key": "block.minecraft.stone_pressure_plate", + "item_id": 673, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5651, + "states": [ + { + "id": 5650, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 5651, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 232, + "name": "iron_door", + "translation_key": "block.minecraft.iron_door", + "item_id": 688, + "hardness": 5.0, + "blast_resistance": 5.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "upper", + "lower" + ] + }, + { + "name": "hinge", + "values": [ + "left", + "right" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5663, + "states": [ + { + "id": 5652, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 5653, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 5654, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 5655, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 5656, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 5657, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 5658, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 5659, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 5660, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 5661, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 5662, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 5663, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 5664, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 5665, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 5666, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 5667, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 5668, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 5669, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 5670, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 5671, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 5672, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 5673, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 5674, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 5675, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 5676, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 5677, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 5678, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 5679, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 5680, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 5681, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 5682, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 5683, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 5684, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 5685, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 5686, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 5687, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 5688, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 5689, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 5690, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 5691, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 5692, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 5693, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 5694, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 5695, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 5696, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 5697, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 5698, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 5699, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 5700, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 5701, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 5702, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 5703, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 5704, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 5705, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 5706, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 5707, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 5708, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 5709, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 5710, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 5711, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 5712, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 5713, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 5714, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 5715, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + } + ] + }, + { + "id": 233, + "name": "oak_pressure_plate", + "translation_key": "block.minecraft.oak_pressure_plate", + "item_id": 677, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5717, + "states": [ + { + "id": 5716, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 5717, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 234, + "name": "spruce_pressure_plate", + "translation_key": "block.minecraft.spruce_pressure_plate", + "item_id": 678, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5719, + "states": [ + { + "id": 5718, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 5719, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 235, + "name": "birch_pressure_plate", + "translation_key": "block.minecraft.birch_pressure_plate", + "item_id": 679, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5721, + "states": [ + { + "id": 5720, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 5721, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 236, + "name": "jungle_pressure_plate", + "translation_key": "block.minecraft.jungle_pressure_plate", + "item_id": 680, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5723, + "states": [ + { + "id": 5722, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 5723, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 237, + "name": "acacia_pressure_plate", + "translation_key": "block.minecraft.acacia_pressure_plate", + "item_id": 681, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5725, + "states": [ + { + "id": 5724, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 5725, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 238, + "name": "cherry_pressure_plate", + "translation_key": "block.minecraft.cherry_pressure_plate", + "item_id": 682, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5727, + "states": [ + { + "id": 5726, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 5727, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 239, + "name": "dark_oak_pressure_plate", + "translation_key": "block.minecraft.dark_oak_pressure_plate", + "item_id": 683, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5729, + "states": [ + { + "id": 5728, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 5729, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 240, + "name": "mangrove_pressure_plate", + "translation_key": "block.minecraft.mangrove_pressure_plate", + "item_id": 684, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5731, + "states": [ + { + "id": 5730, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 5731, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 241, + "name": "bamboo_pressure_plate", + "translation_key": "block.minecraft.bamboo_pressure_plate", + "item_id": 685, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5733, + "states": [ + { + "id": 5732, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 5733, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 242, + "name": "redstone_ore", + "translation_key": "block.minecraft.redstone_ore", + "item_id": 57, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5735, + "states": [ + { + "id": 5734, + "luminance": 9, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 5735, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 243, + "name": "deepslate_redstone_ore", + "translation_key": "block.minecraft.deepslate_redstone_ore", + "item_id": 58, + "hardness": 4.5, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5737, + "states": [ + { + "id": 5736, + "luminance": 9, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 5737, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 244, + "name": "redstone_torch", + "translation_key": "block.minecraft.redstone_torch", + "item_id": 636, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 245, + "properties": [ + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5738, + "states": [ + { + "id": 5738, + "luminance": 7, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5739, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 245, + "name": "redstone_wall_torch", + "translation_key": "block.minecraft.redstone_torch", + "item_id": 636, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5740, + "states": [ + { + "id": 5740, + "luminance": 7, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5741, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5742, + "luminance": 7, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5743, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5744, + "luminance": 7, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5745, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5746, + "luminance": 7, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5747, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 246, + "name": "stone_button", + "translation_key": "block.minecraft.stone_button", + "item_id": 660, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "face", + "values": [ + "floor", + "wall", + "ceiling" + ] + }, + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5757, + "states": [ + { + "id": 5748, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5749, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5750, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5751, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5752, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5753, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5754, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5755, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5756, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5757, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5758, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5759, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5760, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5761, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5762, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5763, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5764, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5765, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5766, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5767, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5768, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5769, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5770, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5771, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 247, + "name": "snow", + "translation_key": "block.minecraft.snow", + "item_id": 283, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "layers", + "values": [ + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8" + ] + } + ], + "default_state_id": 5772, + "states": [ + { + "id": 5772, + "luminance": 0, + "opaque": true, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5773, + "luminance": 0, + "opaque": true, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5774, + "luminance": 0, + "opaque": true, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [ + 38 + ] + }, + { + "id": 5775, + "luminance": 0, + "opaque": true, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [ + 71 + ] + }, + { + "id": 5776, + "luminance": 0, + "opaque": true, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [ + 51 + ] + }, + { + "id": 5777, + "luminance": 0, + "opaque": true, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [ + 72 + ] + }, + { + "id": 5778, + "luminance": 0, + "opaque": true, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [ + 18 + ] + }, + { + "id": 5779, + "luminance": 0, + "opaque": true, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [ + 73 + ] + } + ] + }, + { + "id": 248, + "name": "ice", + "translation_key": "block.minecraft.ice", + "item_id": 284, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.98, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5780, + "states": [ + { + "id": 5780, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 249, + "name": "snow_block", + "translation_key": "block.minecraft.snow_block", + "item_id": 285, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5781, + "states": [ + { + "id": 5781, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 250, + "name": "cactus", + "translation_key": "block.minecraft.cactus", + "item_id": 286, + "hardness": 0.4, + "blast_resistance": 0.4, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "age", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 5782, + "states": [ + { + "id": 5782, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 74 + ] + }, + { + "id": 5783, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 74 + ] + }, + { + "id": 5784, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 74 + ] + }, + { + "id": 5785, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 74 + ] + }, + { + "id": 5786, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 74 + ] + }, + { + "id": 5787, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 74 + ] + }, + { + "id": 5788, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 74 + ] + }, + { + "id": 5789, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 74 + ] + }, + { + "id": 5790, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 74 + ] + }, + { + "id": 5791, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 74 + ] + }, + { + "id": 5792, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 74 + ] + }, + { + "id": 5793, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 74 + ] + }, + { + "id": 5794, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 74 + ] + }, + { + "id": 5795, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 74 + ] + }, + { + "id": 5796, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 74 + ] + }, + { + "id": 5797, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 74 + ] + } + ] + }, + { + "id": 251, + "name": "clay", + "translation_key": "block.minecraft.clay", + "item_id": 287, + "hardness": 0.6, + "blast_resistance": 0.6, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5798, + "states": [ + { + "id": 5798, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 252, + "name": "sugar_cane", + "translation_key": "block.minecraft.sugar_cane", + "item_id": 221, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "age", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 5799, + "states": [ + { + "id": 5799, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5800, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5801, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5802, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5803, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5804, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5805, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5806, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5807, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5808, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5809, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5810, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5811, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5812, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5813, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5814, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 253, + "name": "jukebox", + "translation_key": "block.minecraft.jukebox", + "item_id": 288, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "has_record", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5816, + "states": [ + { + "id": 5815, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 4 + }, + { + "id": 5816, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 4 + } + ] + }, + { + "id": 254, + "name": "oak_fence", + "translation_key": "block.minecraft.oak_fence", + "item_id": 289, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5848, + "states": [ + { + "id": 5817, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76, + 77 + ] + }, + { + "id": 5818, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78, + 79 + ] + }, + { + "id": 5819, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76, + 77 + ] + }, + { + "id": 5820, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78, + 79 + ] + }, + { + "id": 5821, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76 + ] + }, + { + "id": 5822, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80, + 79 + ] + }, + { + "id": 5823, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76 + ] + }, + { + "id": 5824, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80, + 79 + ] + }, + { + "id": 5825, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 77 + ] + }, + { + "id": 5826, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81, + 79 + ] + }, + { + "id": 5827, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 77 + ] + }, + { + "id": 5828, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81, + 79 + ] + }, + { + "id": 5829, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 5830, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 82 + ] + }, + { + "id": 5831, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 5832, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 82 + ] + }, + { + "id": 5833, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76, + 77 + ] + }, + { + "id": 5834, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 5835, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76, + 77 + ] + }, + { + "id": 5836, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 5837, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76 + ] + }, + { + "id": 5838, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80 + ] + }, + { + "id": 5839, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76 + ] + }, + { + "id": 5840, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80 + ] + }, + { + "id": 5841, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 77 + ] + }, + { + "id": 5842, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81 + ] + }, + { + "id": 5843, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 77 + ] + }, + { + "id": 5844, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81 + ] + }, + { + "id": 5845, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83 + ] + }, + { + "id": 5846, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 84 + ] + }, + { + "id": 5847, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83 + ] + }, + { + "id": 5848, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 84 + ] + } + ] + }, + { + "id": 255, + "name": "pumpkin", + "translation_key": "block.minecraft.pumpkin", + "item_id": 300, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5849, + "states": [ + { + "id": 5849, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 256, + "name": "netherrack", + "translation_key": "block.minecraft.netherrack", + "item_id": 303, + "hardness": 0.4, + "blast_resistance": 0.4, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5850, + "states": [ + { + "id": 5850, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 257, + "name": "soul_sand", + "translation_key": "block.minecraft.soul_sand", + "item_id": 304, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 0.4, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5851, + "states": [ + { + "id": 5851, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 73 + ] + } + ] + }, + { + "id": 258, + "name": "soul_soil", + "translation_key": "block.minecraft.soul_soil", + "item_id": 305, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5852, + "states": [ + { + "id": 5852, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 259, + "name": "basalt", + "translation_key": "block.minecraft.basalt", + "item_id": 306, + "hardness": 1.25, + "blast_resistance": 4.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 5854, + "states": [ + { + "id": 5853, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 5854, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 5855, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 260, + "name": "polished_basalt", + "translation_key": "block.minecraft.polished_basalt", + "item_id": 307, + "hardness": 1.25, + "blast_resistance": 4.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 5857, + "states": [ + { + "id": 5856, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 5857, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 5858, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 261, + "name": "soul_torch", + "translation_key": "block.minecraft.soul_torch", + "item_id": 309, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 262, + "properties": [], + "default_state_id": 5859, + "states": [ + { + "id": 5859, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 262, + "name": "soul_wall_torch", + "translation_key": "block.minecraft.soul_torch", + "item_id": 309, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 5860, + "states": [ + { + "id": 5860, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5861, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5862, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5863, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 263, + "name": "glowstone", + "translation_key": "block.minecraft.glowstone", + "item_id": 310, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5864, + "states": [ + { + "id": 5864, + "luminance": 15, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 264, + "name": "nether_portal", + "translation_key": "block.minecraft.nether_portal", + "item_id": 0, + "hardness": -1.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "z" + ] + } + ], + "default_state_id": 5865, + "states": [ + { + "id": 5865, + "luminance": 11, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 5866, + "luminance": 11, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 265, + "name": "carved_pumpkin", + "translation_key": "block.minecraft.carved_pumpkin", + "item_id": 301, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 5867, + "states": [ + { + "id": 5867, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 5868, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 5869, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 5870, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 266, + "name": "jack_o_lantern", + "translation_key": "block.minecraft.jack_o_lantern", + "item_id": 302, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 5871, + "states": [ + { + "id": 5871, + "luminance": 15, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 5872, + "luminance": 15, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 5873, + "luminance": 15, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 5874, + "luminance": 15, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 267, + "name": "cake", + "translation_key": "block.minecraft.cake", + "item_id": 923, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "bites", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6" + ] + } + ], + "default_state_id": 5875, + "states": [ + { + "id": 5875, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85 + ] + }, + { + "id": 5876, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 86 + ] + }, + { + "id": 5877, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 87 + ] + }, + { + "id": 5878, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 88 + ] + }, + { + "id": 5879, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 89 + ] + }, + { + "id": 5880, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 90 + ] + }, + { + "id": 5881, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 91 + ] + } + ] + }, + { + "id": 268, + "name": "repeater", + "translation_key": "block.minecraft.repeater", + "item_id": 638, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "delay", + "values": [ + "1", + "2", + "3", + "4" + ] + }, + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "locked", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5885, + "states": [ + { + "id": 5882, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5883, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5884, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5885, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5886, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5887, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5888, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5889, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5890, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5891, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5892, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5893, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5894, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5895, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5896, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5897, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5898, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5899, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5900, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5901, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5902, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5903, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5904, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5905, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5906, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5907, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5908, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5909, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5910, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5911, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5912, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5913, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5914, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5915, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5916, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5917, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5918, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5919, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5920, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5921, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5922, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5923, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5924, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5925, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5926, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5927, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5928, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5929, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5930, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5931, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5932, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5933, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5934, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5935, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5936, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5937, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5938, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5939, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5940, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5941, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5942, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5943, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5944, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + }, + { + "id": 5945, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ] + } + ] + }, + { + "id": 269, + "name": "white_stained_glass", + "translation_key": "block.minecraft.white_stained_glass", + "item_id": 449, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5946, + "states": [ + { + "id": 5946, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 270, + "name": "orange_stained_glass", + "translation_key": "block.minecraft.orange_stained_glass", + "item_id": 450, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5947, + "states": [ + { + "id": 5947, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 271, + "name": "magenta_stained_glass", + "translation_key": "block.minecraft.magenta_stained_glass", + "item_id": 451, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5948, + "states": [ + { + "id": 5948, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 272, + "name": "light_blue_stained_glass", + "translation_key": "block.minecraft.light_blue_stained_glass", + "item_id": 452, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5949, + "states": [ + { + "id": 5949, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 273, + "name": "yellow_stained_glass", + "translation_key": "block.minecraft.yellow_stained_glass", + "item_id": 453, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5950, + "states": [ + { + "id": 5950, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 274, + "name": "lime_stained_glass", + "translation_key": "block.minecraft.lime_stained_glass", + "item_id": 454, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5951, + "states": [ + { + "id": 5951, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 275, + "name": "pink_stained_glass", + "translation_key": "block.minecraft.pink_stained_glass", + "item_id": 455, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5952, + "states": [ + { + "id": 5952, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 276, + "name": "gray_stained_glass", + "translation_key": "block.minecraft.gray_stained_glass", + "item_id": 456, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5953, + "states": [ + { + "id": 5953, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 277, + "name": "light_gray_stained_glass", + "translation_key": "block.minecraft.light_gray_stained_glass", + "item_id": 457, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5954, + "states": [ + { + "id": 5954, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 278, + "name": "cyan_stained_glass", + "translation_key": "block.minecraft.cyan_stained_glass", + "item_id": 458, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5955, + "states": [ + { + "id": 5955, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 279, + "name": "purple_stained_glass", + "translation_key": "block.minecraft.purple_stained_glass", + "item_id": 459, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5956, + "states": [ + { + "id": 5956, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 280, + "name": "blue_stained_glass", + "translation_key": "block.minecraft.blue_stained_glass", + "item_id": 460, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5957, + "states": [ + { + "id": 5957, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 281, + "name": "brown_stained_glass", + "translation_key": "block.minecraft.brown_stained_glass", + "item_id": 461, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5958, + "states": [ + { + "id": 5958, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 282, + "name": "green_stained_glass", + "translation_key": "block.minecraft.green_stained_glass", + "item_id": 462, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5959, + "states": [ + { + "id": 5959, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 283, + "name": "red_stained_glass", + "translation_key": "block.minecraft.red_stained_glass", + "item_id": 463, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5960, + "states": [ + { + "id": 5960, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 284, + "name": "black_stained_glass", + "translation_key": "block.minecraft.black_stained_glass", + "item_id": 464, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 5961, + "states": [ + { + "id": 5961, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 285, + "name": "oak_trapdoor", + "translation_key": "block.minecraft.oak_trapdoor", + "item_id": 701, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 5977, + "states": [ + { + "id": 5962, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 5963, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 5964, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 5965, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 5966, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 5967, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 5968, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 5969, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 5970, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 5971, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 5972, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 5973, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 5974, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 5975, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 5976, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 5977, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 5978, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 5979, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 5980, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 5981, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 5982, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 5983, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 5984, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 5985, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 5986, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 5987, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 5988, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 5989, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 5990, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 5991, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 5992, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 5993, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 5994, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 5995, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 5996, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 5997, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 5998, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 5999, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6000, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6001, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6002, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6003, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6004, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6005, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6006, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6007, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6008, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6009, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6010, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6011, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6012, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6013, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6014, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6015, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6016, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6017, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6018, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6019, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6020, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6021, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6022, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6023, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6024, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6025, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + } + ] + }, + { + "id": 286, + "name": "spruce_trapdoor", + "translation_key": "block.minecraft.spruce_trapdoor", + "item_id": 702, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 6041, + "states": [ + { + "id": 6026, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6027, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6028, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6029, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6030, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6031, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6032, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6033, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6034, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6035, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6036, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6037, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6038, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6039, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6040, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6041, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6042, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6043, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6044, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6045, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6046, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6047, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6048, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6049, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6050, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6051, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6052, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6053, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6054, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6055, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6056, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6057, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6058, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6059, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6060, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6061, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6062, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6063, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6064, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6065, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6066, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6067, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6068, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6069, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6070, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6071, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6072, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6073, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6074, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6075, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6076, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6077, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6078, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6079, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6080, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6081, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6082, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6083, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6084, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6085, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6086, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6087, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6088, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6089, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + } + ] + }, + { + "id": 287, + "name": "birch_trapdoor", + "translation_key": "block.minecraft.birch_trapdoor", + "item_id": 703, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 6105, + "states": [ + { + "id": 6090, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6091, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6092, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6093, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6094, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6095, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6096, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6097, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6098, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6099, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6100, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6101, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6102, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6103, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6104, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6105, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6106, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6107, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6108, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6109, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6110, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6111, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6112, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6113, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6114, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6115, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6116, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6117, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6118, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6119, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6120, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6121, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6122, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6123, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6124, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6125, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6126, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6127, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6128, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6129, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6130, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6131, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6132, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6133, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6134, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6135, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6136, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6137, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6138, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6139, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6140, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6141, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6142, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6143, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6144, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6145, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6146, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6147, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6148, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6149, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6150, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6151, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6152, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6153, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + } + ] + }, + { + "id": 288, + "name": "jungle_trapdoor", + "translation_key": "block.minecraft.jungle_trapdoor", + "item_id": 704, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 6169, + "states": [ + { + "id": 6154, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6155, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6156, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6157, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6158, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6159, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6160, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6161, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6162, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6163, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6164, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6165, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6166, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6167, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6168, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6169, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6170, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6171, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6172, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6173, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6174, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6175, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6176, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6177, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6178, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6179, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6180, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6181, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6182, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6183, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6184, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6185, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6186, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6187, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6188, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6189, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6190, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6191, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6192, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6193, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6194, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6195, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6196, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6197, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6198, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6199, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6200, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6201, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6202, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6203, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6204, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6205, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6206, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6207, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6208, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6209, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6210, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6211, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6212, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6213, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6214, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6215, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6216, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6217, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + } + ] + }, + { + "id": 289, + "name": "acacia_trapdoor", + "translation_key": "block.minecraft.acacia_trapdoor", + "item_id": 705, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 6233, + "states": [ + { + "id": 6218, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6219, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6220, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6221, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6222, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6223, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6224, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6225, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6226, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6227, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6228, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6229, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6230, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6231, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6232, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6233, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6234, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6235, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6236, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6237, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6238, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6239, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6240, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6241, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6242, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6243, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6244, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6245, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6246, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6247, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6248, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6249, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6250, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6251, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6252, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6253, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6254, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6255, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6256, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6257, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6258, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6259, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6260, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6261, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6262, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6263, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6264, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6265, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6266, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6267, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6268, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6269, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6270, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6271, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6272, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6273, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6274, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6275, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6276, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6277, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6278, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6279, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6280, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6281, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + } + ] + }, + { + "id": 290, + "name": "cherry_trapdoor", + "translation_key": "block.minecraft.cherry_trapdoor", + "item_id": 706, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 6297, + "states": [ + { + "id": 6282, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6283, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6284, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6285, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6286, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6287, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6288, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6289, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6290, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6291, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6292, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6293, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6294, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6295, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6296, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6297, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6298, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6299, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6300, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6301, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6302, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6303, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6304, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6305, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6306, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6307, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6308, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6309, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6310, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6311, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6312, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6313, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6314, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6315, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6316, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6317, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6318, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6319, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6320, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6321, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6322, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6323, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6324, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6325, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6326, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6327, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6328, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6329, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6330, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6331, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6332, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6333, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6334, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6335, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6336, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6337, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6338, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6339, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6340, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6341, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6342, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6343, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6344, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6345, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + } + ] + }, + { + "id": 291, + "name": "dark_oak_trapdoor", + "translation_key": "block.minecraft.dark_oak_trapdoor", + "item_id": 707, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 6361, + "states": [ + { + "id": 6346, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6347, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6348, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6349, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6350, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6351, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6352, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6353, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6354, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6355, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6356, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6357, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6358, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6359, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6360, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6361, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6362, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6363, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6364, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6365, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6366, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6367, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6368, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6369, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6370, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6371, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6372, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6373, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6374, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6375, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6376, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6377, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6378, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6379, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6380, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6381, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6382, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6383, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6384, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6385, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6386, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6387, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6388, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6389, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6390, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6391, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6392, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6393, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6394, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6395, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6396, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6397, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6398, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6399, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6400, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6401, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6402, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6403, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6404, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6405, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6406, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6407, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6408, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6409, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + } + ] + }, + { + "id": 292, + "name": "mangrove_trapdoor", + "translation_key": "block.minecraft.mangrove_trapdoor", + "item_id": 708, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 6425, + "states": [ + { + "id": 6410, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6411, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6412, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6413, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6414, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6415, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6416, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6417, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6418, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6419, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6420, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6421, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6422, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6423, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6424, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6425, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6426, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6427, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6428, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6429, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6430, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6431, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6432, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6433, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6434, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6435, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6436, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6437, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6438, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6439, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6440, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6441, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6442, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6443, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6444, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6445, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6446, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6447, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6448, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6449, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6450, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6451, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6452, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6453, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6454, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6455, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6456, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6457, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6458, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6459, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6460, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6461, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6462, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6463, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6464, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6465, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6466, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6467, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6468, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6469, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6470, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6471, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6472, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6473, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + } + ] + }, + { + "id": 293, + "name": "bamboo_trapdoor", + "translation_key": "block.minecraft.bamboo_trapdoor", + "item_id": 709, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 6489, + "states": [ + { + "id": 6474, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6475, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6476, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6477, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6478, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6479, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6480, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6481, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6482, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6483, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6484, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6485, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 6486, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6487, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6488, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6489, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6490, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6491, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6492, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6493, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6494, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6495, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6496, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6497, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6498, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6499, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6500, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6501, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 6502, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6503, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6504, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6505, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6506, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6507, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6508, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6509, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6510, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6511, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6512, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6513, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6514, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6515, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6516, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6517, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 6518, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6519, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6520, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6521, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6522, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6523, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6524, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6525, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6526, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6527, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6528, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6529, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 6530, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6531, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6532, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6533, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 6534, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6535, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6536, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 6537, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + } + ] + }, + { + "id": 294, + "name": "stone_bricks", + "translation_key": "block.minecraft.stone_bricks", + "item_id": 318, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 6538, + "states": [ + { + "id": 6538, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 295, + "name": "mossy_stone_bricks", + "translation_key": "block.minecraft.mossy_stone_bricks", + "item_id": 319, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 6539, + "states": [ + { + "id": 6539, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 296, + "name": "cracked_stone_bricks", + "translation_key": "block.minecraft.cracked_stone_bricks", + "item_id": 320, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 6540, + "states": [ + { + "id": 6540, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 297, + "name": "chiseled_stone_bricks", + "translation_key": "block.minecraft.chiseled_stone_bricks", + "item_id": 321, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 6541, + "states": [ + { + "id": 6541, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 298, + "name": "packed_mud", + "translation_key": "block.minecraft.packed_mud", + "item_id": 322, + "hardness": 1.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 6542, + "states": [ + { + "id": 6542, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 299, + "name": "mud_bricks", + "translation_key": "block.minecraft.mud_bricks", + "item_id": 323, + "hardness": 1.5, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 6543, + "states": [ + { + "id": 6543, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 300, + "name": "infested_stone", + "translation_key": "block.minecraft.infested_stone", + "item_id": 311, + "hardness": 0.75, + "blast_resistance": 0.75, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 6544, + "states": [ + { + "id": 6544, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 301, + "name": "infested_cobblestone", + "translation_key": "block.minecraft.infested_cobblestone", + "item_id": 312, + "hardness": 1.0, + "blast_resistance": 0.75, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 6545, + "states": [ + { + "id": 6545, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 302, + "name": "infested_stone_bricks", + "translation_key": "block.minecraft.infested_stone_bricks", + "item_id": 313, + "hardness": 0.75, + "blast_resistance": 0.75, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 6546, + "states": [ + { + "id": 6546, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 303, + "name": "infested_mossy_stone_bricks", + "translation_key": "block.minecraft.infested_mossy_stone_bricks", + "item_id": 314, + "hardness": 0.75, + "blast_resistance": 0.75, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 6547, + "states": [ + { + "id": 6547, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 304, + "name": "infested_cracked_stone_bricks", + "translation_key": "block.minecraft.infested_cracked_stone_bricks", + "item_id": 315, + "hardness": 0.75, + "blast_resistance": 0.75, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 6548, + "states": [ + { + "id": 6548, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 305, + "name": "infested_chiseled_stone_bricks", + "translation_key": "block.minecraft.infested_chiseled_stone_bricks", + "item_id": 316, + "hardness": 0.75, + "blast_resistance": 0.75, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 6549, + "states": [ + { + "id": 6549, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 306, + "name": "brown_mushroom_block", + "translation_key": "block.minecraft.brown_mushroom_block", + "item_id": 330, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "down", + "values": [ + "true", + "false" + ] + }, + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 6550, + "states": [ + { + "id": 6550, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6551, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6552, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6553, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6554, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6555, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6556, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6557, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6558, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6559, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6560, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6561, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6562, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6563, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6564, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6565, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6566, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6567, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6568, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6569, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6570, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6571, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6572, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6573, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6574, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6575, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6576, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6577, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6578, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6579, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6580, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6581, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6582, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6583, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6584, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6585, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6586, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6587, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6588, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6589, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6590, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6591, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6592, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6593, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6594, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6595, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6596, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6597, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6598, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6599, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6600, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6601, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6602, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6603, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6604, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6605, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6606, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6607, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6608, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6609, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6610, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6611, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6612, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6613, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 307, + "name": "red_mushroom_block", + "translation_key": "block.minecraft.red_mushroom_block", + "item_id": 331, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "down", + "values": [ + "true", + "false" + ] + }, + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 6614, + "states": [ + { + "id": 6614, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6615, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6616, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6617, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6618, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6619, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6620, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6621, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6622, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6623, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6624, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6625, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6626, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6627, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6628, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6629, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6630, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6631, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6632, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6633, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6634, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6635, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6636, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6637, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6638, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6639, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6640, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6641, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6642, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6643, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6644, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6645, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6646, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6647, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6648, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6649, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6650, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6651, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6652, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6653, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6654, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6655, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6656, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6657, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6658, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6659, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6660, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6661, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6662, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6663, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6664, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6665, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6666, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6667, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6668, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6669, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6670, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6671, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6672, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6673, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6674, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6675, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6676, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6677, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 308, + "name": "mushroom_stem", + "translation_key": "block.minecraft.mushroom_stem", + "item_id": 332, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "down", + "values": [ + "true", + "false" + ] + }, + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 6678, + "states": [ + { + "id": 6678, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6679, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6680, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6681, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6682, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6683, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6684, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6685, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6686, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6687, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6688, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6689, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6690, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6691, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6692, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6693, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6694, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6695, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6696, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6697, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6698, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6699, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6700, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6701, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6702, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6703, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6704, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6705, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6706, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6707, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6708, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6709, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6710, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6711, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6712, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6713, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6714, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6715, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6716, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6717, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6718, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6719, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6720, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6721, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6722, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6723, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6724, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6725, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6726, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6727, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6728, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6729, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6730, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6731, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6732, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6733, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6734, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6735, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6736, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6737, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6738, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6739, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6740, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 6741, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 309, + "name": "iron_bars", + "translation_key": "block.minecraft.iron_bars", + "item_id": 333, + "hardness": 5.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 6773, + "states": [ + { + "id": 6742, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 6743, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 6744, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 6745, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 6746, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 6747, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 6748, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 6749, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 6750, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 6751, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 6752, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 6753, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 6754, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 6755, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 6756, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 6757, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 6758, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 6759, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 6760, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 6761, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 6762, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 6763, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 6764, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 6765, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 6766, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 6767, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 6768, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 6769, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 6770, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 6771, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + }, + { + "id": 6772, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 6773, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + } + ] + }, + { + "id": 310, + "name": "chain", + "translation_key": "block.minecraft.chain", + "item_id": 334, + "hardness": 5.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 6777, + "states": [ + { + "id": 6774, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 104 + ] + }, + { + "id": 6775, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 104 + ] + }, + { + "id": 6776, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 105 + ] + }, + { + "id": 6777, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 105 + ] + }, + { + "id": 6778, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 106 + ] + }, + { + "id": 6779, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 106 + ] + } + ] + }, + { + "id": 311, + "name": "glass_pane", + "translation_key": "block.minecraft.glass_pane", + "item_id": 335, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 6811, + "states": [ + { + "id": 6780, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 6781, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 6782, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 6783, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 6784, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 6785, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 6786, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 6787, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 6788, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 6789, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 6790, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 6791, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 6792, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 6793, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 6794, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 6795, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 6796, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 6797, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 6798, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 6799, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 6800, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 6801, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 6802, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 6803, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 6804, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 6805, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 6806, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 6807, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 6808, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 6809, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + }, + { + "id": 6810, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 6811, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + } + ] + }, + { + "id": 312, + "name": "melon", + "translation_key": "block.minecraft.melon", + "item_id": 336, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 6812, + "states": [ + { + "id": 6812, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 313, + "name": "attached_pumpkin_stem", + "translation_key": "block.minecraft.attached_pumpkin_stem", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 6813, + "states": [ + { + "id": 6813, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6814, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6815, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6816, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 314, + "name": "attached_melon_stem", + "translation_key": "block.minecraft.attached_melon_stem", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 6817, + "states": [ + { + "id": 6817, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6818, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6819, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6820, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 315, + "name": "pumpkin_stem", + "translation_key": "block.minecraft.pumpkin_stem", + "item_id": 945, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "age", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7" + ] + } + ], + "default_state_id": 6821, + "states": [ + { + "id": 6821, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6822, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6823, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6824, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6825, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6826, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6827, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6828, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 316, + "name": "melon_stem", + "translation_key": "block.minecraft.melon_stem", + "item_id": 946, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "age", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7" + ] + } + ], + "default_state_id": 6829, + "states": [ + { + "id": 6829, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6830, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6831, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6832, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6833, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6834, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6835, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6836, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 317, + "name": "vine", + "translation_key": "block.minecraft.vine", + "item_id": 337, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 6868, + "states": [ + { + "id": 6837, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6838, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6839, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6840, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6841, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6842, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6843, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6844, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6845, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6846, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6847, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6848, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6849, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6850, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6851, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6852, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6853, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6854, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6855, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6856, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6857, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6858, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6859, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6860, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6861, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6862, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6863, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6864, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6865, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6866, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6867, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6868, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 318, + "name": "glow_lichen", + "translation_key": "block.minecraft.glow_lichen", + "item_id": 338, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "down", + "values": [ + "true", + "false" + ] + }, + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 6996, + "states": [ + { + "id": 6869, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6870, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6871, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6872, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6873, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6874, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6875, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6876, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6877, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6878, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6879, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6880, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6881, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6882, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6883, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6884, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6885, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6886, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6887, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6888, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6889, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6890, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6891, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6892, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6893, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6894, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6895, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6896, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6897, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6898, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6899, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6900, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6901, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6902, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6903, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6904, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6905, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6906, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6907, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6908, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6909, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6910, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6911, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6912, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6913, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6914, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6915, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6916, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6917, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6918, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6919, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6920, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6921, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6922, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6923, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6924, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6925, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6926, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6927, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6928, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6929, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6930, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6931, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6932, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6933, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6934, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6935, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6936, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6937, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6938, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6939, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6940, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6941, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6942, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6943, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6944, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6945, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6946, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6947, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6948, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6949, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6950, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6951, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6952, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6953, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6954, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6955, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6956, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6957, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6958, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6959, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6960, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6961, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6962, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6963, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6964, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6965, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6966, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6967, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6968, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6969, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6970, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6971, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6972, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6973, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6974, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6975, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6976, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6977, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6978, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6979, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6980, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6981, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6982, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6983, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6984, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6985, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6986, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6987, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6988, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6989, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6990, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6991, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6992, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6993, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6994, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6995, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 6996, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 319, + "name": "oak_fence_gate", + "translation_key": "block.minecraft.oak_fence_gate", + "item_id": 712, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "in_wall", + "values": [ + "true", + "false" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 7004, + "states": [ + { + "id": 6997, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 6998, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 6999, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 7000, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 7001, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 7002, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 7003, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 7004, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 7005, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 7006, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 7007, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 7008, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 7009, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 7010, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 7011, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 7012, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 7013, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 7014, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 7015, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 7016, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 7017, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 7018, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 7019, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 7020, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 7021, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 7022, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 7023, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 7024, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 7025, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 7026, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 7027, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 7028, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + } + ] + }, + { + "id": 320, + "name": "brick_stairs", + "translation_key": "block.minecraft.brick_stairs", + "item_id": 339, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 7040, + "states": [ + { + "id": 7029, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 7030, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 7031, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7032, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7033, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7034, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7035, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7036, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7037, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7038, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7039, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 7040, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 7041, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7042, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7043, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7044, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7045, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7046, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7047, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7048, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7049, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 7050, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 7051, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7052, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7053, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7054, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7055, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7056, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7057, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7058, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7059, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 7060, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 7061, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7062, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7063, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7064, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7065, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 7066, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 7067, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7068, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7069, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 7070, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 7071, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7072, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7073, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7074, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7075, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7076, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7077, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7078, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7079, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 7080, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 7081, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7082, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7083, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7084, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7085, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7086, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7087, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7088, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7089, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 7090, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 7091, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7092, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7093, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7094, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7095, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7096, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7097, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7098, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7099, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 7100, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 7101, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7102, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7103, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7104, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7105, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7106, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7107, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 7108, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 321, + "name": "stone_brick_stairs", + "translation_key": "block.minecraft.stone_brick_stairs", + "item_id": 340, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 7120, + "states": [ + { + "id": 7109, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 7110, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 7111, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7112, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7113, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7114, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7115, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7116, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7117, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7118, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7119, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 7120, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 7121, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7122, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7123, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7124, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7125, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7126, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7127, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7128, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7129, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 7130, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 7131, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7132, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7133, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7134, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7135, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7136, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7137, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7138, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7139, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 7140, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 7141, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7142, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7143, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7144, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7145, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 7146, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 7147, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7148, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7149, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 7150, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 7151, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7152, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7153, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7154, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7155, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7156, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7157, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7158, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7159, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 7160, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 7161, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7162, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7163, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7164, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7165, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7166, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7167, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7168, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7169, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 7170, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 7171, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7172, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7173, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7174, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7175, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7176, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7177, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7178, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7179, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 7180, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 7181, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7182, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7183, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7184, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7185, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7186, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7187, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 7188, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 322, + "name": "mud_brick_stairs", + "translation_key": "block.minecraft.mud_brick_stairs", + "item_id": 341, + "hardness": 1.5, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 7200, + "states": [ + { + "id": 7189, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 7190, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 7191, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7192, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7193, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7194, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7195, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7196, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7197, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7198, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7199, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 7200, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 7201, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7202, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7203, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7204, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7205, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7206, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7207, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7208, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7209, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 7210, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 7211, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7212, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7213, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7214, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7215, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7216, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7217, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7218, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7219, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 7220, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 7221, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7222, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7223, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7224, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7225, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 7226, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 7227, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7228, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7229, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 7230, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 7231, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7232, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7233, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7234, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7235, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7236, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7237, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7238, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7239, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 7240, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 7241, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7242, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7243, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7244, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7245, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7246, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7247, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7248, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7249, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 7250, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 7251, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7252, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7253, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7254, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7255, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7256, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7257, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7258, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7259, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 7260, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 7261, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7262, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7263, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7264, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7265, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7266, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7267, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 7268, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 323, + "name": "mycelium", + "translation_key": "block.minecraft.mycelium", + "item_id": 342, + "hardness": 0.6, + "blast_resistance": 0.6, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "snowy", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 7270, + "states": [ + { + "id": 7269, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 7270, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 324, + "name": "lily_pad", + "translation_key": "block.minecraft.lily_pad", + "item_id": 343, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 7271, + "states": [ + { + "id": 7271, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 107 + ] + } + ] + }, + { + "id": 325, + "name": "nether_bricks", + "translation_key": "block.minecraft.nether_bricks", + "item_id": 344, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 7272, + "states": [ + { + "id": 7272, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 326, + "name": "nether_brick_fence", + "translation_key": "block.minecraft.nether_brick_fence", + "item_id": 347, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 7304, + "states": [ + { + "id": 7273, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76, + 77 + ] + }, + { + "id": 7274, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78, + 79 + ] + }, + { + "id": 7275, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76, + 77 + ] + }, + { + "id": 7276, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78, + 79 + ] + }, + { + "id": 7277, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76 + ] + }, + { + "id": 7278, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80, + 79 + ] + }, + { + "id": 7279, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76 + ] + }, + { + "id": 7280, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80, + 79 + ] + }, + { + "id": 7281, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 77 + ] + }, + { + "id": 7282, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81, + 79 + ] + }, + { + "id": 7283, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 77 + ] + }, + { + "id": 7284, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81, + 79 + ] + }, + { + "id": 7285, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 7286, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 82 + ] + }, + { + "id": 7287, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 7288, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 82 + ] + }, + { + "id": 7289, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76, + 77 + ] + }, + { + "id": 7290, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 7291, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76, + 77 + ] + }, + { + "id": 7292, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 7293, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76 + ] + }, + { + "id": 7294, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80 + ] + }, + { + "id": 7295, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76 + ] + }, + { + "id": 7296, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80 + ] + }, + { + "id": 7297, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 77 + ] + }, + { + "id": 7298, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81 + ] + }, + { + "id": 7299, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 77 + ] + }, + { + "id": 7300, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81 + ] + }, + { + "id": 7301, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83 + ] + }, + { + "id": 7302, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 84 + ] + }, + { + "id": 7303, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83 + ] + }, + { + "id": 7304, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 84 + ] + } + ] + }, + { + "id": 327, + "name": "nether_brick_stairs", + "translation_key": "block.minecraft.nether_brick_stairs", + "item_id": 348, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 7316, + "states": [ + { + "id": 7305, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 7306, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 7307, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7308, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7309, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7310, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7311, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7312, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7313, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7314, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7315, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 7316, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 7317, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7318, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7319, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7320, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7321, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7322, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7323, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7324, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7325, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 7326, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 7327, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7328, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7329, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7330, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7331, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7332, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7333, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7334, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7335, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 7336, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 7337, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7338, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7339, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7340, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7341, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 7342, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 7343, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7344, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7345, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 7346, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 7347, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7348, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7349, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7350, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7351, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7352, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7353, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7354, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7355, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 7356, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 7357, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7358, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7359, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7360, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7361, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7362, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7363, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7364, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7365, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 7366, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 7367, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7368, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7369, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7370, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7371, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7372, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7373, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7374, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7375, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 7376, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 7377, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7378, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7379, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7380, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7381, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7382, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7383, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 7384, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 328, + "name": "nether_wart", + "translation_key": "block.minecraft.nether_wart", + "item_id": 956, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "age", + "values": [ + "0", + "1", + "2", + "3" + ] + } + ], + "default_state_id": 7385, + "states": [ + { + "id": 7385, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7386, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7387, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7388, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 329, + "name": "enchanting_table", + "translation_key": "block.minecraft.enchanting_table", + "item_id": 353, + "hardness": 5.0, + "blast_resistance": 1200.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 7389, + "states": [ + { + "id": 7389, + "luminance": 7, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 18 + ], + "block_entity_type": 12 + } + ] + }, + { + "id": 330, + "name": "brewing_stand", + "translation_key": "block.minecraft.brewing_stand", + "item_id": 963, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "has_bottle_0", + "values": [ + "true", + "false" + ] + }, + { + "name": "has_bottle_1", + "values": [ + "true", + "false" + ] + }, + { + "name": "has_bottle_2", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 7397, + "states": [ + { + "id": 7390, + "luminance": 1, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 108, + 109 + ], + "block_entity_type": 11 + }, + { + "id": 7391, + "luminance": 1, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 108, + 109 + ], + "block_entity_type": 11 + }, + { + "id": 7392, + "luminance": 1, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 108, + 109 + ], + "block_entity_type": 11 + }, + { + "id": 7393, + "luminance": 1, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 108, + 109 + ], + "block_entity_type": 11 + }, + { + "id": 7394, + "luminance": 1, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 108, + 109 + ], + "block_entity_type": 11 + }, + { + "id": 7395, + "luminance": 1, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 108, + 109 + ], + "block_entity_type": 11 + }, + { + "id": 7396, + "luminance": 1, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 108, + 109 + ], + "block_entity_type": 11 + }, + { + "id": 7397, + "luminance": 1, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 108, + 109 + ], + "block_entity_type": 11 + } + ] + }, + { + "id": 331, + "name": "cauldron", + "translation_key": "block.minecraft.cauldron", + "item_id": 964, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 7398, + "states": [ + { + "id": 7398, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124 + ] + } + ] + }, + { + "id": 332, + "name": "water_cauldron", + "translation_key": "block.minecraft.water_cauldron", + "item_id": 964, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "level", + "values": [ + "1", + "2", + "3" + ] + } + ], + "default_state_id": 7399, + "states": [ + { + "id": 7399, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124 + ] + }, + { + "id": 7400, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124 + ] + }, + { + "id": 7401, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124 + ] + } + ] + }, + { + "id": 333, + "name": "lava_cauldron", + "translation_key": "block.minecraft.lava_cauldron", + "item_id": 964, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 7402, + "states": [ + { + "id": 7402, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124 + ] + } + ] + }, + { + "id": 334, + "name": "powder_snow_cauldron", + "translation_key": "block.minecraft.powder_snow_cauldron", + "item_id": 964, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "level", + "values": [ + "1", + "2", + "3" + ] + } + ], + "default_state_id": 7403, + "states": [ + { + "id": 7403, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124 + ] + }, + { + "id": 7404, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124 + ] + }, + { + "id": 7405, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124 + ] + } + ] + }, + { + "id": 335, + "name": "end_portal", + "translation_key": "block.minecraft.end_portal", + "item_id": 0, + "hardness": -1.0, + "blast_resistance": 3600000.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 7406, + "states": [ + { + "id": 7406, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [], + "block_entity_type": 13 + } + ] + }, + { + "id": 336, + "name": "end_portal_frame", + "translation_key": "block.minecraft.end_portal_frame", + "item_id": 354, + "hardness": -1.0, + "blast_resistance": 3600000.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "eye", + "values": [ + "true", + "false" + ] + }, + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 7411, + "states": [ + { + "id": 7407, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 125, + 126 + ] + }, + { + "id": 7408, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 125, + 126 + ] + }, + { + "id": 7409, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 125, + 126 + ] + }, + { + "id": 7410, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 125, + 126 + ] + }, + { + "id": 7411, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 125 + ] + }, + { + "id": 7412, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 125 + ] + }, + { + "id": 7413, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 125 + ] + }, + { + "id": 7414, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 125 + ] + } + ] + }, + { + "id": 337, + "name": "end_stone", + "translation_key": "block.minecraft.end_stone", + "item_id": 355, + "hardness": 3.0, + "blast_resistance": 9.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 7415, + "states": [ + { + "id": 7415, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 338, + "name": "dragon_egg", + "translation_key": "block.minecraft.dragon_egg", + "item_id": 357, + "hardness": 3.0, + "blast_resistance": 9.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 7416, + "states": [ + { + "id": 7416, + "luminance": 1, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 127 + ] + } + ] + }, + { + "id": 339, + "name": "redstone_lamp", + "translation_key": "block.minecraft.redstone_lamp", + "item_id": 658, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 7418, + "states": [ + { + "id": 7417, + "luminance": 15, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 7418, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 340, + "name": "cocoa", + "translation_key": "block.minecraft.cocoa", + "item_id": 903, + "hardness": 0.2, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "age", + "values": [ + "0", + "1", + "2" + ] + }, + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 7419, + "states": [ + { + "id": 7419, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 128 + ] + }, + { + "id": 7420, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 129 + ] + }, + { + "id": 7421, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 130 + ] + }, + { + "id": 7422, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 131 + ] + }, + { + "id": 7423, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 132 + ] + }, + { + "id": 7424, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 133 + ] + }, + { + "id": 7425, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 134 + ] + }, + { + "id": 7426, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 135 + ] + }, + { + "id": 7427, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 136 + ] + }, + { + "id": 7428, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 137 + ] + }, + { + "id": 7429, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 138 + ] + }, + { + "id": 7430, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 139 + ] + } + ] + }, + { + "id": 341, + "name": "sandstone_stairs", + "translation_key": "block.minecraft.sandstone_stairs", + "item_id": 358, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 7442, + "states": [ + { + "id": 7431, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 7432, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 7433, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7434, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7435, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7436, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7437, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7438, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7439, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7440, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7441, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 7442, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 7443, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7444, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7445, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7446, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7447, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7448, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7449, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7450, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7451, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 7452, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 7453, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7454, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7455, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7456, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7457, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7458, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7459, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7460, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7461, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 7462, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 7463, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7464, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7465, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7466, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7467, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 7468, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 7469, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7470, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7471, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 7472, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 7473, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7474, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7475, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7476, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7477, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7478, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7479, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7480, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7481, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 7482, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 7483, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7484, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7485, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7486, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7487, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7488, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7489, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7490, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7491, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 7492, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 7493, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7494, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7495, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7496, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7497, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7498, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7499, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7500, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7501, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 7502, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 7503, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7504, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7505, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7506, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7507, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7508, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7509, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 7510, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 342, + "name": "emerald_ore", + "translation_key": "block.minecraft.emerald_ore", + "item_id": 59, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 7511, + "states": [ + { + "id": 7511, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 343, + "name": "deepslate_emerald_ore", + "translation_key": "block.minecraft.deepslate_emerald_ore", + "item_id": 60, + "hardness": 4.5, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 7512, + "states": [ + { + "id": 7512, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 344, + "name": "ender_chest", + "translation_key": "block.minecraft.ender_chest", + "item_id": 359, + "hardness": 22.5, + "blast_resistance": 600.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 7514, + "states": [ + { + "id": 7513, + "luminance": 7, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 58 + ], + "block_entity_type": 3 + }, + { + "id": 7514, + "luminance": 7, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 58 + ], + "block_entity_type": 3 + }, + { + "id": 7515, + "luminance": 7, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 58 + ], + "block_entity_type": 3 + }, + { + "id": 7516, + "luminance": 7, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 58 + ], + "block_entity_type": 3 + }, + { + "id": 7517, + "luminance": 7, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 58 + ], + "block_entity_type": 3 + }, + { + "id": 7518, + "luminance": 7, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 58 + ], + "block_entity_type": 3 + }, + { + "id": 7519, + "luminance": 7, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 58 + ], + "block_entity_type": 3 + }, + { + "id": 7520, + "luminance": 7, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 58 + ], + "block_entity_type": 3 + } + ] + }, + { + "id": 345, + "name": "tripwire_hook", + "translation_key": "block.minecraft.tripwire_hook", + "item_id": 655, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "attached", + "values": [ + "true", + "false" + ] + }, + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 7530, + "states": [ + { + "id": 7521, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7522, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7523, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7524, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7525, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7526, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7527, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7528, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7529, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7530, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7531, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7532, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7533, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7534, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7535, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7536, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 346, + "name": "tripwire", + "translation_key": "block.minecraft.tripwire", + "item_id": 810, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "attached", + "values": [ + "true", + "false" + ] + }, + { + "name": "disarmed", + "values": [ + "true", + "false" + ] + }, + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 7664, + "states": [ + { + "id": 7537, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7538, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7539, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7540, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7541, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7542, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7543, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7544, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7545, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7546, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7547, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7548, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7549, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7550, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7551, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7552, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7553, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7554, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7555, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7556, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7557, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7558, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7559, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7560, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7561, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7562, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7563, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7564, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7565, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7566, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7567, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7568, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7569, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7570, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7571, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7572, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7573, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7574, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7575, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7576, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7577, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7578, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7579, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7580, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7581, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7582, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7583, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7584, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7585, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7586, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7587, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7588, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7589, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7590, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7591, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7592, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7593, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7594, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7595, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7596, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7597, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7598, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7599, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7600, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7601, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7602, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7603, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7604, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7605, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7606, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7607, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7608, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7609, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7610, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7611, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7612, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7613, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7614, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7615, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7616, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7617, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7618, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7619, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7620, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7621, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7622, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7623, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7624, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7625, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7626, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7627, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7628, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7629, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7630, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7631, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7632, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7633, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7634, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7635, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7636, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7637, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7638, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7639, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7640, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7641, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7642, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7643, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7644, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7645, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7646, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7647, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7648, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7649, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7650, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7651, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7652, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7653, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7654, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7655, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7656, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7657, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7658, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7659, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7660, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7661, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7662, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7663, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 7664, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 347, + "name": "emerald_block", + "translation_key": "block.minecraft.emerald_block", + "item_id": 360, + "hardness": 5.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 7665, + "states": [ + { + "id": 7665, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 348, + "name": "spruce_stairs", + "translation_key": "block.minecraft.spruce_stairs", + "item_id": 362, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 7677, + "states": [ + { + "id": 7666, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 7667, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 7668, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7669, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7670, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7671, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7672, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7673, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7674, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7675, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7676, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 7677, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 7678, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7679, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7680, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7681, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7682, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7683, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7684, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7685, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7686, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 7687, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 7688, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7689, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7690, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7691, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7692, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7693, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7694, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7695, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7696, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 7697, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 7698, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7699, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7700, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7701, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7702, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 7703, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 7704, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7705, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7706, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 7707, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 7708, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7709, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7710, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7711, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7712, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7713, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7714, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7715, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7716, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 7717, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 7718, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7719, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7720, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7721, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7722, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7723, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7724, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7725, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7726, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 7727, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 7728, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7729, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7730, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7731, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7732, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7733, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7734, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7735, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7736, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 7737, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 7738, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7739, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7740, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7741, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7742, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7743, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7744, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 7745, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 349, + "name": "birch_stairs", + "translation_key": "block.minecraft.birch_stairs", + "item_id": 363, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 7757, + "states": [ + { + "id": 7746, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 7747, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 7748, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7749, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7750, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7751, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7752, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7753, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7754, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7755, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7756, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 7757, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 7758, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7759, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7760, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7761, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7762, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7763, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7764, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7765, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7766, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 7767, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 7768, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7769, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7770, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7771, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7772, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7773, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7774, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7775, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7776, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 7777, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 7778, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7779, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7780, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7781, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7782, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 7783, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 7784, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7785, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7786, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 7787, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 7788, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7789, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7790, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7791, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7792, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7793, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7794, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7795, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7796, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 7797, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 7798, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7799, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7800, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7801, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7802, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7803, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7804, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7805, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7806, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 7807, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 7808, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7809, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7810, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7811, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7812, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7813, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7814, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7815, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7816, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 7817, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 7818, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7819, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7820, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7821, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7822, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7823, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7824, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 7825, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 350, + "name": "jungle_stairs", + "translation_key": "block.minecraft.jungle_stairs", + "item_id": 364, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 7837, + "states": [ + { + "id": 7826, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 7827, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 7828, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7829, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7830, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7831, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7832, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7833, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7834, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7835, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7836, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 7837, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 7838, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7839, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7840, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7841, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7842, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7843, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7844, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7845, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7846, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 7847, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 7848, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7849, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7850, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7851, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7852, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7853, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7854, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7855, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7856, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 7857, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 7858, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7859, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7860, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7861, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7862, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 7863, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 7864, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7865, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7866, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 7867, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 7868, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7869, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 7870, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7871, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 7872, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7873, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 7874, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7875, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 7876, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 7877, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 7878, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7879, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 7880, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7881, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 7882, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7883, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 7884, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7885, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 7886, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 7887, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 7888, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7889, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 7890, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7891, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 7892, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7893, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 7894, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7895, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 7896, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 7897, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 7898, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7899, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 7900, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7901, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 7902, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7903, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 7904, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 7905, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 351, + "name": "command_block", + "translation_key": "block.minecraft.command_block", + "item_id": 373, + "hardness": -1.0, + "blast_resistance": 3600000.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "conditional", + "values": [ + "true", + "false" + ] + }, + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + } + ], + "default_state_id": 7912, + "states": [ + { + "id": 7906, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 7907, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 7908, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 7909, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 7910, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 7911, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 7912, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 7913, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 7914, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 7915, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 7916, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 7917, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + } + ] + }, + { + "id": 352, + "name": "beacon", + "translation_key": "block.minecraft.beacon", + "item_id": 374, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 7918, + "states": [ + { + "id": 7918, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 14 + } + ] + }, + { + "id": 353, + "name": "cobblestone_wall", + "translation_key": "block.minecraft.cobblestone_wall", + "item_id": 375, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "north", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "south", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "none", + "low", + "tall" + ] + } + ], + "default_state_id": 7922, + "states": [ + { + "id": 7919, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 7920, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 7921, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 7922, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 7923, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 7924, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 7925, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 7926, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 7927, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 7928, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 7929, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 7930, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 7931, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 7932, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 7933, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 7934, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 7935, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 7936, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 7937, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 7938, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 7939, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 7940, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 7941, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 7942, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 7943, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 7944, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 7945, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 7946, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 7947, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 7948, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 7949, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 7950, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 7951, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 7952, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 7953, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 7954, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 7955, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 7956, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 7957, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 7958, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 7959, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 7960, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 7961, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 7962, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 7963, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 7964, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 7965, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 7966, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 7967, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 7968, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 7969, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 7970, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 7971, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 7972, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 7973, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 7974, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 7975, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 7976, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 7977, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 7978, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 7979, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 7980, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 7981, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 7982, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 7983, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 7984, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 7985, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 7986, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 7987, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 7988, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 7989, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 7990, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 7991, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 7992, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 7993, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 7994, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 7995, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 7996, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 7997, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 7998, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 7999, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 8000, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 8001, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 8002, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 8003, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 8004, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8005, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8006, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 8007, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8008, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8009, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 8010, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 8011, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 8012, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 8013, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 8014, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 8015, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 8016, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8017, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8018, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 8019, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8020, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8021, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 8022, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 8023, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 8024, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 8025, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 8026, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 8027, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 8028, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 8029, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 8030, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 8031, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 8032, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 8033, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 8034, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 8035, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 8036, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 8037, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 8038, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 8039, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 8040, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8041, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8042, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 8043, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8044, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8045, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 8046, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8047, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8048, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 8049, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8050, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8051, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 8052, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8053, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8054, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 8055, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8056, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8057, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 8058, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8059, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8060, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 8061, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8062, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8063, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 8064, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8065, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8066, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 8067, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8068, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8069, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 8070, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8071, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8072, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 8073, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8074, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8075, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8076, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8077, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8078, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8079, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8080, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8081, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8082, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8083, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8084, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8085, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8086, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8087, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8088, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8089, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8090, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8091, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8092, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8093, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8094, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8095, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8096, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8097, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8098, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8099, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 8100, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8101, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8102, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 8103, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8104, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8105, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 8106, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8107, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8108, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 8109, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8110, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8111, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8112, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8113, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8114, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8115, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8116, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8117, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8118, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8119, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8120, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8121, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8122, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8123, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8124, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8125, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8126, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8127, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8128, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8129, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8130, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8131, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8132, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8133, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8134, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8135, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 8136, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 8137, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 8138, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 8139, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 8140, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 8141, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 8142, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 8143, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 8144, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 8145, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 8146, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 8147, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 8148, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8149, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8150, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 8151, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8152, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8153, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 8154, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8155, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8156, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 8157, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8158, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8159, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 8160, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8161, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8162, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 8163, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8164, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8165, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 8166, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8167, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8168, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 8169, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8170, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8171, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 8172, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8173, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8174, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 8175, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8176, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8177, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 8178, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8179, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8180, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 8181, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8182, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8183, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8184, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8185, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8186, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8187, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8188, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8189, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8190, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8191, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8192, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8193, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8194, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8195, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8196, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8197, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8198, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8199, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8200, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8201, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8202, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8203, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8204, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8205, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8206, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8207, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 8208, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8209, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8210, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 8211, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8212, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8213, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 8214, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8215, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8216, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 8217, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8218, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8219, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8220, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8221, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8222, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8223, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8224, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8225, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8226, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8227, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8228, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8229, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8230, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8231, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8232, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8233, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8234, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8235, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8236, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8237, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8238, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8239, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8240, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8241, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8242, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + } + ] + }, + { + "id": 354, + "name": "mossy_cobblestone_wall", + "translation_key": "block.minecraft.mossy_cobblestone_wall", + "item_id": 376, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "north", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "south", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "none", + "low", + "tall" + ] + } + ], + "default_state_id": 8246, + "states": [ + { + "id": 8243, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 8244, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 8245, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 8246, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 8247, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 8248, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 8249, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 8250, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 8251, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 8252, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 8253, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 8254, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 8255, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 8256, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 8257, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 8258, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 8259, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 8260, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 8261, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 8262, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 8263, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 8264, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 8265, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 8266, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 8267, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 8268, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 8269, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 8270, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 8271, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 8272, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 8273, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 8274, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 8275, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 8276, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 8277, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 8278, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 8279, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 8280, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 8281, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 8282, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 8283, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 8284, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 8285, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 8286, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 8287, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 8288, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 8289, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 8290, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 8291, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 8292, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8293, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8294, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 8295, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8296, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8297, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 8298, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 8299, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 8300, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 8301, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 8302, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 8303, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 8304, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8305, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8306, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 8307, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8308, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8309, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 8310, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 8311, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 8312, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 8313, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 8314, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 8315, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 8316, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 8317, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 8318, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 8319, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 8320, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 8321, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 8322, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 8323, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 8324, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 8325, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 8326, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 8327, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 8328, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8329, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8330, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 8331, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8332, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8333, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 8334, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 8335, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 8336, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 8337, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 8338, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 8339, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 8340, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8341, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8342, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 8343, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8344, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8345, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 8346, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 8347, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 8348, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 8349, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 8350, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 8351, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 8352, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 8353, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 8354, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 8355, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 8356, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 8357, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 8358, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 8359, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 8360, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 8361, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 8362, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 8363, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 8364, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8365, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8366, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 8367, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8368, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8369, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 8370, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8371, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8372, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 8373, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8374, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8375, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 8376, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8377, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8378, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 8379, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8380, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8381, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 8382, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8383, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8384, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 8385, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8386, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8387, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 8388, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8389, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8390, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 8391, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8392, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8393, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 8394, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8395, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8396, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 8397, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8398, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8399, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8400, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8401, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8402, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8403, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8404, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8405, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8406, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8407, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8408, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8409, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8410, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8411, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8412, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8413, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8414, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8415, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8416, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8417, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8418, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8419, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8420, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8421, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8422, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8423, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 8424, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8425, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8426, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 8427, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8428, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8429, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 8430, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8431, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8432, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 8433, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8434, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8435, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8436, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8437, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8438, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8439, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8440, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8441, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8442, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8443, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8444, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8445, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8446, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8447, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8448, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8449, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8450, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8451, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8452, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8453, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8454, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8455, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8456, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8457, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8458, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8459, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 8460, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 8461, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 8462, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 8463, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 8464, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 8465, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 8466, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 8467, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 8468, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 8469, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 8470, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 8471, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 8472, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8473, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8474, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 8475, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8476, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8477, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 8478, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8479, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8480, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 8481, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8482, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8483, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 8484, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8485, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8486, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 8487, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8488, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 8489, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 8490, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8491, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8492, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 8493, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8494, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 8495, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 8496, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8497, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8498, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 8499, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8500, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8501, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 8502, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8503, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8504, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 8505, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8506, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8507, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8508, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8509, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8510, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8511, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8512, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8513, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8514, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8515, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8516, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8517, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8518, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8519, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8520, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8521, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8522, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8523, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8524, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8525, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8526, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8527, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8528, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8529, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8530, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8531, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 8532, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8533, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8534, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 8535, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8536, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 8537, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 8538, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8539, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8540, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 8541, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8542, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 8543, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8544, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8545, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8546, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8547, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8548, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8549, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8550, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8551, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8552, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8553, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8554, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8555, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8556, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8557, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8558, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 8559, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8560, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 8561, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8562, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8563, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8564, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 8565, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 8566, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + } + ] + }, + { + "id": 355, + "name": "flower_pot", + "translation_key": "block.minecraft.flower_pot", + "item_id": 1050, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8567, + "states": [ + { + "id": 8567, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 356, + "name": "potted_torchflower", + "translation_key": "block.minecraft.potted_torchflower", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8568, + "states": [ + { + "id": 8568, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 357, + "name": "potted_oak_sapling", + "translation_key": "block.minecraft.potted_oak_sapling", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8569, + "states": [ + { + "id": 8569, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 358, + "name": "potted_spruce_sapling", + "translation_key": "block.minecraft.potted_spruce_sapling", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8570, + "states": [ + { + "id": 8570, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 359, + "name": "potted_birch_sapling", + "translation_key": "block.minecraft.potted_birch_sapling", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8571, + "states": [ + { + "id": 8571, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 360, + "name": "potted_jungle_sapling", + "translation_key": "block.minecraft.potted_jungle_sapling", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8572, + "states": [ + { + "id": 8572, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 361, + "name": "potted_acacia_sapling", + "translation_key": "block.minecraft.potted_acacia_sapling", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8573, + "states": [ + { + "id": 8573, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 362, + "name": "potted_cherry_sapling", + "translation_key": "block.minecraft.potted_cherry_sapling", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8574, + "states": [ + { + "id": 8574, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 363, + "name": "potted_dark_oak_sapling", + "translation_key": "block.minecraft.potted_dark_oak_sapling", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8575, + "states": [ + { + "id": 8575, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 364, + "name": "potted_mangrove_propagule", + "translation_key": "block.minecraft.potted_mangrove_propagule", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8576, + "states": [ + { + "id": 8576, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 365, + "name": "potted_fern", + "translation_key": "block.minecraft.potted_fern", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8577, + "states": [ + { + "id": 8577, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 366, + "name": "potted_dandelion", + "translation_key": "block.minecraft.potted_dandelion", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8578, + "states": [ + { + "id": 8578, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 367, + "name": "potted_poppy", + "translation_key": "block.minecraft.potted_poppy", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8579, + "states": [ + { + "id": 8579, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 368, + "name": "potted_blue_orchid", + "translation_key": "block.minecraft.potted_blue_orchid", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8580, + "states": [ + { + "id": 8580, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 369, + "name": "potted_allium", + "translation_key": "block.minecraft.potted_allium", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8581, + "states": [ + { + "id": 8581, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 370, + "name": "potted_azure_bluet", + "translation_key": "block.minecraft.potted_azure_bluet", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8582, + "states": [ + { + "id": 8582, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 371, + "name": "potted_red_tulip", + "translation_key": "block.minecraft.potted_red_tulip", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8583, + "states": [ + { + "id": 8583, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 372, + "name": "potted_orange_tulip", + "translation_key": "block.minecraft.potted_orange_tulip", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8584, + "states": [ + { + "id": 8584, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 373, + "name": "potted_white_tulip", + "translation_key": "block.minecraft.potted_white_tulip", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8585, + "states": [ + { + "id": 8585, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 374, + "name": "potted_pink_tulip", + "translation_key": "block.minecraft.potted_pink_tulip", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8586, + "states": [ + { + "id": 8586, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 375, + "name": "potted_oxeye_daisy", + "translation_key": "block.minecraft.potted_oxeye_daisy", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8587, + "states": [ + { + "id": 8587, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 376, + "name": "potted_cornflower", + "translation_key": "block.minecraft.potted_cornflower", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8588, + "states": [ + { + "id": 8588, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 377, + "name": "potted_lily_of_the_valley", + "translation_key": "block.minecraft.potted_lily_of_the_valley", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8589, + "states": [ + { + "id": 8589, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 378, + "name": "potted_wither_rose", + "translation_key": "block.minecraft.potted_wither_rose", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8590, + "states": [ + { + "id": 8590, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 379, + "name": "potted_red_mushroom", + "translation_key": "block.minecraft.potted_red_mushroom", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8591, + "states": [ + { + "id": 8591, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 380, + "name": "potted_brown_mushroom", + "translation_key": "block.minecraft.potted_brown_mushroom", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8592, + "states": [ + { + "id": 8592, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 381, + "name": "potted_dead_bush", + "translation_key": "block.minecraft.potted_dead_bush", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8593, + "states": [ + { + "id": 8593, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 382, + "name": "potted_cactus", + "translation_key": "block.minecraft.potted_cactus", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 8594, + "states": [ + { + "id": 8594, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 383, + "name": "carrots", + "translation_key": "block.minecraft.carrots", + "item_id": 1051, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "age", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7" + ] + } + ], + "default_state_id": 8595, + "states": [ + { + "id": 8595, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8596, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8597, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8598, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8599, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8600, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8601, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8602, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 384, + "name": "potatoes", + "translation_key": "block.minecraft.potatoes", + "item_id": 1052, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "age", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7" + ] + } + ], + "default_state_id": 8603, + "states": [ + { + "id": 8603, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8604, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8605, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8606, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8607, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8608, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8609, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8610, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 385, + "name": "oak_button", + "translation_key": "block.minecraft.oak_button", + "item_id": 662, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "face", + "values": [ + "floor", + "wall", + "ceiling" + ] + }, + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 8620, + "states": [ + { + "id": 8611, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8612, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8613, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8614, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8615, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8616, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8617, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8618, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8619, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8620, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8621, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8622, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8623, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8624, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8625, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8626, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8627, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8628, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8629, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8630, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8631, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8632, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8633, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8634, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 386, + "name": "spruce_button", + "translation_key": "block.minecraft.spruce_button", + "item_id": 663, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "face", + "values": [ + "floor", + "wall", + "ceiling" + ] + }, + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 8644, + "states": [ + { + "id": 8635, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8636, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8637, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8638, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8639, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8640, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8641, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8642, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8643, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8644, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8645, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8646, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8647, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8648, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8649, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8650, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8651, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8652, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8653, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8654, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8655, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8656, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8657, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8658, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 387, + "name": "birch_button", + "translation_key": "block.minecraft.birch_button", + "item_id": 664, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "face", + "values": [ + "floor", + "wall", + "ceiling" + ] + }, + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 8668, + "states": [ + { + "id": 8659, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8660, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8661, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8662, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8663, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8664, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8665, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8666, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8667, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8668, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8669, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8670, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8671, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8672, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8673, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8674, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8675, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8676, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8677, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8678, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8679, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8680, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8681, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8682, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 388, + "name": "jungle_button", + "translation_key": "block.minecraft.jungle_button", + "item_id": 665, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "face", + "values": [ + "floor", + "wall", + "ceiling" + ] + }, + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 8692, + "states": [ + { + "id": 8683, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8684, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8685, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8686, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8687, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8688, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8689, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8690, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8691, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8692, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8693, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8694, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8695, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8696, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8697, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8698, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8699, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8700, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8701, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8702, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8703, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8704, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8705, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8706, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 389, + "name": "acacia_button", + "translation_key": "block.minecraft.acacia_button", + "item_id": 666, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "face", + "values": [ + "floor", + "wall", + "ceiling" + ] + }, + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 8716, + "states": [ + { + "id": 8707, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8708, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8709, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8710, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8711, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8712, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8713, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8714, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8715, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8716, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8717, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8718, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8719, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8720, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8721, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8722, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8723, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8724, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8725, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8726, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8727, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8728, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8729, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8730, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 390, + "name": "cherry_button", + "translation_key": "block.minecraft.cherry_button", + "item_id": 667, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "face", + "values": [ + "floor", + "wall", + "ceiling" + ] + }, + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 8740, + "states": [ + { + "id": 8731, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8732, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8733, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8734, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8735, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8736, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8737, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8738, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8739, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8740, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8741, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8742, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8743, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8744, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8745, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8746, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8747, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8748, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8749, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8750, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8751, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8752, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8753, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8754, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 391, + "name": "dark_oak_button", + "translation_key": "block.minecraft.dark_oak_button", + "item_id": 668, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "face", + "values": [ + "floor", + "wall", + "ceiling" + ] + }, + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 8764, + "states": [ + { + "id": 8755, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8756, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8757, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8758, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8759, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8760, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8761, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8762, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8763, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8764, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8765, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8766, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8767, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8768, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8769, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8770, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8771, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8772, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8773, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8774, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8775, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8776, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8777, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8778, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 392, + "name": "mangrove_button", + "translation_key": "block.minecraft.mangrove_button", + "item_id": 669, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "face", + "values": [ + "floor", + "wall", + "ceiling" + ] + }, + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 8788, + "states": [ + { + "id": 8779, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8780, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8781, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8782, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8783, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8784, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8785, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8786, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8787, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8788, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8789, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8790, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8791, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8792, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8793, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8794, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8795, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8796, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8797, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8798, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8799, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8800, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8801, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8802, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 393, + "name": "bamboo_button", + "translation_key": "block.minecraft.bamboo_button", + "item_id": 670, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "face", + "values": [ + "floor", + "wall", + "ceiling" + ] + }, + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 8812, + "states": [ + { + "id": 8803, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8804, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8805, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8806, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8807, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8808, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8809, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8810, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8811, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8812, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8813, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8814, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8815, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8816, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8817, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8818, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8819, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8820, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8821, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8822, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8823, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8824, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8825, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 8826, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 394, + "name": "skeleton_skull", + "translation_key": "block.minecraft.skeleton_skull", + "item_id": 1057, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 395, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 8827, + "states": [ + { + "id": 8827, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8828, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8829, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8830, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8831, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8832, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8833, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8834, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8835, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8836, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8837, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8838, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8839, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8840, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8841, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8842, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + } + ] + }, + { + "id": 395, + "name": "skeleton_wall_skull", + "translation_key": "block.minecraft.skeleton_skull", + "item_id": 1057, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 8843, + "states": [ + { + "id": 8843, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 158 + ], + "block_entity_type": 15 + }, + { + "id": 8844, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 159 + ], + "block_entity_type": 15 + }, + { + "id": 8845, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 160 + ], + "block_entity_type": 15 + }, + { + "id": 8846, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 161 + ], + "block_entity_type": 15 + } + ] + }, + { + "id": 396, + "name": "wither_skeleton_skull", + "translation_key": "block.minecraft.wither_skeleton_skull", + "item_id": 1058, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 397, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 8847, + "states": [ + { + "id": 8847, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8848, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8849, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8850, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8851, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8852, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8853, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8854, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8855, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8856, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8857, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8858, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8859, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8860, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8861, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8862, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + } + ] + }, + { + "id": 397, + "name": "wither_skeleton_wall_skull", + "translation_key": "block.minecraft.wither_skeleton_skull", + "item_id": 1058, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 8863, + "states": [ + { + "id": 8863, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 158 + ], + "block_entity_type": 15 + }, + { + "id": 8864, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 159 + ], + "block_entity_type": 15 + }, + { + "id": 8865, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 160 + ], + "block_entity_type": 15 + }, + { + "id": 8866, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 161 + ], + "block_entity_type": 15 + } + ] + }, + { + "id": 398, + "name": "zombie_head", + "translation_key": "block.minecraft.zombie_head", + "item_id": 1060, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 399, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 8867, + "states": [ + { + "id": 8867, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8868, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8869, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8870, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8871, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8872, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8873, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8874, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8875, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8876, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8877, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8878, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8879, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8880, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8881, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8882, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + } + ] + }, + { + "id": 399, + "name": "zombie_wall_head", + "translation_key": "block.minecraft.zombie_head", + "item_id": 1060, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 8883, + "states": [ + { + "id": 8883, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 158 + ], + "block_entity_type": 15 + }, + { + "id": 8884, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 159 + ], + "block_entity_type": 15 + }, + { + "id": 8885, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 160 + ], + "block_entity_type": 15 + }, + { + "id": 8886, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 161 + ], + "block_entity_type": 15 + } + ] + }, + { + "id": 400, + "name": "player_head", + "translation_key": "block.minecraft.player_head", + "item_id": 1059, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 401, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 8887, + "states": [ + { + "id": 8887, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8888, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8889, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8890, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8891, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8892, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8893, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8894, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8895, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8896, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8897, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8898, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8899, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8900, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8901, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8902, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + } + ] + }, + { + "id": 401, + "name": "player_wall_head", + "translation_key": "block.minecraft.player_head", + "item_id": 1059, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 8903, + "states": [ + { + "id": 8903, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 158 + ], + "block_entity_type": 15 + }, + { + "id": 8904, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 159 + ], + "block_entity_type": 15 + }, + { + "id": 8905, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 160 + ], + "block_entity_type": 15 + }, + { + "id": 8906, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 161 + ], + "block_entity_type": 15 + } + ] + }, + { + "id": 402, + "name": "creeper_head", + "translation_key": "block.minecraft.creeper_head", + "item_id": 1061, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 403, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 8907, + "states": [ + { + "id": 8907, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8908, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8909, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8910, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8911, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8912, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8913, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8914, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8915, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8916, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8917, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8918, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8919, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8920, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8921, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8922, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + } + ] + }, + { + "id": 403, + "name": "creeper_wall_head", + "translation_key": "block.minecraft.creeper_head", + "item_id": 1061, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 8923, + "states": [ + { + "id": 8923, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 158 + ], + "block_entity_type": 15 + }, + { + "id": 8924, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 159 + ], + "block_entity_type": 15 + }, + { + "id": 8925, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 160 + ], + "block_entity_type": 15 + }, + { + "id": 8926, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 161 + ], + "block_entity_type": 15 + } + ] + }, + { + "id": 404, + "name": "dragon_head", + "translation_key": "block.minecraft.dragon_head", + "item_id": 1062, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 405, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 8927, + "states": [ + { + "id": 8927, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8928, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8929, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8930, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8931, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8932, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8933, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8934, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8935, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8936, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8937, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8938, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8939, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8940, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8941, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + }, + { + "id": 8942, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 157 + ], + "block_entity_type": 15 + } + ] + }, + { + "id": 405, + "name": "dragon_wall_head", + "translation_key": "block.minecraft.dragon_head", + "item_id": 1062, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 8943, + "states": [ + { + "id": 8943, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 158 + ], + "block_entity_type": 15 + }, + { + "id": 8944, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 159 + ], + "block_entity_type": 15 + }, + { + "id": 8945, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 160 + ], + "block_entity_type": 15 + }, + { + "id": 8946, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 161 + ], + "block_entity_type": 15 + } + ] + }, + { + "id": 406, + "name": "piglin_head", + "translation_key": "block.minecraft.piglin_head", + "item_id": 1063, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 407, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 8947, + "states": [ + { + "id": 8947, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 162 + ], + "block_entity_type": 15 + }, + { + "id": 8948, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 162 + ], + "block_entity_type": 15 + }, + { + "id": 8949, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 162 + ], + "block_entity_type": 15 + }, + { + "id": 8950, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 162 + ], + "block_entity_type": 15 + }, + { + "id": 8951, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 162 + ], + "block_entity_type": 15 + }, + { + "id": 8952, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 162 + ], + "block_entity_type": 15 + }, + { + "id": 8953, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 162 + ], + "block_entity_type": 15 + }, + { + "id": 8954, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 162 + ], + "block_entity_type": 15 + }, + { + "id": 8955, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 162 + ], + "block_entity_type": 15 + }, + { + "id": 8956, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 162 + ], + "block_entity_type": 15 + }, + { + "id": 8957, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 162 + ], + "block_entity_type": 15 + }, + { + "id": 8958, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 162 + ], + "block_entity_type": 15 + }, + { + "id": 8959, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 162 + ], + "block_entity_type": 15 + }, + { + "id": 8960, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 162 + ], + "block_entity_type": 15 + }, + { + "id": 8961, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 162 + ], + "block_entity_type": 15 + }, + { + "id": 8962, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 162 + ], + "block_entity_type": 15 + } + ] + }, + { + "id": 407, + "name": "piglin_wall_head", + "translation_key": "block.minecraft.piglin_head", + "item_id": 1063, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 8963, + "states": [ + { + "id": 8963, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 163 + ], + "block_entity_type": 15 + }, + { + "id": 8964, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 164 + ], + "block_entity_type": 15 + }, + { + "id": 8965, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 165 + ], + "block_entity_type": 15 + }, + { + "id": 8966, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 166 + ], + "block_entity_type": 15 + } + ] + }, + { + "id": 408, + "name": "anvil", + "translation_key": "block.minecraft.anvil", + "item_id": 397, + "hardness": 5.0, + "blast_resistance": 1200.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 8967, + "states": [ + { + "id": 8967, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 167, + 168, + 169, + 170, + 171, + 172, + 173 + ] + }, + { + "id": 8968, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 167, + 168, + 169, + 170, + 171, + 172, + 173 + ] + }, + { + "id": 8969, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 167, + 174, + 175, + 176, + 177, + 178, + 179 + ] + }, + { + "id": 8970, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 167, + 174, + 175, + 176, + 177, + 178, + 179 + ] + } + ] + }, + { + "id": 409, + "name": "chipped_anvil", + "translation_key": "block.minecraft.chipped_anvil", + "item_id": 398, + "hardness": 5.0, + "blast_resistance": 1200.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 8971, + "states": [ + { + "id": 8971, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 167, + 168, + 169, + 170, + 171, + 172, + 173 + ] + }, + { + "id": 8972, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 167, + 168, + 169, + 170, + 171, + 172, + 173 + ] + }, + { + "id": 8973, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 167, + 174, + 175, + 176, + 177, + 178, + 179 + ] + }, + { + "id": 8974, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 167, + 174, + 175, + 176, + 177, + 178, + 179 + ] + } + ] + }, + { + "id": 410, + "name": "damaged_anvil", + "translation_key": "block.minecraft.damaged_anvil", + "item_id": 399, + "hardness": 5.0, + "blast_resistance": 1200.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 8975, + "states": [ + { + "id": 8975, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 167, + 168, + 169, + 170, + 171, + 172, + 173 + ] + }, + { + "id": 8976, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 167, + 168, + 169, + 170, + 171, + 172, + 173 + ] + }, + { + "id": 8977, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 167, + 174, + 175, + 176, + 177, + 178, + 179 + ] + }, + { + "id": 8978, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 167, + 174, + 175, + 176, + 177, + 178, + 179 + ] + } + ] + }, + { + "id": 411, + "name": "trapped_chest", + "translation_key": "block.minecraft.trapped_chest", + "item_id": 656, + "hardness": 2.5, + "blast_resistance": 2.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "type", + "values": [ + "single", + "left", + "right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 8980, + "states": [ + { + "id": 8979, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 58 + ], + "block_entity_type": 2 + }, + { + "id": 8980, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 58 + ], + "block_entity_type": 2 + }, + { + "id": 8981, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 59 + ], + "block_entity_type": 2 + }, + { + "id": 8982, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 59 + ], + "block_entity_type": 2 + }, + { + "id": 8983, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 60 + ], + "block_entity_type": 2 + }, + { + "id": 8984, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 60 + ], + "block_entity_type": 2 + }, + { + "id": 8985, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 58 + ], + "block_entity_type": 2 + }, + { + "id": 8986, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 58 + ], + "block_entity_type": 2 + }, + { + "id": 8987, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 60 + ], + "block_entity_type": 2 + }, + { + "id": 8988, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 60 + ], + "block_entity_type": 2 + }, + { + "id": 8989, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 59 + ], + "block_entity_type": 2 + }, + { + "id": 8990, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 59 + ], + "block_entity_type": 2 + }, + { + "id": 8991, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 58 + ], + "block_entity_type": 2 + }, + { + "id": 8992, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 58 + ], + "block_entity_type": 2 + }, + { + "id": 8993, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 61 + ], + "block_entity_type": 2 + }, + { + "id": 8994, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 61 + ], + "block_entity_type": 2 + }, + { + "id": 8995, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 62 + ], + "block_entity_type": 2 + }, + { + "id": 8996, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 62 + ], + "block_entity_type": 2 + }, + { + "id": 8997, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 58 + ], + "block_entity_type": 2 + }, + { + "id": 8998, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 58 + ], + "block_entity_type": 2 + }, + { + "id": 8999, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 62 + ], + "block_entity_type": 2 + }, + { + "id": 9000, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 62 + ], + "block_entity_type": 2 + }, + { + "id": 9001, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 61 + ], + "block_entity_type": 2 + }, + { + "id": 9002, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 61 + ], + "block_entity_type": 2 + } + ] + }, + { + "id": 412, + "name": "light_weighted_pressure_plate", + "translation_key": "block.minecraft.light_weighted_pressure_plate", + "item_id": 675, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "power", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 9003, + "states": [ + { + "id": 9003, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9004, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9005, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9006, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9007, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9008, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9009, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9010, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9011, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9012, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9013, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9014, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9015, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9016, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9017, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9018, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 413, + "name": "heavy_weighted_pressure_plate", + "translation_key": "block.minecraft.heavy_weighted_pressure_plate", + "item_id": 676, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "power", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 9019, + "states": [ + { + "id": 9019, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9020, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9021, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9022, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9023, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9024, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9025, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9026, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9027, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9028, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9029, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9030, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9031, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9032, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9033, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 9034, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 414, + "name": "comparator", + "translation_key": "block.minecraft.comparator", + "item_id": 639, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "mode", + "values": [ + "compare", + "subtract" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9036, + "states": [ + { + "id": 9035, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ], + "block_entity_type": 18 + }, + { + "id": 9036, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ], + "block_entity_type": 18 + }, + { + "id": 9037, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ], + "block_entity_type": 18 + }, + { + "id": 9038, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ], + "block_entity_type": 18 + }, + { + "id": 9039, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ], + "block_entity_type": 18 + }, + { + "id": 9040, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ], + "block_entity_type": 18 + }, + { + "id": 9041, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ], + "block_entity_type": 18 + }, + { + "id": 9042, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ], + "block_entity_type": 18 + }, + { + "id": 9043, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ], + "block_entity_type": 18 + }, + { + "id": 9044, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ], + "block_entity_type": 18 + }, + { + "id": 9045, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ], + "block_entity_type": 18 + }, + { + "id": 9046, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ], + "block_entity_type": 18 + }, + { + "id": 9047, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ], + "block_entity_type": 18 + }, + { + "id": 9048, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ], + "block_entity_type": 18 + }, + { + "id": 9049, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ], + "block_entity_type": 18 + }, + { + "id": 9050, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 70 + ], + "block_entity_type": 18 + } + ] + }, + { + "id": 415, + "name": "daylight_detector", + "translation_key": "block.minecraft.daylight_detector", + "item_id": 652, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "inverted", + "values": [ + "true", + "false" + ] + }, + { + "name": "power", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 9067, + "states": [ + { + "id": 9051, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9052, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9053, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9054, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9055, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9056, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9057, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9058, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9059, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9060, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9061, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9062, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9063, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9064, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9065, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9066, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9067, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9068, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9069, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9070, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9071, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9072, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9073, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9074, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9075, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9076, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9077, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9078, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9079, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9080, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9081, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + }, + { + "id": 9082, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 71 + ], + "block_entity_type": 16 + } + ] + }, + { + "id": 416, + "name": "redstone_block", + "translation_key": "block.minecraft.redstone_block", + "item_id": 637, + "hardness": 5.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 9083, + "states": [ + { + "id": 9083, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 417, + "name": "nether_quartz_ore", + "translation_key": "block.minecraft.nether_quartz_ore", + "item_id": 66, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 9084, + "states": [ + { + "id": 9084, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 418, + "name": "hopper", + "translation_key": "block.minecraft.hopper", + "item_id": 645, + "hardness": 3.0, + "blast_resistance": 4.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "enabled", + "values": [ + "true", + "false" + ] + }, + { + "name": "facing", + "values": [ + "down", + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 9085, + "states": [ + { + "id": 9085, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192 + ], + "block_entity_type": 17 + }, + { + "id": 9086, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 193, + 194, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192 + ], + "block_entity_type": 17 + }, + { + "id": 9087, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 193, + 195, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192 + ], + "block_entity_type": 17 + }, + { + "id": 9088, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 196, + 197, + 198, + 199, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192 + ], + "block_entity_type": 17 + }, + { + "id": 9089, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 193, + 200, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192 + ], + "block_entity_type": 17 + }, + { + "id": 9090, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192 + ], + "block_entity_type": 17 + }, + { + "id": 9091, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 193, + 194, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192 + ], + "block_entity_type": 17 + }, + { + "id": 9092, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 193, + 195, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192 + ], + "block_entity_type": 17 + }, + { + "id": 9093, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 196, + 197, + 198, + 199, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192 + ], + "block_entity_type": 17 + }, + { + "id": 9094, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 193, + 200, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192 + ], + "block_entity_type": 17 + } + ] + }, + { + "id": 419, + "name": "quartz_block", + "translation_key": "block.minecraft.quartz_block", + "item_id": 401, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 9095, + "states": [ + { + "id": 9095, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 420, + "name": "chiseled_quartz_block", + "translation_key": "block.minecraft.chiseled_quartz_block", + "item_id": 400, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 9096, + "states": [ + { + "id": 9096, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 421, + "name": "quartz_pillar", + "translation_key": "block.minecraft.quartz_pillar", + "item_id": 403, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 9098, + "states": [ + { + "id": 9097, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 9098, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 9099, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 422, + "name": "quartz_stairs", + "translation_key": "block.minecraft.quartz_stairs", + "item_id": 404, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9111, + "states": [ + { + "id": 9100, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 9101, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 9102, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 9103, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 9104, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 9105, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 9106, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 9107, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 9108, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 9109, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 9110, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 9111, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 9112, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 9113, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 9114, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 9115, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 9116, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 9117, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 9118, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 9119, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 9120, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 9121, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 9122, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 9123, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 9124, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 9125, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 9126, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 9127, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 9128, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 9129, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 9130, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 9131, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 9132, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 9133, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 9134, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 9135, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 9136, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 9137, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 9138, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 9139, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 9140, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 9141, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 9142, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 9143, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 9144, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 9145, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 9146, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 9147, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 9148, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 9149, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 9150, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 9151, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 9152, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 9153, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 9154, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 9155, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 9156, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 9157, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 9158, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 9159, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 9160, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 9161, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 9162, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 9163, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 9164, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 9165, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 9166, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 9167, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 9168, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 9169, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 9170, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 9171, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 9172, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 9173, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 9174, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 9175, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 9176, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 9177, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 9178, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 9179, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 423, + "name": "activator_rail", + "translation_key": "block.minecraft.activator_rail", + "item_id": 726, + "hardness": 0.7, + "blast_resistance": 0.7, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "powered", + "values": [ + "true", + "false" + ] + }, + { + "name": "shape", + "values": [ + "north_south", + "east_west", + "ascending_east", + "ascending_west", + "ascending_north", + "ascending_south" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9193, + "states": [ + { + "id": 9180, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 9181, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 9182, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 9183, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 9184, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 9185, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 9186, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 9187, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 9188, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 9189, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 9190, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 9191, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 9192, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 9193, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 9194, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 9195, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 9196, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 9197, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 9198, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 9199, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 9200, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 9201, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 9202, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 9203, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 424, + "name": "dropper", + "translation_key": "block.minecraft.dropper", + "item_id": 647, + "hardness": 3.5, + "blast_resistance": 3.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + }, + { + "name": "triggered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9205, + "states": [ + { + "id": 9204, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 6 + }, + { + "id": 9205, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 6 + }, + { + "id": 9206, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 6 + }, + { + "id": 9207, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 6 + }, + { + "id": 9208, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 6 + }, + { + "id": 9209, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 6 + }, + { + "id": 9210, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 6 + }, + { + "id": 9211, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 6 + }, + { + "id": 9212, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 6 + }, + { + "id": 9213, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 6 + }, + { + "id": 9214, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 6 + }, + { + "id": 9215, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 6 + } + ] + }, + { + "id": 425, + "name": "white_terracotta", + "translation_key": "block.minecraft.white_terracotta", + "item_id": 405, + "hardness": 1.25, + "blast_resistance": 4.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 9216, + "states": [ + { + "id": 9216, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 426, + "name": "orange_terracotta", + "translation_key": "block.minecraft.orange_terracotta", + "item_id": 406, + "hardness": 1.25, + "blast_resistance": 4.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 9217, + "states": [ + { + "id": 9217, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 427, + "name": "magenta_terracotta", + "translation_key": "block.minecraft.magenta_terracotta", + "item_id": 407, + "hardness": 1.25, + "blast_resistance": 4.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 9218, + "states": [ + { + "id": 9218, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 428, + "name": "light_blue_terracotta", + "translation_key": "block.minecraft.light_blue_terracotta", + "item_id": 408, + "hardness": 1.25, + "blast_resistance": 4.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 9219, + "states": [ + { + "id": 9219, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 429, + "name": "yellow_terracotta", + "translation_key": "block.minecraft.yellow_terracotta", + "item_id": 409, + "hardness": 1.25, + "blast_resistance": 4.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 9220, + "states": [ + { + "id": 9220, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 430, + "name": "lime_terracotta", + "translation_key": "block.minecraft.lime_terracotta", + "item_id": 410, + "hardness": 1.25, + "blast_resistance": 4.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 9221, + "states": [ + { + "id": 9221, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 431, + "name": "pink_terracotta", + "translation_key": "block.minecraft.pink_terracotta", + "item_id": 411, + "hardness": 1.25, + "blast_resistance": 4.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 9222, + "states": [ + { + "id": 9222, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 432, + "name": "gray_terracotta", + "translation_key": "block.minecraft.gray_terracotta", + "item_id": 412, + "hardness": 1.25, + "blast_resistance": 4.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 9223, + "states": [ + { + "id": 9223, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 433, + "name": "light_gray_terracotta", + "translation_key": "block.minecraft.light_gray_terracotta", + "item_id": 413, + "hardness": 1.25, + "blast_resistance": 4.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 9224, + "states": [ + { + "id": 9224, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 434, + "name": "cyan_terracotta", + "translation_key": "block.minecraft.cyan_terracotta", + "item_id": 414, + "hardness": 1.25, + "blast_resistance": 4.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 9225, + "states": [ + { + "id": 9225, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 435, + "name": "purple_terracotta", + "translation_key": "block.minecraft.purple_terracotta", + "item_id": 415, + "hardness": 1.25, + "blast_resistance": 4.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 9226, + "states": [ + { + "id": 9226, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 436, + "name": "blue_terracotta", + "translation_key": "block.minecraft.blue_terracotta", + "item_id": 416, + "hardness": 1.25, + "blast_resistance": 4.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 9227, + "states": [ + { + "id": 9227, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 437, + "name": "brown_terracotta", + "translation_key": "block.minecraft.brown_terracotta", + "item_id": 417, + "hardness": 1.25, + "blast_resistance": 4.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 9228, + "states": [ + { + "id": 9228, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 438, + "name": "green_terracotta", + "translation_key": "block.minecraft.green_terracotta", + "item_id": 418, + "hardness": 1.25, + "blast_resistance": 4.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 9229, + "states": [ + { + "id": 9229, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 439, + "name": "red_terracotta", + "translation_key": "block.minecraft.red_terracotta", + "item_id": 419, + "hardness": 1.25, + "blast_resistance": 4.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 9230, + "states": [ + { + "id": 9230, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 440, + "name": "black_terracotta", + "translation_key": "block.minecraft.black_terracotta", + "item_id": 420, + "hardness": 1.25, + "blast_resistance": 4.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 9231, + "states": [ + { + "id": 9231, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 441, + "name": "white_stained_glass_pane", + "translation_key": "block.minecraft.white_stained_glass_pane", + "item_id": 465, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9263, + "states": [ + { + "id": 9232, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9233, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9234, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9235, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9236, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9237, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9238, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9239, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9240, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9241, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9242, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9243, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9244, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9245, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9246, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9247, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9248, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9249, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9250, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9251, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9252, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9253, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9254, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9255, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9256, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9257, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9258, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9259, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9260, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9261, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + }, + { + "id": 9262, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9263, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + } + ] + }, + { + "id": 442, + "name": "orange_stained_glass_pane", + "translation_key": "block.minecraft.orange_stained_glass_pane", + "item_id": 466, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9295, + "states": [ + { + "id": 9264, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9265, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9266, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9267, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9268, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9269, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9270, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9271, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9272, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9273, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9274, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9275, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9276, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9277, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9278, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9279, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9280, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9281, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9282, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9283, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9284, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9285, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9286, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9287, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9288, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9289, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9290, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9291, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9292, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9293, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + }, + { + "id": 9294, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9295, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + } + ] + }, + { + "id": 443, + "name": "magenta_stained_glass_pane", + "translation_key": "block.minecraft.magenta_stained_glass_pane", + "item_id": 467, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9327, + "states": [ + { + "id": 9296, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9297, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9298, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9299, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9300, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9301, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9302, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9303, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9304, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9305, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9306, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9307, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9308, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9309, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9310, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9311, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9312, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9313, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9314, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9315, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9316, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9317, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9318, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9319, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9320, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9321, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9322, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9323, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9324, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9325, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + }, + { + "id": 9326, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9327, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + } + ] + }, + { + "id": 444, + "name": "light_blue_stained_glass_pane", + "translation_key": "block.minecraft.light_blue_stained_glass_pane", + "item_id": 468, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9359, + "states": [ + { + "id": 9328, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9329, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9330, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9331, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9332, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9333, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9334, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9335, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9336, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9337, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9338, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9339, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9340, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9341, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9342, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9343, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9344, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9345, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9346, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9347, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9348, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9349, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9350, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9351, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9352, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9353, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9354, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9355, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9356, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9357, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + }, + { + "id": 9358, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9359, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + } + ] + }, + { + "id": 445, + "name": "yellow_stained_glass_pane", + "translation_key": "block.minecraft.yellow_stained_glass_pane", + "item_id": 469, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9391, + "states": [ + { + "id": 9360, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9361, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9362, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9363, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9364, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9365, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9366, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9367, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9368, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9369, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9370, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9371, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9372, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9373, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9374, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9375, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9376, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9377, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9378, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9379, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9380, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9381, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9382, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9383, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9384, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9385, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9386, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9387, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9388, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9389, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + }, + { + "id": 9390, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9391, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + } + ] + }, + { + "id": 446, + "name": "lime_stained_glass_pane", + "translation_key": "block.minecraft.lime_stained_glass_pane", + "item_id": 470, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9423, + "states": [ + { + "id": 9392, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9393, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9394, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9395, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9396, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9397, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9398, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9399, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9400, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9401, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9402, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9403, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9404, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9405, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9406, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9407, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9408, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9409, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9410, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9411, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9412, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9413, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9414, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9415, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9416, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9417, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9418, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9419, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9420, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9421, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + }, + { + "id": 9422, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9423, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + } + ] + }, + { + "id": 447, + "name": "pink_stained_glass_pane", + "translation_key": "block.minecraft.pink_stained_glass_pane", + "item_id": 471, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9455, + "states": [ + { + "id": 9424, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9425, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9426, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9427, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9428, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9429, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9430, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9431, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9432, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9433, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9434, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9435, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9436, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9437, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9438, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9439, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9440, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9441, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9442, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9443, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9444, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9445, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9446, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9447, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9448, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9449, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9450, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9451, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9452, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9453, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + }, + { + "id": 9454, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9455, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + } + ] + }, + { + "id": 448, + "name": "gray_stained_glass_pane", + "translation_key": "block.minecraft.gray_stained_glass_pane", + "item_id": 472, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9487, + "states": [ + { + "id": 9456, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9457, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9458, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9459, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9460, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9461, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9462, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9463, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9464, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9465, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9466, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9467, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9468, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9469, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9470, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9471, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9472, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9473, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9474, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9475, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9476, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9477, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9478, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9479, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9480, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9481, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9482, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9483, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9484, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9485, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + }, + { + "id": 9486, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9487, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + } + ] + }, + { + "id": 449, + "name": "light_gray_stained_glass_pane", + "translation_key": "block.minecraft.light_gray_stained_glass_pane", + "item_id": 473, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9519, + "states": [ + { + "id": 9488, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9489, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9490, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9491, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9492, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9493, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9494, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9495, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9496, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9497, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9498, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9499, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9500, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9501, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9502, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9503, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9504, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9505, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9506, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9507, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9508, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9509, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9510, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9511, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9512, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9513, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9514, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9515, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9516, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9517, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + }, + { + "id": 9518, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9519, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + } + ] + }, + { + "id": 450, + "name": "cyan_stained_glass_pane", + "translation_key": "block.minecraft.cyan_stained_glass_pane", + "item_id": 474, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9551, + "states": [ + { + "id": 9520, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9521, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9522, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9523, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9524, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9525, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9526, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9527, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9528, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9529, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9530, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9531, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9532, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9533, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9534, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9535, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9536, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9537, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9538, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9539, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9540, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9541, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9542, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9543, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9544, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9545, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9546, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9547, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9548, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9549, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + }, + { + "id": 9550, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9551, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + } + ] + }, + { + "id": 451, + "name": "purple_stained_glass_pane", + "translation_key": "block.minecraft.purple_stained_glass_pane", + "item_id": 475, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9583, + "states": [ + { + "id": 9552, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9553, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9554, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9555, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9556, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9557, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9558, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9559, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9560, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9561, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9562, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9563, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9564, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9565, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9566, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9567, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9568, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9569, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9570, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9571, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9572, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9573, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9574, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9575, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9576, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9577, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9578, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9579, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9580, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9581, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + }, + { + "id": 9582, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9583, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + } + ] + }, + { + "id": 452, + "name": "blue_stained_glass_pane", + "translation_key": "block.minecraft.blue_stained_glass_pane", + "item_id": 476, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9615, + "states": [ + { + "id": 9584, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9585, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9586, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9587, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9588, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9589, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9590, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9591, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9592, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9593, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9594, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9595, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9596, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9597, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9598, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9599, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9600, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9601, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9602, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9603, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9604, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9605, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9606, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9607, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9608, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9609, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9610, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9611, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9612, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9613, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + }, + { + "id": 9614, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9615, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + } + ] + }, + { + "id": 453, + "name": "brown_stained_glass_pane", + "translation_key": "block.minecraft.brown_stained_glass_pane", + "item_id": 477, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9647, + "states": [ + { + "id": 9616, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9617, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9618, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9619, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9620, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9621, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9622, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9623, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9624, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9625, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9626, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9627, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9628, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9629, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9630, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9631, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9632, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9633, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9634, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9635, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9636, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9637, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9638, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9639, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9640, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9641, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9642, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9643, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9644, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9645, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + }, + { + "id": 9646, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9647, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + } + ] + }, + { + "id": 454, + "name": "green_stained_glass_pane", + "translation_key": "block.minecraft.green_stained_glass_pane", + "item_id": 478, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9679, + "states": [ + { + "id": 9648, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9649, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9650, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9651, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9652, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9653, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9654, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9655, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9656, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9657, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9658, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9659, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9660, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9661, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9662, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9663, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9664, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9665, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9666, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9667, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9668, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9669, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9670, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9671, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9672, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9673, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9674, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9675, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9676, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9677, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + }, + { + "id": 9678, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9679, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + } + ] + }, + { + "id": 455, + "name": "red_stained_glass_pane", + "translation_key": "block.minecraft.red_stained_glass_pane", + "item_id": 479, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9711, + "states": [ + { + "id": 9680, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9681, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9682, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9683, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9684, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9685, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9686, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9687, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9688, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9689, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9690, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9691, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9692, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9693, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9694, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9695, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9696, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9697, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9698, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9699, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9700, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9701, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9702, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9703, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9704, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9705, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9706, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9707, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9708, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9709, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + }, + { + "id": 9710, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9711, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + } + ] + }, + { + "id": 456, + "name": "black_stained_glass_pane", + "translation_key": "block.minecraft.black_stained_glass_pane", + "item_id": 480, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9743, + "states": [ + { + "id": 9712, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9713, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9714, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95, + 96 + ] + }, + { + "id": 9715, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97, + 98 + ] + }, + { + "id": 9716, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9717, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9718, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 95 + ] + }, + { + "id": 9719, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99, + 98 + ] + }, + { + "id": 9720, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9721, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9722, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94, + 96 + ] + }, + { + "id": 9723, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100, + 98 + ] + }, + { + "id": 9724, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9725, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9726, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 94 + ] + }, + { + "id": 9727, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 101 + ] + }, + { + "id": 9728, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9729, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9730, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95, + 96 + ] + }, + { + "id": 9731, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 97 + ] + }, + { + "id": 9732, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9733, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9734, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 95 + ] + }, + { + "id": 9735, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 99 + ] + }, + { + "id": 9736, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9737, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9738, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102, + 96 + ] + }, + { + "id": 9739, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 100 + ] + }, + { + "id": 9740, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9741, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + }, + { + "id": 9742, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 102 + ] + }, + { + "id": 9743, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 103 + ] + } + ] + }, + { + "id": 457, + "name": "acacia_stairs", + "translation_key": "block.minecraft.acacia_stairs", + "item_id": 365, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9755, + "states": [ + { + "id": 9744, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 9745, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 9746, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 9747, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 9748, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 9749, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 9750, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 9751, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 9752, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 9753, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 9754, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 9755, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 9756, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 9757, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 9758, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 9759, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 9760, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 9761, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 9762, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 9763, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 9764, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 9765, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 9766, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 9767, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 9768, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 9769, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 9770, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 9771, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 9772, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 9773, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 9774, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 9775, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 9776, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 9777, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 9778, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 9779, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 9780, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 9781, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 9782, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 9783, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 9784, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 9785, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 9786, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 9787, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 9788, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 9789, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 9790, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 9791, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 9792, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 9793, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 9794, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 9795, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 9796, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 9797, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 9798, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 9799, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 9800, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 9801, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 9802, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 9803, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 9804, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 9805, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 9806, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 9807, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 9808, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 9809, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 9810, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 9811, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 9812, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 9813, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 9814, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 9815, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 9816, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 9817, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 9818, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 9819, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 9820, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 9821, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 9822, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 9823, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 458, + "name": "cherry_stairs", + "translation_key": "block.minecraft.cherry_stairs", + "item_id": 366, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9835, + "states": [ + { + "id": 9824, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 9825, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 9826, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 9827, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 9828, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 9829, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 9830, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 9831, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 9832, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 9833, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 9834, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 9835, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 9836, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 9837, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 9838, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 9839, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 9840, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 9841, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 9842, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 9843, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 9844, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 9845, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 9846, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 9847, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 9848, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 9849, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 9850, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 9851, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 9852, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 9853, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 9854, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 9855, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 9856, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 9857, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 9858, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 9859, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 9860, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 9861, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 9862, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 9863, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 9864, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 9865, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 9866, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 9867, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 9868, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 9869, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 9870, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 9871, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 9872, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 9873, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 9874, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 9875, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 9876, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 9877, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 9878, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 9879, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 9880, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 9881, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 9882, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 9883, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 9884, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 9885, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 9886, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 9887, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 9888, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 9889, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 9890, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 9891, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 9892, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 9893, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 9894, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 9895, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 9896, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 9897, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 9898, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 9899, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 9900, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 9901, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 9902, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 9903, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 459, + "name": "dark_oak_stairs", + "translation_key": "block.minecraft.dark_oak_stairs", + "item_id": 367, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9915, + "states": [ + { + "id": 9904, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 9905, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 9906, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 9907, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 9908, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 9909, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 9910, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 9911, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 9912, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 9913, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 9914, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 9915, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 9916, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 9917, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 9918, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 9919, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 9920, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 9921, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 9922, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 9923, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 9924, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 9925, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 9926, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 9927, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 9928, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 9929, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 9930, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 9931, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 9932, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 9933, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 9934, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 9935, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 9936, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 9937, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 9938, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 9939, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 9940, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 9941, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 9942, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 9943, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 9944, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 9945, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 9946, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 9947, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 9948, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 9949, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 9950, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 9951, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 9952, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 9953, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 9954, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 9955, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 9956, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 9957, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 9958, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 9959, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 9960, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 9961, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 9962, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 9963, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 9964, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 9965, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 9966, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 9967, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 9968, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 9969, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 9970, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 9971, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 9972, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 9973, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 9974, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 9975, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 9976, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 9977, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 9978, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 9979, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 9980, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 9981, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 9982, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 9983, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 460, + "name": "mangrove_stairs", + "translation_key": "block.minecraft.mangrove_stairs", + "item_id": 368, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 9995, + "states": [ + { + "id": 9984, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 9985, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 9986, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 9987, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 9988, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 9989, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 9990, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 9991, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 9992, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 9993, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 9994, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 9995, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 9996, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 9997, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 9998, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 9999, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10000, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10001, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10002, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10003, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10004, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 10005, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 10006, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10007, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10008, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10009, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10010, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10011, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10012, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10013, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10014, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 10015, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 10016, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10017, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10018, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10019, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10020, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 10021, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 10022, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10023, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10024, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 10025, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 10026, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10027, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10028, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10029, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10030, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10031, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10032, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10033, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10034, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 10035, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 10036, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10037, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10038, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10039, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10040, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10041, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10042, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10043, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10044, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 10045, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 10046, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 10047, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 10048, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10049, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10050, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 10051, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 10052, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10053, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10054, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 10055, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 10056, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10057, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10058, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10059, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10060, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10061, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10062, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 10063, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 461, + "name": "bamboo_stairs", + "translation_key": "block.minecraft.bamboo_stairs", + "item_id": 369, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 10075, + "states": [ + { + "id": 10064, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 10065, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 10066, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10067, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10068, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 10069, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 10070, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10071, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10072, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 10073, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 10074, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 10075, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 10076, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10077, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10078, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10079, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10080, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10081, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10082, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10083, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10084, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 10085, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 10086, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10087, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10088, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10089, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10090, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10091, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10092, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10093, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10094, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 10095, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 10096, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10097, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10098, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10099, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10100, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 10101, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 10102, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10103, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10104, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 10105, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 10106, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10107, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10108, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10109, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10110, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10111, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10112, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10113, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10114, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 10115, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 10116, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10117, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10118, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10119, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10120, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10121, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10122, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10123, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10124, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 10125, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 10126, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 10127, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 10128, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10129, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10130, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 10131, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 10132, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10133, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10134, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 10135, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 10136, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10137, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10138, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10139, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10140, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10141, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10142, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 10143, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 462, + "name": "bamboo_mosaic_stairs", + "translation_key": "block.minecraft.bamboo_mosaic_stairs", + "item_id": 370, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 10155, + "states": [ + { + "id": 10144, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 10145, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 10146, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10147, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10148, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 10149, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 10150, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10151, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10152, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 10153, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 10154, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 10155, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 10156, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10157, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10158, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10159, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10160, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10161, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10162, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10163, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10164, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 10165, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 10166, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10167, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10168, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10169, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10170, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10171, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10172, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10173, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10174, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 10175, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 10176, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10177, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10178, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10179, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10180, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 10181, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 10182, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10183, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10184, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 10185, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 10186, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10187, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10188, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10189, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10190, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10191, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10192, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10193, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10194, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 10195, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 10196, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10197, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10198, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10199, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10200, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10201, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10202, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10203, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10204, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 10205, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 10206, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 10207, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 10208, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10209, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10210, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 10211, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 10212, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10213, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10214, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 10215, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 10216, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10217, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10218, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10219, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10220, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10221, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10222, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 10223, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 463, + "name": "slime_block", + "translation_key": "block.minecraft.slime_block", + "item_id": 642, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.8, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10224, + "states": [ + { + "id": 10224, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 464, + "name": "barrier", + "translation_key": "block.minecraft.barrier", + "item_id": 421, + "hardness": -1.0, + "blast_resistance": 3600000.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10225, + "states": [ + { + "id": 10225, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 465, + "name": "light", + "translation_key": "block.minecraft.light", + "item_id": 422, + "hardness": -1.0, + "blast_resistance": 3600000.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "level", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 10257, + "states": [ + { + "id": 10226, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10227, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10228, + "luminance": 1, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10229, + "luminance": 1, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10230, + "luminance": 2, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10231, + "luminance": 2, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10232, + "luminance": 3, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10233, + "luminance": 3, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10234, + "luminance": 4, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10235, + "luminance": 4, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10236, + "luminance": 5, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10237, + "luminance": 5, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10238, + "luminance": 6, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10239, + "luminance": 6, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10240, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10241, + "luminance": 7, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10242, + "luminance": 8, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10243, + "luminance": 8, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10244, + "luminance": 9, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10245, + "luminance": 9, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10246, + "luminance": 10, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10247, + "luminance": 10, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10248, + "luminance": 11, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10249, + "luminance": 11, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10250, + "luminance": 12, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10251, + "luminance": 12, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10252, + "luminance": 13, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10253, + "luminance": 13, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10254, + "luminance": 14, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10255, + "luminance": 14, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10256, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10257, + "luminance": 15, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 466, + "name": "iron_trapdoor", + "translation_key": "block.minecraft.iron_trapdoor", + "item_id": 700, + "hardness": 5.0, + "blast_resistance": 5.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 10273, + "states": [ + { + "id": 10258, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 10259, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 10260, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 10261, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 10262, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 10263, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 10264, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 10265, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 10266, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 10267, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 10268, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 10269, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 10270, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 10271, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 10272, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 10273, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 10274, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 10275, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 10276, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 10277, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 10278, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 10279, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 10280, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 10281, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 10282, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 10283, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 10284, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 10285, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 10286, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 10287, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 10288, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 10289, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 10290, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 10291, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 10292, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 10293, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 10294, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 10295, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 10296, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 10297, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 10298, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 10299, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 10300, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 10301, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 10302, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 10303, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 10304, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 10305, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 10306, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 10307, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 10308, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 10309, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 10310, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 10311, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 10312, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 10313, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 10314, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 10315, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 10316, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 10317, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 10318, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 10319, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 10320, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 10321, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + } + ] + }, + { + "id": 467, + "name": "prismarine", + "translation_key": "block.minecraft.prismarine", + "item_id": 481, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10322, + "states": [ + { + "id": 10322, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 468, + "name": "prismarine_bricks", + "translation_key": "block.minecraft.prismarine_bricks", + "item_id": 482, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10323, + "states": [ + { + "id": 10323, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 469, + "name": "dark_prismarine", + "translation_key": "block.minecraft.dark_prismarine", + "item_id": 483, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10324, + "states": [ + { + "id": 10324, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 470, + "name": "prismarine_stairs", + "translation_key": "block.minecraft.prismarine_stairs", + "item_id": 484, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 10336, + "states": [ + { + "id": 10325, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 10326, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 10327, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10328, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10329, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 10330, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 10331, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10332, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10333, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 10334, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 10335, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 10336, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 10337, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10338, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10339, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10340, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10341, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10342, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10343, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10344, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10345, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 10346, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 10347, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10348, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10349, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10350, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10351, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10352, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10353, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10354, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10355, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 10356, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 10357, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10358, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10359, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10360, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10361, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 10362, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 10363, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10364, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10365, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 10366, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 10367, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10368, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10369, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10370, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10371, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10372, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10373, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10374, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10375, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 10376, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 10377, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10378, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10379, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10380, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10381, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10382, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10383, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10384, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10385, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 10386, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 10387, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 10388, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 10389, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10390, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10391, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 10392, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 10393, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10394, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10395, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 10396, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 10397, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10398, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10399, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10400, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10401, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10402, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10403, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 10404, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 471, + "name": "prismarine_brick_stairs", + "translation_key": "block.minecraft.prismarine_brick_stairs", + "item_id": 485, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 10416, + "states": [ + { + "id": 10405, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 10406, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 10407, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10408, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10409, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 10410, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 10411, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10412, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10413, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 10414, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 10415, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 10416, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 10417, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10418, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10419, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10420, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10421, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10422, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10423, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10424, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10425, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 10426, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 10427, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10428, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10429, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10430, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10431, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10432, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10433, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10434, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10435, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 10436, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 10437, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10438, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10439, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10440, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10441, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 10442, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 10443, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10444, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10445, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 10446, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 10447, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10448, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10449, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10450, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10451, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10452, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10453, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10454, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10455, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 10456, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 10457, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10458, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10459, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10460, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10461, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10462, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10463, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10464, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10465, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 10466, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 10467, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 10468, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 10469, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10470, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10471, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 10472, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 10473, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10474, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10475, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 10476, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 10477, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10478, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10479, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10480, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10481, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10482, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10483, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 10484, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 472, + "name": "dark_prismarine_stairs", + "translation_key": "block.minecraft.dark_prismarine_stairs", + "item_id": 486, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 10496, + "states": [ + { + "id": 10485, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 10486, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 10487, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10488, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10489, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 10490, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 10491, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10492, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10493, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 10494, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 10495, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 10496, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 10497, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10498, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10499, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10500, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10501, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10502, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10503, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10504, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10505, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 10506, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 10507, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10508, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10509, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10510, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10511, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10512, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10513, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10514, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10515, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 10516, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 10517, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10518, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10519, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10520, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10521, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 10522, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 10523, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10524, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10525, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 10526, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 10527, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10528, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10529, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10530, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10531, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10532, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10533, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10534, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10535, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 10536, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 10537, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10538, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10539, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10540, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10541, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10542, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10543, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10544, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10545, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 10546, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 10547, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 10548, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 10549, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10550, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10551, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 10552, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 10553, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10554, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10555, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 10556, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 10557, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10558, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10559, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10560, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10561, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10562, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10563, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 10564, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 473, + "name": "prismarine_slab", + "translation_key": "block.minecraft.prismarine_slab", + "item_id": 256, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 10568, + "states": [ + { + "id": 10565, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 10566, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 10567, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 10568, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 10569, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 10570, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 474, + "name": "prismarine_brick_slab", + "translation_key": "block.minecraft.prismarine_brick_slab", + "item_id": 257, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 10574, + "states": [ + { + "id": 10571, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 10572, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 10573, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 10574, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 10575, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 10576, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 475, + "name": "dark_prismarine_slab", + "translation_key": "block.minecraft.dark_prismarine_slab", + "item_id": 258, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 10580, + "states": [ + { + "id": 10577, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 10578, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 10579, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 10580, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 10581, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 10582, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 476, + "name": "sea_lantern", + "translation_key": "block.minecraft.sea_lantern", + "item_id": 487, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10583, + "states": [ + { + "id": 10583, + "luminance": 15, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 477, + "name": "hay_block", + "translation_key": "block.minecraft.hay_block", + "item_id": 423, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 10585, + "states": [ + { + "id": 10584, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 10585, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 10586, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 478, + "name": "white_carpet", + "translation_key": "block.minecraft.white_carpet", + "item_id": 424, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10587, + "states": [ + { + "id": 10587, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 202 + ] + } + ] + }, + { + "id": 479, + "name": "orange_carpet", + "translation_key": "block.minecraft.orange_carpet", + "item_id": 425, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10588, + "states": [ + { + "id": 10588, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 202 + ] + } + ] + }, + { + "id": 480, + "name": "magenta_carpet", + "translation_key": "block.minecraft.magenta_carpet", + "item_id": 426, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10589, + "states": [ + { + "id": 10589, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 202 + ] + } + ] + }, + { + "id": 481, + "name": "light_blue_carpet", + "translation_key": "block.minecraft.light_blue_carpet", + "item_id": 427, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10590, + "states": [ + { + "id": 10590, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 202 + ] + } + ] + }, + { + "id": 482, + "name": "yellow_carpet", + "translation_key": "block.minecraft.yellow_carpet", + "item_id": 428, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10591, + "states": [ + { + "id": 10591, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 202 + ] + } + ] + }, + { + "id": 483, + "name": "lime_carpet", + "translation_key": "block.minecraft.lime_carpet", + "item_id": 429, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10592, + "states": [ + { + "id": 10592, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 202 + ] + } + ] + }, + { + "id": 484, + "name": "pink_carpet", + "translation_key": "block.minecraft.pink_carpet", + "item_id": 430, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10593, + "states": [ + { + "id": 10593, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 202 + ] + } + ] + }, + { + "id": 485, + "name": "gray_carpet", + "translation_key": "block.minecraft.gray_carpet", + "item_id": 431, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10594, + "states": [ + { + "id": 10594, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 202 + ] + } + ] + }, + { + "id": 486, + "name": "light_gray_carpet", + "translation_key": "block.minecraft.light_gray_carpet", + "item_id": 432, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10595, + "states": [ + { + "id": 10595, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 202 + ] + } + ] + }, + { + "id": 487, + "name": "cyan_carpet", + "translation_key": "block.minecraft.cyan_carpet", + "item_id": 433, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10596, + "states": [ + { + "id": 10596, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 202 + ] + } + ] + }, + { + "id": 488, + "name": "purple_carpet", + "translation_key": "block.minecraft.purple_carpet", + "item_id": 434, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10597, + "states": [ + { + "id": 10597, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 202 + ] + } + ] + }, + { + "id": 489, + "name": "blue_carpet", + "translation_key": "block.minecraft.blue_carpet", + "item_id": 435, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10598, + "states": [ + { + "id": 10598, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 202 + ] + } + ] + }, + { + "id": 490, + "name": "brown_carpet", + "translation_key": "block.minecraft.brown_carpet", + "item_id": 436, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10599, + "states": [ + { + "id": 10599, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 202 + ] + } + ] + }, + { + "id": 491, + "name": "green_carpet", + "translation_key": "block.minecraft.green_carpet", + "item_id": 437, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10600, + "states": [ + { + "id": 10600, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 202 + ] + } + ] + }, + { + "id": 492, + "name": "red_carpet", + "translation_key": "block.minecraft.red_carpet", + "item_id": 438, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10601, + "states": [ + { + "id": 10601, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 202 + ] + } + ] + }, + { + "id": 493, + "name": "black_carpet", + "translation_key": "block.minecraft.black_carpet", + "item_id": 439, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10602, + "states": [ + { + "id": 10602, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 202 + ] + } + ] + }, + { + "id": 494, + "name": "terracotta", + "translation_key": "block.minecraft.terracotta", + "item_id": 440, + "hardness": 1.25, + "blast_resistance": 4.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10603, + "states": [ + { + "id": 10603, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 495, + "name": "coal_block", + "translation_key": "block.minecraft.coal_block", + "item_id": 68, + "hardness": 5.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10604, + "states": [ + { + "id": 10604, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 496, + "name": "packed_ice", + "translation_key": "block.minecraft.packed_ice", + "item_id": 441, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.98, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10605, + "states": [ + { + "id": 10605, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 497, + "name": "sunflower", + "translation_key": "block.minecraft.sunflower", + "item_id": 443, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "half", + "values": [ + "upper", + "lower" + ] + } + ], + "default_state_id": 10607, + "states": [ + { + "id": 10606, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10607, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 498, + "name": "lilac", + "translation_key": "block.minecraft.lilac", + "item_id": 444, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "half", + "values": [ + "upper", + "lower" + ] + } + ], + "default_state_id": 10609, + "states": [ + { + "id": 10608, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10609, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 499, + "name": "rose_bush", + "translation_key": "block.minecraft.rose_bush", + "item_id": 445, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "half", + "values": [ + "upper", + "lower" + ] + } + ], + "default_state_id": 10611, + "states": [ + { + "id": 10610, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10611, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 500, + "name": "peony", + "translation_key": "block.minecraft.peony", + "item_id": 446, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "half", + "values": [ + "upper", + "lower" + ] + } + ], + "default_state_id": 10613, + "states": [ + { + "id": 10612, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10613, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 501, + "name": "tall_grass", + "translation_key": "block.minecraft.tall_grass", + "item_id": 447, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "half", + "values": [ + "upper", + "lower" + ] + } + ], + "default_state_id": 10615, + "states": [ + { + "id": 10614, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10615, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 502, + "name": "large_fern", + "translation_key": "block.minecraft.large_fern", + "item_id": 448, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "half", + "values": [ + "upper", + "lower" + ] + } + ], + "default_state_id": 10617, + "states": [ + { + "id": 10616, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 10617, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 503, + "name": "white_banner", + "translation_key": "block.minecraft.white_banner", + "item_id": 1087, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 519, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 10618, + "states": [ + { + "id": 10618, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10619, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10620, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10621, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10622, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10623, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10624, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10625, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10626, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10627, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10628, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10629, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10630, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10631, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10632, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10633, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 504, + "name": "orange_banner", + "translation_key": "block.minecraft.orange_banner", + "item_id": 1088, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 520, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 10634, + "states": [ + { + "id": 10634, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10635, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10636, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10637, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10638, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10639, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10640, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10641, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10642, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10643, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10644, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10645, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10646, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10647, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10648, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10649, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 505, + "name": "magenta_banner", + "translation_key": "block.minecraft.magenta_banner", + "item_id": 1089, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 521, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 10650, + "states": [ + { + "id": 10650, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10651, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10652, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10653, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10654, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10655, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10656, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10657, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10658, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10659, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10660, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10661, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10662, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10663, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10664, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10665, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 506, + "name": "light_blue_banner", + "translation_key": "block.minecraft.light_blue_banner", + "item_id": 1090, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 522, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 10666, + "states": [ + { + "id": 10666, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10667, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10668, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10669, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10670, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10671, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10672, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10673, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10674, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10675, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10676, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10677, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10678, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10679, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10680, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10681, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 507, + "name": "yellow_banner", + "translation_key": "block.minecraft.yellow_banner", + "item_id": 1091, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 523, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 10682, + "states": [ + { + "id": 10682, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10683, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10684, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10685, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10686, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10687, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10688, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10689, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10690, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10691, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10692, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10693, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10694, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10695, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10696, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10697, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 508, + "name": "lime_banner", + "translation_key": "block.minecraft.lime_banner", + "item_id": 1092, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 524, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 10698, + "states": [ + { + "id": 10698, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10699, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10700, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10701, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10702, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10703, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10704, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10705, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10706, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10707, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10708, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10709, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10710, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10711, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10712, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10713, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 509, + "name": "pink_banner", + "translation_key": "block.minecraft.pink_banner", + "item_id": 1093, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 525, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 10714, + "states": [ + { + "id": 10714, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10715, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10716, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10717, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10718, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10719, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10720, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10721, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10722, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10723, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10724, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10725, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10726, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10727, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10728, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10729, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 510, + "name": "gray_banner", + "translation_key": "block.minecraft.gray_banner", + "item_id": 1094, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 526, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 10730, + "states": [ + { + "id": 10730, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10731, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10732, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10733, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10734, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10735, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10736, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10737, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10738, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10739, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10740, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10741, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10742, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10743, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10744, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10745, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 511, + "name": "light_gray_banner", + "translation_key": "block.minecraft.light_gray_banner", + "item_id": 1095, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 527, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 10746, + "states": [ + { + "id": 10746, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10747, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10748, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10749, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10750, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10751, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10752, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10753, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10754, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10755, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10756, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10757, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10758, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10759, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10760, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10761, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 512, + "name": "cyan_banner", + "translation_key": "block.minecraft.cyan_banner", + "item_id": 1096, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 528, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 10762, + "states": [ + { + "id": 10762, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10763, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10764, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10765, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10766, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10767, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10768, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10769, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10770, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10771, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10772, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10773, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10774, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10775, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10776, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10777, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 513, + "name": "purple_banner", + "translation_key": "block.minecraft.purple_banner", + "item_id": 1097, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 529, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 10778, + "states": [ + { + "id": 10778, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10779, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10780, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10781, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10782, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10783, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10784, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10785, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10786, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10787, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10788, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10789, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10790, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10791, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10792, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10793, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 514, + "name": "blue_banner", + "translation_key": "block.minecraft.blue_banner", + "item_id": 1098, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 530, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 10794, + "states": [ + { + "id": 10794, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10795, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10796, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10797, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10798, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10799, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10800, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10801, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10802, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10803, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10804, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10805, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10806, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10807, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10808, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10809, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 515, + "name": "brown_banner", + "translation_key": "block.minecraft.brown_banner", + "item_id": 1099, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 531, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 10810, + "states": [ + { + "id": 10810, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10811, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10812, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10813, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10814, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10815, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10816, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10817, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10818, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10819, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10820, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10821, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10822, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10823, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10824, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10825, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 516, + "name": "green_banner", + "translation_key": "block.minecraft.green_banner", + "item_id": 1100, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 532, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 10826, + "states": [ + { + "id": 10826, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10827, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10828, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10829, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10830, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10831, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10832, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10833, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10834, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10835, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10836, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10837, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10838, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10839, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10840, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10841, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 517, + "name": "red_banner", + "translation_key": "block.minecraft.red_banner", + "item_id": 1101, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 533, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 10842, + "states": [ + { + "id": 10842, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10843, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10844, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10845, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10846, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10847, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10848, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10849, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10850, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10851, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10852, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10853, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10854, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10855, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10856, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10857, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 518, + "name": "black_banner", + "translation_key": "block.minecraft.black_banner", + "item_id": 1102, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 534, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 10858, + "states": [ + { + "id": 10858, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10859, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10860, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10861, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10862, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10863, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10864, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10865, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10866, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10867, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10868, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10869, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10870, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10871, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10872, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10873, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 519, + "name": "white_wall_banner", + "translation_key": "block.minecraft.white_banner", + "item_id": 1087, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 10874, + "states": [ + { + "id": 10874, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10875, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10876, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10877, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 520, + "name": "orange_wall_banner", + "translation_key": "block.minecraft.orange_banner", + "item_id": 1088, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 10878, + "states": [ + { + "id": 10878, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10879, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10880, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10881, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 521, + "name": "magenta_wall_banner", + "translation_key": "block.minecraft.magenta_banner", + "item_id": 1089, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 10882, + "states": [ + { + "id": 10882, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10883, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10884, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10885, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 522, + "name": "light_blue_wall_banner", + "translation_key": "block.minecraft.light_blue_banner", + "item_id": 1090, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 10886, + "states": [ + { + "id": 10886, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10887, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10888, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10889, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 523, + "name": "yellow_wall_banner", + "translation_key": "block.minecraft.yellow_banner", + "item_id": 1091, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 10890, + "states": [ + { + "id": 10890, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10891, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10892, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10893, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 524, + "name": "lime_wall_banner", + "translation_key": "block.minecraft.lime_banner", + "item_id": 1092, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 10894, + "states": [ + { + "id": 10894, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10895, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10896, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10897, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 525, + "name": "pink_wall_banner", + "translation_key": "block.minecraft.pink_banner", + "item_id": 1093, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 10898, + "states": [ + { + "id": 10898, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10899, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10900, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10901, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 526, + "name": "gray_wall_banner", + "translation_key": "block.minecraft.gray_banner", + "item_id": 1094, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 10902, + "states": [ + { + "id": 10902, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10903, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10904, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10905, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 527, + "name": "light_gray_wall_banner", + "translation_key": "block.minecraft.light_gray_banner", + "item_id": 1095, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 10906, + "states": [ + { + "id": 10906, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10907, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10908, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10909, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 528, + "name": "cyan_wall_banner", + "translation_key": "block.minecraft.cyan_banner", + "item_id": 1096, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 10910, + "states": [ + { + "id": 10910, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10911, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10912, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10913, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 529, + "name": "purple_wall_banner", + "translation_key": "block.minecraft.purple_banner", + "item_id": 1097, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 10914, + "states": [ + { + "id": 10914, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10915, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10916, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10917, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 530, + "name": "blue_wall_banner", + "translation_key": "block.minecraft.blue_banner", + "item_id": 1098, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 10918, + "states": [ + { + "id": 10918, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10919, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10920, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10921, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 531, + "name": "brown_wall_banner", + "translation_key": "block.minecraft.brown_banner", + "item_id": 1099, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 10922, + "states": [ + { + "id": 10922, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10923, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10924, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10925, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 532, + "name": "green_wall_banner", + "translation_key": "block.minecraft.green_banner", + "item_id": 1100, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 10926, + "states": [ + { + "id": 10926, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10927, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10928, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10929, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 533, + "name": "red_wall_banner", + "translation_key": "block.minecraft.red_banner", + "item_id": 1101, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 10930, + "states": [ + { + "id": 10930, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10931, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10932, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10933, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 534, + "name": "black_wall_banner", + "translation_key": "block.minecraft.black_banner", + "item_id": 1102, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 10934, + "states": [ + { + "id": 10934, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10935, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10936, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + }, + { + "id": 10937, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 19 + } + ] + }, + { + "id": 535, + "name": "red_sandstone", + "translation_key": "block.minecraft.red_sandstone", + "item_id": 488, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10938, + "states": [ + { + "id": 10938, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 536, + "name": "chiseled_red_sandstone", + "translation_key": "block.minecraft.chiseled_red_sandstone", + "item_id": 489, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10939, + "states": [ + { + "id": 10939, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 537, + "name": "cut_red_sandstone", + "translation_key": "block.minecraft.cut_red_sandstone", + "item_id": 490, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 10940, + "states": [ + { + "id": 10940, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 538, + "name": "red_sandstone_stairs", + "translation_key": "block.minecraft.red_sandstone_stairs", + "item_id": 491, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 10952, + "states": [ + { + "id": 10941, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 10942, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 10943, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10944, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10945, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 10946, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 10947, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10948, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10949, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 10950, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 10951, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 10952, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 10953, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10954, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10955, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10956, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 10957, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10958, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 10959, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10960, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 10961, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 10962, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 10963, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10964, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 10965, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10966, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10967, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10968, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 10969, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10970, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10971, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 10972, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 10973, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10974, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 10975, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10976, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10977, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 10978, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 10979, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10980, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10981, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 10982, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 10983, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10984, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 10985, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10986, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 10987, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10988, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 10989, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10990, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 10991, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 10992, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 10993, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10994, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 10995, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10996, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 10997, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10998, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 10999, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 11000, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 11001, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 11002, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 11003, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 11004, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 11005, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 11006, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 11007, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 11008, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 11009, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 11010, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 11011, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 11012, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 11013, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 11014, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 11015, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 11016, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 11017, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 11018, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 11019, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 11020, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 539, + "name": "oak_slab", + "translation_key": "block.minecraft.oak_slab", + "item_id": 230, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11024, + "states": [ + { + "id": 11021, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11022, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11023, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11024, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11025, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 11026, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 540, + "name": "spruce_slab", + "translation_key": "block.minecraft.spruce_slab", + "item_id": 231, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11030, + "states": [ + { + "id": 11027, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11028, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11029, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11030, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11031, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 11032, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 541, + "name": "birch_slab", + "translation_key": "block.minecraft.birch_slab", + "item_id": 232, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11036, + "states": [ + { + "id": 11033, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11034, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11035, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11036, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11037, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 11038, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 542, + "name": "jungle_slab", + "translation_key": "block.minecraft.jungle_slab", + "item_id": 233, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11042, + "states": [ + { + "id": 11039, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11040, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11041, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11042, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11043, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 11044, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 543, + "name": "acacia_slab", + "translation_key": "block.minecraft.acacia_slab", + "item_id": 234, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11048, + "states": [ + { + "id": 11045, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11046, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11047, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11048, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11049, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 11050, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 544, + "name": "cherry_slab", + "translation_key": "block.minecraft.cherry_slab", + "item_id": 235, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11054, + "states": [ + { + "id": 11051, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11052, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11053, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11054, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11055, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 11056, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 545, + "name": "dark_oak_slab", + "translation_key": "block.minecraft.dark_oak_slab", + "item_id": 236, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11060, + "states": [ + { + "id": 11057, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11058, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11059, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11060, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11061, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 11062, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 546, + "name": "mangrove_slab", + "translation_key": "block.minecraft.mangrove_slab", + "item_id": 237, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11066, + "states": [ + { + "id": 11063, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11064, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11065, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11066, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11067, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 11068, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 547, + "name": "bamboo_slab", + "translation_key": "block.minecraft.bamboo_slab", + "item_id": 238, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11072, + "states": [ + { + "id": 11069, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11070, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11071, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11072, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11073, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 11074, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 548, + "name": "bamboo_mosaic_slab", + "translation_key": "block.minecraft.bamboo_mosaic_slab", + "item_id": 239, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11078, + "states": [ + { + "id": 11075, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11076, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11077, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11078, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11079, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 11080, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 549, + "name": "stone_slab", + "translation_key": "block.minecraft.stone_slab", + "item_id": 242, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11084, + "states": [ + { + "id": 11081, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11082, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11083, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11084, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11085, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 11086, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 550, + "name": "smooth_stone_slab", + "translation_key": "block.minecraft.smooth_stone_slab", + "item_id": 243, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11090, + "states": [ + { + "id": 11087, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11088, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11089, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11090, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11091, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 11092, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 551, + "name": "sandstone_slab", + "translation_key": "block.minecraft.sandstone_slab", + "item_id": 244, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11096, + "states": [ + { + "id": 11093, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11094, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11095, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11096, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11097, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 11098, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 552, + "name": "cut_sandstone_slab", + "translation_key": "block.minecraft.cut_sandstone_slab", + "item_id": 245, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11102, + "states": [ + { + "id": 11099, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11100, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11101, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11102, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11103, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 11104, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 553, + "name": "petrified_oak_slab", + "translation_key": "block.minecraft.petrified_oak_slab", + "item_id": 246, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11108, + "states": [ + { + "id": 11105, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11106, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11107, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11108, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11109, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 11110, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 554, + "name": "cobblestone_slab", + "translation_key": "block.minecraft.cobblestone_slab", + "item_id": 247, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11114, + "states": [ + { + "id": 11111, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11112, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11113, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11114, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11115, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 11116, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 555, + "name": "brick_slab", + "translation_key": "block.minecraft.brick_slab", + "item_id": 248, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11120, + "states": [ + { + "id": 11117, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11118, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11119, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11120, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11121, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 11122, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 556, + "name": "stone_brick_slab", + "translation_key": "block.minecraft.stone_brick_slab", + "item_id": 249, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11126, + "states": [ + { + "id": 11123, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11124, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11125, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11126, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11127, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 11128, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 557, + "name": "mud_brick_slab", + "translation_key": "block.minecraft.mud_brick_slab", + "item_id": 250, + "hardness": 1.5, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11132, + "states": [ + { + "id": 11129, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11130, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11131, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11132, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11133, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 11134, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 558, + "name": "nether_brick_slab", + "translation_key": "block.minecraft.nether_brick_slab", + "item_id": 251, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11138, + "states": [ + { + "id": 11135, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11136, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11137, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11138, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11139, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 11140, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 559, + "name": "quartz_slab", + "translation_key": "block.minecraft.quartz_slab", + "item_id": 252, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11144, + "states": [ + { + "id": 11141, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11142, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11143, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11144, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11145, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 11146, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 560, + "name": "red_sandstone_slab", + "translation_key": "block.minecraft.red_sandstone_slab", + "item_id": 253, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11150, + "states": [ + { + "id": 11147, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11148, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11149, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11150, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11151, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 11152, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 561, + "name": "cut_red_sandstone_slab", + "translation_key": "block.minecraft.cut_red_sandstone_slab", + "item_id": 254, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11156, + "states": [ + { + "id": 11153, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11154, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11155, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11156, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11157, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 11158, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 562, + "name": "purpur_slab", + "translation_key": "block.minecraft.purpur_slab", + "item_id": 255, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11162, + "states": [ + { + "id": 11159, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11160, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 11161, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11162, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 11163, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 11164, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 563, + "name": "smooth_stone", + "translation_key": "block.minecraft.smooth_stone", + "item_id": 262, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 11165, + "states": [ + { + "id": 11165, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 564, + "name": "smooth_sandstone", + "translation_key": "block.minecraft.smooth_sandstone", + "item_id": 261, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 11166, + "states": [ + { + "id": 11166, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 565, + "name": "smooth_quartz", + "translation_key": "block.minecraft.smooth_quartz", + "item_id": 259, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 11167, + "states": [ + { + "id": 11167, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 566, + "name": "smooth_red_sandstone", + "translation_key": "block.minecraft.smooth_red_sandstone", + "item_id": 260, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 11168, + "states": [ + { + "id": 11168, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 567, + "name": "spruce_fence_gate", + "translation_key": "block.minecraft.spruce_fence_gate", + "item_id": 713, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "in_wall", + "values": [ + "true", + "false" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11176, + "states": [ + { + "id": 11169, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11170, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11171, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11172, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11173, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11174, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11175, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11176, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11177, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11178, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11179, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11180, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11181, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11182, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11183, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11184, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11185, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11186, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11187, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11188, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11189, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11190, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11191, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11192, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11193, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11194, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11195, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11196, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11197, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11198, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11199, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11200, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + } + ] + }, + { + "id": 568, + "name": "birch_fence_gate", + "translation_key": "block.minecraft.birch_fence_gate", + "item_id": 714, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "in_wall", + "values": [ + "true", + "false" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11208, + "states": [ + { + "id": 11201, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11202, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11203, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11204, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11205, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11206, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11207, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11208, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11209, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11210, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11211, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11212, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11213, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11214, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11215, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11216, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11217, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11218, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11219, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11220, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11221, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11222, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11223, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11224, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11225, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11226, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11227, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11228, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11229, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11230, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11231, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11232, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + } + ] + }, + { + "id": 569, + "name": "jungle_fence_gate", + "translation_key": "block.minecraft.jungle_fence_gate", + "item_id": 715, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "in_wall", + "values": [ + "true", + "false" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11240, + "states": [ + { + "id": 11233, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11234, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11235, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11236, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11237, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11238, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11239, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11240, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11241, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11242, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11243, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11244, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11245, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11246, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11247, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11248, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11249, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11250, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11251, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11252, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11253, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11254, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11255, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11256, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11257, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11258, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11259, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11260, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11261, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11262, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11263, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11264, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + } + ] + }, + { + "id": 570, + "name": "acacia_fence_gate", + "translation_key": "block.minecraft.acacia_fence_gate", + "item_id": 716, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "in_wall", + "values": [ + "true", + "false" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11272, + "states": [ + { + "id": 11265, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11266, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11267, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11268, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11269, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11270, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11271, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11272, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11273, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11274, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11275, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11276, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11277, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11278, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11279, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11280, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11281, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11282, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11283, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11284, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11285, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11286, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11287, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11288, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11289, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11290, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11291, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11292, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11293, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11294, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11295, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11296, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + } + ] + }, + { + "id": 571, + "name": "cherry_fence_gate", + "translation_key": "block.minecraft.cherry_fence_gate", + "item_id": 717, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "in_wall", + "values": [ + "true", + "false" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11304, + "states": [ + { + "id": 11297, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11298, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11299, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11300, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11301, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11302, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11303, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11304, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11305, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11306, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11307, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11308, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11309, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11310, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11311, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11312, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11313, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11314, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11315, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11316, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11317, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11318, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11319, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11320, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11321, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11322, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11323, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11324, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11325, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11326, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11327, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11328, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + } + ] + }, + { + "id": 572, + "name": "dark_oak_fence_gate", + "translation_key": "block.minecraft.dark_oak_fence_gate", + "item_id": 718, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "in_wall", + "values": [ + "true", + "false" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11336, + "states": [ + { + "id": 11329, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11330, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11331, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11332, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11333, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11334, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11335, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11336, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11337, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11338, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11339, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11340, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11341, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11342, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11343, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11344, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11345, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11346, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11347, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11348, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11349, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11350, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11351, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11352, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11353, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11354, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11355, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11356, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11357, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11358, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11359, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11360, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + } + ] + }, + { + "id": 573, + "name": "mangrove_fence_gate", + "translation_key": "block.minecraft.mangrove_fence_gate", + "item_id": 719, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "in_wall", + "values": [ + "true", + "false" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11368, + "states": [ + { + "id": 11361, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11362, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11363, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11364, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11365, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11366, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11367, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11368, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11369, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11370, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11371, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11372, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11373, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11374, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11375, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11376, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11377, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11378, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11379, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11380, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11381, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11382, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11383, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11384, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11385, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11386, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11387, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11388, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11389, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11390, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11391, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11392, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + } + ] + }, + { + "id": 574, + "name": "bamboo_fence_gate", + "translation_key": "block.minecraft.bamboo_fence_gate", + "item_id": 720, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "in_wall", + "values": [ + "true", + "false" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11400, + "states": [ + { + "id": 11393, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11394, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11395, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11396, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11397, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11398, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11399, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11400, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11401, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11402, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11403, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11404, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11405, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11406, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11407, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11408, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11409, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11410, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11411, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11412, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11413, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11414, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11415, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11416, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11417, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11418, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11419, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11420, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11421, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11422, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 11423, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11424, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + } + ] + }, + { + "id": 575, + "name": "spruce_fence", + "translation_key": "block.minecraft.spruce_fence", + "item_id": 290, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11456, + "states": [ + { + "id": 11425, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76, + 77 + ] + }, + { + "id": 11426, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78, + 79 + ] + }, + { + "id": 11427, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76, + 77 + ] + }, + { + "id": 11428, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78, + 79 + ] + }, + { + "id": 11429, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76 + ] + }, + { + "id": 11430, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80, + 79 + ] + }, + { + "id": 11431, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76 + ] + }, + { + "id": 11432, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80, + 79 + ] + }, + { + "id": 11433, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 77 + ] + }, + { + "id": 11434, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81, + 79 + ] + }, + { + "id": 11435, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 77 + ] + }, + { + "id": 11436, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81, + 79 + ] + }, + { + "id": 11437, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11438, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 82 + ] + }, + { + "id": 11439, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11440, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 82 + ] + }, + { + "id": 11441, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76, + 77 + ] + }, + { + "id": 11442, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11443, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76, + 77 + ] + }, + { + "id": 11444, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11445, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76 + ] + }, + { + "id": 11446, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80 + ] + }, + { + "id": 11447, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76 + ] + }, + { + "id": 11448, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80 + ] + }, + { + "id": 11449, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 77 + ] + }, + { + "id": 11450, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81 + ] + }, + { + "id": 11451, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 77 + ] + }, + { + "id": 11452, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81 + ] + }, + { + "id": 11453, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83 + ] + }, + { + "id": 11454, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 84 + ] + }, + { + "id": 11455, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83 + ] + }, + { + "id": 11456, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 84 + ] + } + ] + }, + { + "id": 576, + "name": "birch_fence", + "translation_key": "block.minecraft.birch_fence", + "item_id": 291, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11488, + "states": [ + { + "id": 11457, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76, + 77 + ] + }, + { + "id": 11458, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78, + 79 + ] + }, + { + "id": 11459, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76, + 77 + ] + }, + { + "id": 11460, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78, + 79 + ] + }, + { + "id": 11461, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76 + ] + }, + { + "id": 11462, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80, + 79 + ] + }, + { + "id": 11463, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76 + ] + }, + { + "id": 11464, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80, + 79 + ] + }, + { + "id": 11465, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 77 + ] + }, + { + "id": 11466, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81, + 79 + ] + }, + { + "id": 11467, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 77 + ] + }, + { + "id": 11468, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81, + 79 + ] + }, + { + "id": 11469, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11470, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 82 + ] + }, + { + "id": 11471, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11472, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 82 + ] + }, + { + "id": 11473, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76, + 77 + ] + }, + { + "id": 11474, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11475, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76, + 77 + ] + }, + { + "id": 11476, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11477, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76 + ] + }, + { + "id": 11478, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80 + ] + }, + { + "id": 11479, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76 + ] + }, + { + "id": 11480, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80 + ] + }, + { + "id": 11481, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 77 + ] + }, + { + "id": 11482, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81 + ] + }, + { + "id": 11483, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 77 + ] + }, + { + "id": 11484, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81 + ] + }, + { + "id": 11485, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83 + ] + }, + { + "id": 11486, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 84 + ] + }, + { + "id": 11487, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83 + ] + }, + { + "id": 11488, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 84 + ] + } + ] + }, + { + "id": 577, + "name": "jungle_fence", + "translation_key": "block.minecraft.jungle_fence", + "item_id": 292, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11520, + "states": [ + { + "id": 11489, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76, + 77 + ] + }, + { + "id": 11490, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78, + 79 + ] + }, + { + "id": 11491, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76, + 77 + ] + }, + { + "id": 11492, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78, + 79 + ] + }, + { + "id": 11493, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76 + ] + }, + { + "id": 11494, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80, + 79 + ] + }, + { + "id": 11495, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76 + ] + }, + { + "id": 11496, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80, + 79 + ] + }, + { + "id": 11497, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 77 + ] + }, + { + "id": 11498, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81, + 79 + ] + }, + { + "id": 11499, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 77 + ] + }, + { + "id": 11500, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81, + 79 + ] + }, + { + "id": 11501, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11502, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 82 + ] + }, + { + "id": 11503, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11504, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 82 + ] + }, + { + "id": 11505, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76, + 77 + ] + }, + { + "id": 11506, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11507, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76, + 77 + ] + }, + { + "id": 11508, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11509, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76 + ] + }, + { + "id": 11510, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80 + ] + }, + { + "id": 11511, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76 + ] + }, + { + "id": 11512, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80 + ] + }, + { + "id": 11513, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 77 + ] + }, + { + "id": 11514, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81 + ] + }, + { + "id": 11515, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 77 + ] + }, + { + "id": 11516, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81 + ] + }, + { + "id": 11517, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83 + ] + }, + { + "id": 11518, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 84 + ] + }, + { + "id": 11519, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83 + ] + }, + { + "id": 11520, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 84 + ] + } + ] + }, + { + "id": 578, + "name": "acacia_fence", + "translation_key": "block.minecraft.acacia_fence", + "item_id": 293, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11552, + "states": [ + { + "id": 11521, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76, + 77 + ] + }, + { + "id": 11522, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78, + 79 + ] + }, + { + "id": 11523, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76, + 77 + ] + }, + { + "id": 11524, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78, + 79 + ] + }, + { + "id": 11525, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76 + ] + }, + { + "id": 11526, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80, + 79 + ] + }, + { + "id": 11527, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76 + ] + }, + { + "id": 11528, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80, + 79 + ] + }, + { + "id": 11529, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 77 + ] + }, + { + "id": 11530, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81, + 79 + ] + }, + { + "id": 11531, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 77 + ] + }, + { + "id": 11532, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81, + 79 + ] + }, + { + "id": 11533, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11534, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 82 + ] + }, + { + "id": 11535, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11536, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 82 + ] + }, + { + "id": 11537, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76, + 77 + ] + }, + { + "id": 11538, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11539, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76, + 77 + ] + }, + { + "id": 11540, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11541, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76 + ] + }, + { + "id": 11542, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80 + ] + }, + { + "id": 11543, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76 + ] + }, + { + "id": 11544, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80 + ] + }, + { + "id": 11545, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 77 + ] + }, + { + "id": 11546, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81 + ] + }, + { + "id": 11547, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 77 + ] + }, + { + "id": 11548, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81 + ] + }, + { + "id": 11549, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83 + ] + }, + { + "id": 11550, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 84 + ] + }, + { + "id": 11551, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83 + ] + }, + { + "id": 11552, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 84 + ] + } + ] + }, + { + "id": 579, + "name": "cherry_fence", + "translation_key": "block.minecraft.cherry_fence", + "item_id": 294, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11584, + "states": [ + { + "id": 11553, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76, + 77 + ] + }, + { + "id": 11554, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78, + 79 + ] + }, + { + "id": 11555, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76, + 77 + ] + }, + { + "id": 11556, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78, + 79 + ] + }, + { + "id": 11557, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76 + ] + }, + { + "id": 11558, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80, + 79 + ] + }, + { + "id": 11559, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76 + ] + }, + { + "id": 11560, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80, + 79 + ] + }, + { + "id": 11561, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 77 + ] + }, + { + "id": 11562, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81, + 79 + ] + }, + { + "id": 11563, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 77 + ] + }, + { + "id": 11564, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81, + 79 + ] + }, + { + "id": 11565, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11566, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 82 + ] + }, + { + "id": 11567, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11568, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 82 + ] + }, + { + "id": 11569, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76, + 77 + ] + }, + { + "id": 11570, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11571, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76, + 77 + ] + }, + { + "id": 11572, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11573, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76 + ] + }, + { + "id": 11574, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80 + ] + }, + { + "id": 11575, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76 + ] + }, + { + "id": 11576, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80 + ] + }, + { + "id": 11577, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 77 + ] + }, + { + "id": 11578, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81 + ] + }, + { + "id": 11579, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 77 + ] + }, + { + "id": 11580, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81 + ] + }, + { + "id": 11581, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83 + ] + }, + { + "id": 11582, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 84 + ] + }, + { + "id": 11583, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83 + ] + }, + { + "id": 11584, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 84 + ] + } + ] + }, + { + "id": 580, + "name": "dark_oak_fence", + "translation_key": "block.minecraft.dark_oak_fence", + "item_id": 295, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11616, + "states": [ + { + "id": 11585, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76, + 77 + ] + }, + { + "id": 11586, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78, + 79 + ] + }, + { + "id": 11587, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76, + 77 + ] + }, + { + "id": 11588, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78, + 79 + ] + }, + { + "id": 11589, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76 + ] + }, + { + "id": 11590, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80, + 79 + ] + }, + { + "id": 11591, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76 + ] + }, + { + "id": 11592, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80, + 79 + ] + }, + { + "id": 11593, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 77 + ] + }, + { + "id": 11594, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81, + 79 + ] + }, + { + "id": 11595, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 77 + ] + }, + { + "id": 11596, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81, + 79 + ] + }, + { + "id": 11597, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11598, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 82 + ] + }, + { + "id": 11599, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11600, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 82 + ] + }, + { + "id": 11601, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76, + 77 + ] + }, + { + "id": 11602, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11603, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76, + 77 + ] + }, + { + "id": 11604, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11605, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76 + ] + }, + { + "id": 11606, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80 + ] + }, + { + "id": 11607, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76 + ] + }, + { + "id": 11608, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80 + ] + }, + { + "id": 11609, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 77 + ] + }, + { + "id": 11610, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81 + ] + }, + { + "id": 11611, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 77 + ] + }, + { + "id": 11612, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81 + ] + }, + { + "id": 11613, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83 + ] + }, + { + "id": 11614, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 84 + ] + }, + { + "id": 11615, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83 + ] + }, + { + "id": 11616, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 84 + ] + } + ] + }, + { + "id": 581, + "name": "mangrove_fence", + "translation_key": "block.minecraft.mangrove_fence", + "item_id": 296, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11648, + "states": [ + { + "id": 11617, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76, + 77 + ] + }, + { + "id": 11618, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78, + 79 + ] + }, + { + "id": 11619, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76, + 77 + ] + }, + { + "id": 11620, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78, + 79 + ] + }, + { + "id": 11621, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76 + ] + }, + { + "id": 11622, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80, + 79 + ] + }, + { + "id": 11623, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76 + ] + }, + { + "id": 11624, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80, + 79 + ] + }, + { + "id": 11625, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 77 + ] + }, + { + "id": 11626, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81, + 79 + ] + }, + { + "id": 11627, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 77 + ] + }, + { + "id": 11628, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81, + 79 + ] + }, + { + "id": 11629, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11630, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 82 + ] + }, + { + "id": 11631, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11632, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 82 + ] + }, + { + "id": 11633, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76, + 77 + ] + }, + { + "id": 11634, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11635, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76, + 77 + ] + }, + { + "id": 11636, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11637, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76 + ] + }, + { + "id": 11638, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80 + ] + }, + { + "id": 11639, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76 + ] + }, + { + "id": 11640, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80 + ] + }, + { + "id": 11641, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 77 + ] + }, + { + "id": 11642, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81 + ] + }, + { + "id": 11643, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 77 + ] + }, + { + "id": 11644, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81 + ] + }, + { + "id": 11645, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83 + ] + }, + { + "id": 11646, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 84 + ] + }, + { + "id": 11647, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83 + ] + }, + { + "id": 11648, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 84 + ] + } + ] + }, + { + "id": 582, + "name": "bamboo_fence", + "translation_key": "block.minecraft.bamboo_fence", + "item_id": 297, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11680, + "states": [ + { + "id": 11649, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76, + 77 + ] + }, + { + "id": 11650, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78, + 79 + ] + }, + { + "id": 11651, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76, + 77 + ] + }, + { + "id": 11652, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78, + 79 + ] + }, + { + "id": 11653, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76 + ] + }, + { + "id": 11654, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80, + 79 + ] + }, + { + "id": 11655, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76 + ] + }, + { + "id": 11656, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80, + 79 + ] + }, + { + "id": 11657, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 77 + ] + }, + { + "id": 11658, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81, + 79 + ] + }, + { + "id": 11659, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 77 + ] + }, + { + "id": 11660, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81, + 79 + ] + }, + { + "id": 11661, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11662, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 82 + ] + }, + { + "id": 11663, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 11664, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 82 + ] + }, + { + "id": 11665, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76, + 77 + ] + }, + { + "id": 11666, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11667, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76, + 77 + ] + }, + { + "id": 11668, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 11669, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76 + ] + }, + { + "id": 11670, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80 + ] + }, + { + "id": 11671, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76 + ] + }, + { + "id": 11672, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80 + ] + }, + { + "id": 11673, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 77 + ] + }, + { + "id": 11674, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81 + ] + }, + { + "id": 11675, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 77 + ] + }, + { + "id": 11676, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81 + ] + }, + { + "id": 11677, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83 + ] + }, + { + "id": 11678, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 84 + ] + }, + { + "id": 11679, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83 + ] + }, + { + "id": 11680, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 84 + ] + } + ] + }, + { + "id": 583, + "name": "spruce_door", + "translation_key": "block.minecraft.spruce_door", + "item_id": 690, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "upper", + "lower" + ] + }, + { + "name": "hinge", + "values": [ + "left", + "right" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11692, + "states": [ + { + "id": 11681, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11682, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11683, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11684, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11685, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11686, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11687, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11688, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11689, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11690, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11691, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11692, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11693, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11694, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11695, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11696, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11697, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11698, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11699, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11700, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11701, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11702, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11703, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11704, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11705, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11706, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11707, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11708, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11709, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11710, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11711, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11712, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11713, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11714, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11715, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11716, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11717, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11718, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11719, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11720, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11721, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11722, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11723, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11724, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11725, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11726, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11727, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11728, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11729, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11730, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11731, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11732, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11733, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11734, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11735, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11736, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11737, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11738, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11739, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11740, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11741, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11742, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11743, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11744, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + } + ] + }, + { + "id": 584, + "name": "birch_door", + "translation_key": "block.minecraft.birch_door", + "item_id": 691, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "upper", + "lower" + ] + }, + { + "name": "hinge", + "values": [ + "left", + "right" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11756, + "states": [ + { + "id": 11745, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11746, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11747, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11748, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11749, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11750, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11751, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11752, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11753, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11754, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11755, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11756, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11757, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11758, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11759, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11760, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11761, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11762, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11763, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11764, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11765, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11766, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11767, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11768, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11769, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11770, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11771, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11772, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11773, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11774, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11775, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11776, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11777, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11778, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11779, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11780, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11781, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11782, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11783, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11784, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11785, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11786, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11787, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11788, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11789, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11790, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11791, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11792, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11793, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11794, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11795, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11796, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11797, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11798, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11799, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11800, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11801, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11802, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11803, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11804, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11805, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11806, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11807, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11808, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + } + ] + }, + { + "id": 585, + "name": "jungle_door", + "translation_key": "block.minecraft.jungle_door", + "item_id": 692, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "upper", + "lower" + ] + }, + { + "name": "hinge", + "values": [ + "left", + "right" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11820, + "states": [ + { + "id": 11809, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11810, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11811, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11812, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11813, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11814, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11815, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11816, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11817, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11818, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11819, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11820, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11821, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11822, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11823, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11824, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11825, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11826, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11827, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11828, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11829, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11830, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11831, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11832, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11833, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11834, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11835, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11836, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11837, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11838, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11839, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11840, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11841, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11842, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11843, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11844, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11845, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11846, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11847, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11848, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11849, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11850, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11851, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11852, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11853, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11854, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11855, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11856, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11857, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11858, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11859, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11860, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11861, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11862, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11863, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11864, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11865, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11866, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11867, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11868, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11869, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11870, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11871, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11872, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + } + ] + }, + { + "id": 586, + "name": "acacia_door", + "translation_key": "block.minecraft.acacia_door", + "item_id": 693, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "upper", + "lower" + ] + }, + { + "name": "hinge", + "values": [ + "left", + "right" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11884, + "states": [ + { + "id": 11873, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11874, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11875, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11876, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11877, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11878, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11879, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11880, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11881, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11882, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11883, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11884, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11885, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11886, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11887, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11888, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11889, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11890, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11891, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11892, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11893, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11894, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11895, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11896, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11897, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11898, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11899, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11900, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11901, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11902, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11903, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11904, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11905, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11906, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11907, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11908, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11909, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11910, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11911, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11912, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11913, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11914, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11915, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11916, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11917, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11918, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11919, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11920, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11921, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11922, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11923, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11924, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11925, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11926, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11927, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11928, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11929, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11930, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11931, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11932, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11933, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11934, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11935, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11936, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + } + ] + }, + { + "id": 587, + "name": "cherry_door", + "translation_key": "block.minecraft.cherry_door", + "item_id": 694, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "upper", + "lower" + ] + }, + { + "name": "hinge", + "values": [ + "left", + "right" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 11948, + "states": [ + { + "id": 11937, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11938, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11939, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11940, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11941, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11942, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11943, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11944, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11945, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11946, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11947, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11948, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11949, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11950, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11951, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11952, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11953, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11954, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11955, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11956, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11957, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11958, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11959, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11960, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11961, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11962, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11963, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11964, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11965, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11966, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11967, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11968, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11969, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11970, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11971, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11972, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11973, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11974, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11975, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11976, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11977, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11978, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11979, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11980, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11981, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11982, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11983, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11984, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 11985, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11986, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11987, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11988, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11989, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11990, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11991, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11992, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11993, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11994, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 11995, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11996, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 11997, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11998, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 11999, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12000, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + } + ] + }, + { + "id": 588, + "name": "dark_oak_door", + "translation_key": "block.minecraft.dark_oak_door", + "item_id": 695, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "upper", + "lower" + ] + }, + { + "name": "hinge", + "values": [ + "left", + "right" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12012, + "states": [ + { + "id": 12001, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12002, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12003, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12004, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12005, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12006, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12007, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12008, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12009, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12010, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12011, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12012, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12013, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12014, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12015, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12016, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12017, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12018, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12019, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12020, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12021, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12022, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12023, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12024, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12025, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12026, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12027, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12028, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12029, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12030, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12031, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12032, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12033, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12034, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12035, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12036, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12037, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12038, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12039, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12040, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12041, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12042, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12043, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12044, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12045, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12046, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12047, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12048, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12049, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12050, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12051, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12052, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12053, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12054, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12055, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12056, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12057, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12058, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12059, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12060, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12061, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12062, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12063, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12064, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + } + ] + }, + { + "id": 589, + "name": "mangrove_door", + "translation_key": "block.minecraft.mangrove_door", + "item_id": 696, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "upper", + "lower" + ] + }, + { + "name": "hinge", + "values": [ + "left", + "right" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12076, + "states": [ + { + "id": 12065, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12066, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12067, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12068, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12069, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12070, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12071, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12072, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12073, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12074, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12075, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12076, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12077, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12078, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12079, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12080, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12081, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12082, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12083, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12084, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12085, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12086, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12087, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12088, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12089, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12090, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12091, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12092, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12093, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12094, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12095, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12096, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12097, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12098, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12099, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12100, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12101, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12102, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12103, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12104, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12105, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12106, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12107, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12108, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12109, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12110, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12111, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12112, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12113, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12114, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12115, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12116, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12117, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12118, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12119, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12120, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12121, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12122, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12123, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12124, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12125, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12126, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12127, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12128, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + } + ] + }, + { + "id": 590, + "name": "bamboo_door", + "translation_key": "block.minecraft.bamboo_door", + "item_id": 697, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "upper", + "lower" + ] + }, + { + "name": "hinge", + "values": [ + "left", + "right" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12140, + "states": [ + { + "id": 12129, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12130, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12131, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12132, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12133, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12134, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12135, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12136, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12137, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12138, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12139, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12140, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12141, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12142, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12143, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12144, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12145, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12146, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12147, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12148, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12149, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12150, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12151, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12152, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12153, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12154, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12155, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12156, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12157, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12158, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12159, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12160, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12161, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12162, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12163, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12164, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12165, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12166, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12167, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12168, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12169, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12170, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12171, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12172, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12173, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12174, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12175, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12176, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 12177, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12178, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12179, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12180, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12181, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12182, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12183, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12184, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12185, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12186, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 12187, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12188, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12189, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12190, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 12191, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 12192, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + } + ] + }, + { + "id": 591, + "name": "end_rod", + "translation_key": "block.minecraft.end_rod", + "item_id": 270, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + } + ], + "default_state_id": 12197, + "states": [ + { + "id": 12193, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 203 + ] + }, + { + "id": 12194, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 204 + ] + }, + { + "id": 12195, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 203 + ] + }, + { + "id": 12196, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 204 + ] + }, + { + "id": 12197, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 32 + ] + }, + { + "id": 12198, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 32 + ] + } + ] + }, + { + "id": 592, + "name": "chorus_plant", + "translation_key": "block.minecraft.chorus_plant", + "item_id": 271, + "hardness": 0.4, + "blast_resistance": 0.4, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "down", + "values": [ + "true", + "false" + ] + }, + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12262, + "states": [ + { + "id": 12199, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 205, + 206, + 207, + 208, + 209 + ] + }, + { + "id": 12200, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 205, + 207, + 208, + 209 + ] + }, + { + "id": 12201, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 210, + 206, + 207, + 208, + 209 + ] + }, + { + "id": 12202, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 210, + 207, + 208, + 209 + ] + }, + { + "id": 12203, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 205, + 206, + 207, + 209 + ] + }, + { + "id": 12204, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 205, + 207, + 209 + ] + }, + { + "id": 12205, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 210, + 206, + 207, + 209 + ] + }, + { + "id": 12206, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 210, + 207, + 209 + ] + }, + { + "id": 12207, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 205, + 206, + 208, + 209 + ] + }, + { + "id": 12208, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 205, + 208, + 209 + ] + }, + { + "id": 12209, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 210, + 206, + 208, + 209 + ] + }, + { + "id": 12210, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 210, + 208, + 209 + ] + }, + { + "id": 12211, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 205, + 206, + 209 + ] + }, + { + "id": 12212, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 205, + 209 + ] + }, + { + "id": 12213, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 210, + 206, + 209 + ] + }, + { + "id": 12214, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 210, + 209 + ] + }, + { + "id": 12215, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 205, + 206, + 207, + 208 + ] + }, + { + "id": 12216, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 205, + 207, + 208 + ] + }, + { + "id": 12217, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 210, + 206, + 207, + 208 + ] + }, + { + "id": 12218, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 210, + 207, + 208 + ] + }, + { + "id": 12219, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 205, + 206, + 207 + ] + }, + { + "id": 12220, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 205, + 207 + ] + }, + { + "id": 12221, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 210, + 206, + 207 + ] + }, + { + "id": 12222, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 210, + 207 + ] + }, + { + "id": 12223, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 205, + 206, + 208 + ] + }, + { + "id": 12224, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 205, + 208 + ] + }, + { + "id": 12225, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 210, + 206, + 208 + ] + }, + { + "id": 12226, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 210, + 208 + ] + }, + { + "id": 12227, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 205, + 206 + ] + }, + { + "id": 12228, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 205 + ] + }, + { + "id": 12229, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 210, + 206 + ] + }, + { + "id": 12230, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 210 + ] + }, + { + "id": 12231, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 211, + 207, + 208, + 212 + ] + }, + { + "id": 12232, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 213, + 209, + 212 + ] + }, + { + "id": 12233, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 211, + 207, + 208 + ] + }, + { + "id": 12234, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 213, + 209 + ] + }, + { + "id": 12235, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 211, + 207, + 212 + ] + }, + { + "id": 12236, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 214, + 209, + 212 + ] + }, + { + "id": 12237, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 211, + 207 + ] + }, + { + "id": 12238, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 214, + 209 + ] + }, + { + "id": 12239, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 211, + 208, + 212 + ] + }, + { + "id": 12240, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 215, + 209, + 212 + ] + }, + { + "id": 12241, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 211, + 208 + ] + }, + { + "id": 12242, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 215, + 209 + ] + }, + { + "id": 12243, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 211, + 212 + ] + }, + { + "id": 12244, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 216, + 212 + ] + }, + { + "id": 12245, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 211 + ] + }, + { + "id": 12246, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 216 + ] + }, + { + "id": 12247, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 217, + 207, + 208, + 212 + ] + }, + { + "id": 12248, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 213, + 212 + ] + }, + { + "id": 12249, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 217, + 207, + 208 + ] + }, + { + "id": 12250, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 213 + ] + }, + { + "id": 12251, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 217, + 207, + 212 + ] + }, + { + "id": 12252, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 214, + 212 + ] + }, + { + "id": 12253, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 217, + 207 + ] + }, + { + "id": 12254, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 214 + ] + }, + { + "id": 12255, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 217, + 208, + 212 + ] + }, + { + "id": 12256, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 215, + 212 + ] + }, + { + "id": 12257, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 217, + 208 + ] + }, + { + "id": 12258, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 215 + ] + }, + { + "id": 12259, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 217, + 212 + ] + }, + { + "id": 12260, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 218 + ] + }, + { + "id": 12261, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 217 + ] + }, + { + "id": 12262, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 219 + ] + } + ] + }, + { + "id": 593, + "name": "chorus_flower", + "translation_key": "block.minecraft.chorus_flower", + "item_id": 272, + "hardness": 0.4, + "blast_resistance": 0.4, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "age", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5" + ] + } + ], + "default_state_id": 12263, + "states": [ + { + "id": 12263, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12264, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12265, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12266, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12267, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12268, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 594, + "name": "purpur_block", + "translation_key": "block.minecraft.purpur_block", + "item_id": 273, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12269, + "states": [ + { + "id": 12269, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 595, + "name": "purpur_pillar", + "translation_key": "block.minecraft.purpur_pillar", + "item_id": 274, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 12271, + "states": [ + { + "id": 12270, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12271, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12272, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 596, + "name": "purpur_stairs", + "translation_key": "block.minecraft.purpur_stairs", + "item_id": 275, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12284, + "states": [ + { + "id": 12273, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 12274, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 12275, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 12276, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 12277, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 12278, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 12279, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 12280, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 12281, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 12282, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 12283, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 12284, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 12285, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 12286, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 12287, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 12288, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 12289, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 12290, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 12291, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 12292, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 12293, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 12294, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 12295, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 12296, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 12297, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 12298, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 12299, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 12300, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 12301, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 12302, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 12303, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 12304, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 12305, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 12306, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 12307, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 12308, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 12309, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 12310, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 12311, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 12312, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 12313, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 12314, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 12315, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 12316, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 12317, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 12318, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 12319, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 12320, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 12321, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 12322, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 12323, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 12324, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 12325, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 12326, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 12327, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 12328, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 12329, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 12330, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 12331, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 12332, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 12333, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 12334, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 12335, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 12336, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 12337, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 12338, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 12339, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 12340, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 12341, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 12342, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 12343, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 12344, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 12345, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 12346, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 12347, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 12348, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 12349, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 12350, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 12351, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 12352, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 597, + "name": "end_stone_bricks", + "translation_key": "block.minecraft.end_stone_bricks", + "item_id": 356, + "hardness": 3.0, + "blast_resistance": 9.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12353, + "states": [ + { + "id": 12353, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 598, + "name": "torchflower_crop", + "translation_key": "block.minecraft.torchflower_crop", + "item_id": 1106, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "age", + "values": [ + "0", + "1" + ] + } + ], + "default_state_id": 12354, + "states": [ + { + "id": 12354, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12355, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 599, + "name": "pitcher_crop", + "translation_key": "block.minecraft.pitcher_crop", + "item_id": 1107, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "age", + "values": [ + "0", + "1", + "2", + "3", + "4" + ] + }, + { + "name": "half", + "values": [ + "upper", + "lower" + ] + } + ], + "default_state_id": 12357, + "states": [ + { + "id": 12356, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 220 + ] + }, + { + "id": 12357, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 220 + ] + }, + { + "id": 12358, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12359, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 221 + ] + }, + { + "id": 12360, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12361, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 221 + ] + }, + { + "id": 12362, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12363, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 221 + ] + }, + { + "id": 12364, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12365, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 221 + ] + } + ] + }, + { + "id": 600, + "name": "pitcher_plant", + "translation_key": "block.minecraft.pitcher_plant", + "item_id": 210, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "half", + "values": [ + "upper", + "lower" + ] + } + ], + "default_state_id": 12367, + "states": [ + { + "id": 12366, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12367, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 601, + "name": "beetroots", + "translation_key": "block.minecraft.beetroots", + "item_id": 1109, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "age", + "values": [ + "0", + "1", + "2", + "3" + ] + } + ], + "default_state_id": 12368, + "states": [ + { + "id": 12368, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12369, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12370, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12371, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 602, + "name": "dirt_path", + "translation_key": "block.minecraft.dirt_path", + "item_id": 442, + "hardness": 0.65, + "blast_resistance": 0.65, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12372, + "states": [ + { + "id": 12372, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 63 + ] + } + ] + }, + { + "id": 603, + "name": "end_gateway", + "translation_key": "block.minecraft.end_gateway", + "item_id": 0, + "hardness": -1.0, + "blast_resistance": 3600000.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12373, + "states": [ + { + "id": 12373, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [], + "block_entity_type": 21 + } + ] + }, + { + "id": 604, + "name": "repeating_command_block", + "translation_key": "block.minecraft.repeating_command_block", + "item_id": 492, + "hardness": -1.0, + "blast_resistance": 3600000.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "conditional", + "values": [ + "true", + "false" + ] + }, + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + } + ], + "default_state_id": 12380, + "states": [ + { + "id": 12374, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 12375, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 12376, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 12377, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 12378, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 12379, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 12380, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 12381, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 12382, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 12383, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 12384, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 12385, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + } + ] + }, + { + "id": 605, + "name": "chain_command_block", + "translation_key": "block.minecraft.chain_command_block", + "item_id": 493, + "hardness": -1.0, + "blast_resistance": 3600000.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "conditional", + "values": [ + "true", + "false" + ] + }, + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + } + ], + "default_state_id": 12392, + "states": [ + { + "id": 12386, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 12387, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 12388, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 12389, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 12390, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 12391, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 12392, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 12393, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 12394, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 12395, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 12396, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + }, + { + "id": 12397, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 22 + } + ] + }, + { + "id": 606, + "name": "frosted_ice", + "translation_key": "block.minecraft.frosted_ice", + "item_id": 0, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.98, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "age", + "values": [ + "0", + "1", + "2", + "3" + ] + } + ], + "default_state_id": 12398, + "states": [ + { + "id": 12398, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12399, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12400, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12401, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 607, + "name": "magma_block", + "translation_key": "block.minecraft.magma_block", + "item_id": 494, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12402, + "states": [ + { + "id": 12402, + "luminance": 3, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 608, + "name": "nether_wart_block", + "translation_key": "block.minecraft.nether_wart_block", + "item_id": 495, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12403, + "states": [ + { + "id": 12403, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 609, + "name": "red_nether_bricks", + "translation_key": "block.minecraft.red_nether_bricks", + "item_id": 497, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12404, + "states": [ + { + "id": 12404, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 610, + "name": "bone_block", + "translation_key": "block.minecraft.bone_block", + "item_id": 498, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 12406, + "states": [ + { + "id": 12405, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12406, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12407, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 611, + "name": "structure_void", + "translation_key": "block.minecraft.structure_void", + "item_id": 499, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12408, + "states": [ + { + "id": 12408, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 612, + "name": "observer", + "translation_key": "block.minecraft.observer", + "item_id": 644, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12414, + "states": [ + { + "id": 12409, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12410, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12411, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12412, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12413, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12414, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12415, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12416, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12417, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12418, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12419, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12420, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 613, + "name": "shulker_box", + "translation_key": "block.minecraft.shulker_box", + "item_id": 500, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + } + ], + "default_state_id": 12425, + "states": [ + { + "id": 12421, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12422, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12423, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12424, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12425, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12426, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + } + ] + }, + { + "id": 614, + "name": "white_shulker_box", + "translation_key": "block.minecraft.white_shulker_box", + "item_id": 501, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + } + ], + "default_state_id": 12431, + "states": [ + { + "id": 12427, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12428, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12429, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12430, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12431, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12432, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + } + ] + }, + { + "id": 615, + "name": "orange_shulker_box", + "translation_key": "block.minecraft.orange_shulker_box", + "item_id": 502, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + } + ], + "default_state_id": 12437, + "states": [ + { + "id": 12433, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12434, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12435, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12436, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12437, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12438, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + } + ] + }, + { + "id": 616, + "name": "magenta_shulker_box", + "translation_key": "block.minecraft.magenta_shulker_box", + "item_id": 503, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + } + ], + "default_state_id": 12443, + "states": [ + { + "id": 12439, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12440, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12441, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12442, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12443, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12444, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + } + ] + }, + { + "id": 617, + "name": "light_blue_shulker_box", + "translation_key": "block.minecraft.light_blue_shulker_box", + "item_id": 504, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + } + ], + "default_state_id": 12449, + "states": [ + { + "id": 12445, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12446, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12447, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12448, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12449, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12450, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + } + ] + }, + { + "id": 618, + "name": "yellow_shulker_box", + "translation_key": "block.minecraft.yellow_shulker_box", + "item_id": 505, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + } + ], + "default_state_id": 12455, + "states": [ + { + "id": 12451, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12452, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12453, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12454, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12455, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12456, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + } + ] + }, + { + "id": 619, + "name": "lime_shulker_box", + "translation_key": "block.minecraft.lime_shulker_box", + "item_id": 506, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + } + ], + "default_state_id": 12461, + "states": [ + { + "id": 12457, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12458, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12459, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12460, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12461, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12462, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + } + ] + }, + { + "id": 620, + "name": "pink_shulker_box", + "translation_key": "block.minecraft.pink_shulker_box", + "item_id": 507, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + } + ], + "default_state_id": 12467, + "states": [ + { + "id": 12463, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12464, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12465, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12466, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12467, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12468, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + } + ] + }, + { + "id": 621, + "name": "gray_shulker_box", + "translation_key": "block.minecraft.gray_shulker_box", + "item_id": 508, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + } + ], + "default_state_id": 12473, + "states": [ + { + "id": 12469, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12470, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12471, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12472, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12473, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12474, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + } + ] + }, + { + "id": 622, + "name": "light_gray_shulker_box", + "translation_key": "block.minecraft.light_gray_shulker_box", + "item_id": 509, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + } + ], + "default_state_id": 12479, + "states": [ + { + "id": 12475, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12476, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12477, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12478, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12479, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12480, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + } + ] + }, + { + "id": 623, + "name": "cyan_shulker_box", + "translation_key": "block.minecraft.cyan_shulker_box", + "item_id": 510, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + } + ], + "default_state_id": 12485, + "states": [ + { + "id": 12481, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12482, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12483, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12484, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12485, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12486, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + } + ] + }, + { + "id": 624, + "name": "purple_shulker_box", + "translation_key": "block.minecraft.purple_shulker_box", + "item_id": 511, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + } + ], + "default_state_id": 12491, + "states": [ + { + "id": 12487, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12488, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12489, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12490, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12491, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12492, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + } + ] + }, + { + "id": 625, + "name": "blue_shulker_box", + "translation_key": "block.minecraft.blue_shulker_box", + "item_id": 512, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + } + ], + "default_state_id": 12497, + "states": [ + { + "id": 12493, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12494, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12495, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12496, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12497, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12498, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + } + ] + }, + { + "id": 626, + "name": "brown_shulker_box", + "translation_key": "block.minecraft.brown_shulker_box", + "item_id": 513, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + } + ], + "default_state_id": 12503, + "states": [ + { + "id": 12499, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12500, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12501, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12502, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12503, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12504, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + } + ] + }, + { + "id": 627, + "name": "green_shulker_box", + "translation_key": "block.minecraft.green_shulker_box", + "item_id": 514, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + } + ], + "default_state_id": 12509, + "states": [ + { + "id": 12505, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12506, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12507, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12508, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12509, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12510, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + } + ] + }, + { + "id": 628, + "name": "red_shulker_box", + "translation_key": "block.minecraft.red_shulker_box", + "item_id": 515, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + } + ], + "default_state_id": 12515, + "states": [ + { + "id": 12511, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12512, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12513, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12514, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12515, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12516, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + } + ] + }, + { + "id": 629, + "name": "black_shulker_box", + "translation_key": "block.minecraft.black_shulker_box", + "item_id": 516, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + } + ], + "default_state_id": 12521, + "states": [ + { + "id": 12517, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12518, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12519, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12520, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12521, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + }, + { + "id": 12522, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 23 + } + ] + }, + { + "id": 630, + "name": "white_glazed_terracotta", + "translation_key": "block.minecraft.white_glazed_terracotta", + "item_id": 517, + "hardness": 1.4, + "blast_resistance": 1.4, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 12523, + "states": [ + { + "id": 12523, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12524, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12525, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12526, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 631, + "name": "orange_glazed_terracotta", + "translation_key": "block.minecraft.orange_glazed_terracotta", + "item_id": 518, + "hardness": 1.4, + "blast_resistance": 1.4, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 12527, + "states": [ + { + "id": 12527, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12528, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12529, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12530, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 632, + "name": "magenta_glazed_terracotta", + "translation_key": "block.minecraft.magenta_glazed_terracotta", + "item_id": 519, + "hardness": 1.4, + "blast_resistance": 1.4, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 12531, + "states": [ + { + "id": 12531, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12532, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12533, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12534, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 633, + "name": "light_blue_glazed_terracotta", + "translation_key": "block.minecraft.light_blue_glazed_terracotta", + "item_id": 520, + "hardness": 1.4, + "blast_resistance": 1.4, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 12535, + "states": [ + { + "id": 12535, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12536, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12537, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12538, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 634, + "name": "yellow_glazed_terracotta", + "translation_key": "block.minecraft.yellow_glazed_terracotta", + "item_id": 521, + "hardness": 1.4, + "blast_resistance": 1.4, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 12539, + "states": [ + { + "id": 12539, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12540, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12541, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12542, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 635, + "name": "lime_glazed_terracotta", + "translation_key": "block.minecraft.lime_glazed_terracotta", + "item_id": 522, + "hardness": 1.4, + "blast_resistance": 1.4, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 12543, + "states": [ + { + "id": 12543, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12544, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12545, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12546, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 636, + "name": "pink_glazed_terracotta", + "translation_key": "block.minecraft.pink_glazed_terracotta", + "item_id": 523, + "hardness": 1.4, + "blast_resistance": 1.4, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 12547, + "states": [ + { + "id": 12547, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12548, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12549, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12550, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 637, + "name": "gray_glazed_terracotta", + "translation_key": "block.minecraft.gray_glazed_terracotta", + "item_id": 524, + "hardness": 1.4, + "blast_resistance": 1.4, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 12551, + "states": [ + { + "id": 12551, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12552, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12553, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12554, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 638, + "name": "light_gray_glazed_terracotta", + "translation_key": "block.minecraft.light_gray_glazed_terracotta", + "item_id": 525, + "hardness": 1.4, + "blast_resistance": 1.4, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 12555, + "states": [ + { + "id": 12555, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12556, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12557, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12558, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 639, + "name": "cyan_glazed_terracotta", + "translation_key": "block.minecraft.cyan_glazed_terracotta", + "item_id": 526, + "hardness": 1.4, + "blast_resistance": 1.4, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 12559, + "states": [ + { + "id": 12559, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12560, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12561, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12562, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 640, + "name": "purple_glazed_terracotta", + "translation_key": "block.minecraft.purple_glazed_terracotta", + "item_id": 527, + "hardness": 1.4, + "blast_resistance": 1.4, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 12563, + "states": [ + { + "id": 12563, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12564, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12565, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12566, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 641, + "name": "blue_glazed_terracotta", + "translation_key": "block.minecraft.blue_glazed_terracotta", + "item_id": 528, + "hardness": 1.4, + "blast_resistance": 1.4, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 12567, + "states": [ + { + "id": 12567, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12568, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12569, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12570, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 642, + "name": "brown_glazed_terracotta", + "translation_key": "block.minecraft.brown_glazed_terracotta", + "item_id": 529, + "hardness": 1.4, + "blast_resistance": 1.4, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 12571, + "states": [ + { + "id": 12571, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12572, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12573, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12574, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 643, + "name": "green_glazed_terracotta", + "translation_key": "block.minecraft.green_glazed_terracotta", + "item_id": 530, + "hardness": 1.4, + "blast_resistance": 1.4, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 12575, + "states": [ + { + "id": 12575, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12576, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12577, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12578, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 644, + "name": "red_glazed_terracotta", + "translation_key": "block.minecraft.red_glazed_terracotta", + "item_id": 531, + "hardness": 1.4, + "blast_resistance": 1.4, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 12579, + "states": [ + { + "id": 12579, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12580, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12581, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12582, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 645, + "name": "black_glazed_terracotta", + "translation_key": "block.minecraft.black_glazed_terracotta", + "item_id": 532, + "hardness": 1.4, + "blast_resistance": 1.4, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 12583, + "states": [ + { + "id": 12583, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12584, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12585, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 12586, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 646, + "name": "white_concrete", + "translation_key": "block.minecraft.white_concrete", + "item_id": 533, + "hardness": 1.8, + "blast_resistance": 1.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12587, + "states": [ + { + "id": 12587, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 647, + "name": "orange_concrete", + "translation_key": "block.minecraft.orange_concrete", + "item_id": 534, + "hardness": 1.8, + "blast_resistance": 1.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12588, + "states": [ + { + "id": 12588, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 648, + "name": "magenta_concrete", + "translation_key": "block.minecraft.magenta_concrete", + "item_id": 535, + "hardness": 1.8, + "blast_resistance": 1.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12589, + "states": [ + { + "id": 12589, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 649, + "name": "light_blue_concrete", + "translation_key": "block.minecraft.light_blue_concrete", + "item_id": 536, + "hardness": 1.8, + "blast_resistance": 1.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12590, + "states": [ + { + "id": 12590, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 650, + "name": "yellow_concrete", + "translation_key": "block.minecraft.yellow_concrete", + "item_id": 537, + "hardness": 1.8, + "blast_resistance": 1.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12591, + "states": [ + { + "id": 12591, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 651, + "name": "lime_concrete", + "translation_key": "block.minecraft.lime_concrete", + "item_id": 538, + "hardness": 1.8, + "blast_resistance": 1.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12592, + "states": [ + { + "id": 12592, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 652, + "name": "pink_concrete", + "translation_key": "block.minecraft.pink_concrete", + "item_id": 539, + "hardness": 1.8, + "blast_resistance": 1.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12593, + "states": [ + { + "id": 12593, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 653, + "name": "gray_concrete", + "translation_key": "block.minecraft.gray_concrete", + "item_id": 540, + "hardness": 1.8, + "blast_resistance": 1.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12594, + "states": [ + { + "id": 12594, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 654, + "name": "light_gray_concrete", + "translation_key": "block.minecraft.light_gray_concrete", + "item_id": 541, + "hardness": 1.8, + "blast_resistance": 1.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12595, + "states": [ + { + "id": 12595, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 655, + "name": "cyan_concrete", + "translation_key": "block.minecraft.cyan_concrete", + "item_id": 542, + "hardness": 1.8, + "blast_resistance": 1.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12596, + "states": [ + { + "id": 12596, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 656, + "name": "purple_concrete", + "translation_key": "block.minecraft.purple_concrete", + "item_id": 543, + "hardness": 1.8, + "blast_resistance": 1.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12597, + "states": [ + { + "id": 12597, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 657, + "name": "blue_concrete", + "translation_key": "block.minecraft.blue_concrete", + "item_id": 544, + "hardness": 1.8, + "blast_resistance": 1.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12598, + "states": [ + { + "id": 12598, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 658, + "name": "brown_concrete", + "translation_key": "block.minecraft.brown_concrete", + "item_id": 545, + "hardness": 1.8, + "blast_resistance": 1.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12599, + "states": [ + { + "id": 12599, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 659, + "name": "green_concrete", + "translation_key": "block.minecraft.green_concrete", + "item_id": 546, + "hardness": 1.8, + "blast_resistance": 1.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12600, + "states": [ + { + "id": 12600, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 660, + "name": "red_concrete", + "translation_key": "block.minecraft.red_concrete", + "item_id": 547, + "hardness": 1.8, + "blast_resistance": 1.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12601, + "states": [ + { + "id": 12601, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 661, + "name": "black_concrete", + "translation_key": "block.minecraft.black_concrete", + "item_id": 548, + "hardness": 1.8, + "blast_resistance": 1.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12602, + "states": [ + { + "id": 12602, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 662, + "name": "white_concrete_powder", + "translation_key": "block.minecraft.white_concrete_powder", + "item_id": 549, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12603, + "states": [ + { + "id": 12603, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 663, + "name": "orange_concrete_powder", + "translation_key": "block.minecraft.orange_concrete_powder", + "item_id": 550, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12604, + "states": [ + { + "id": 12604, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 664, + "name": "magenta_concrete_powder", + "translation_key": "block.minecraft.magenta_concrete_powder", + "item_id": 551, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12605, + "states": [ + { + "id": 12605, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 665, + "name": "light_blue_concrete_powder", + "translation_key": "block.minecraft.light_blue_concrete_powder", + "item_id": 552, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12606, + "states": [ + { + "id": 12606, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 666, + "name": "yellow_concrete_powder", + "translation_key": "block.minecraft.yellow_concrete_powder", + "item_id": 553, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12607, + "states": [ + { + "id": 12607, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 667, + "name": "lime_concrete_powder", + "translation_key": "block.minecraft.lime_concrete_powder", + "item_id": 554, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12608, + "states": [ + { + "id": 12608, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 668, + "name": "pink_concrete_powder", + "translation_key": "block.minecraft.pink_concrete_powder", + "item_id": 555, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12609, + "states": [ + { + "id": 12609, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 669, + "name": "gray_concrete_powder", + "translation_key": "block.minecraft.gray_concrete_powder", + "item_id": 556, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12610, + "states": [ + { + "id": 12610, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 670, + "name": "light_gray_concrete_powder", + "translation_key": "block.minecraft.light_gray_concrete_powder", + "item_id": 557, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12611, + "states": [ + { + "id": 12611, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 671, + "name": "cyan_concrete_powder", + "translation_key": "block.minecraft.cyan_concrete_powder", + "item_id": 558, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12612, + "states": [ + { + "id": 12612, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 672, + "name": "purple_concrete_powder", + "translation_key": "block.minecraft.purple_concrete_powder", + "item_id": 559, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12613, + "states": [ + { + "id": 12613, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 673, + "name": "blue_concrete_powder", + "translation_key": "block.minecraft.blue_concrete_powder", + "item_id": 560, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12614, + "states": [ + { + "id": 12614, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 674, + "name": "brown_concrete_powder", + "translation_key": "block.minecraft.brown_concrete_powder", + "item_id": 561, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12615, + "states": [ + { + "id": 12615, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 675, + "name": "green_concrete_powder", + "translation_key": "block.minecraft.green_concrete_powder", + "item_id": 562, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12616, + "states": [ + { + "id": 12616, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 676, + "name": "red_concrete_powder", + "translation_key": "block.minecraft.red_concrete_powder", + "item_id": 563, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12617, + "states": [ + { + "id": 12617, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 677, + "name": "black_concrete_powder", + "translation_key": "block.minecraft.black_concrete_powder", + "item_id": 564, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12618, + "states": [ + { + "id": 12618, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 678, + "name": "kelp", + "translation_key": "block.minecraft.kelp", + "item_id": 222, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "age", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24", + "25" + ] + } + ], + "default_state_id": 12619, + "states": [ + { + "id": 12619, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12620, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12621, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12622, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12623, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12624, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12625, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12626, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12627, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12628, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12629, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12630, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12631, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12632, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12633, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12634, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12635, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12636, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12637, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12638, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12639, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12640, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12641, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12642, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12643, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12644, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 679, + "name": "kelp_plant", + "translation_key": "block.minecraft.kelp_plant", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12645, + "states": [ + { + "id": 12645, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 680, + "name": "dried_kelp_block", + "translation_key": "block.minecraft.dried_kelp_block", + "item_id": 883, + "hardness": 0.5, + "blast_resistance": 2.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12646, + "states": [ + { + "id": 12646, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 681, + "name": "turtle_egg", + "translation_key": "block.minecraft.turtle_egg", + "item_id": 565, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "eggs", + "values": [ + "1", + "2", + "3", + "4" + ] + }, + { + "name": "hatch", + "values": [ + "0", + "1", + "2" + ] + } + ], + "default_state_id": 12647, + "states": [ + { + "id": 12647, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 222 + ] + }, + { + "id": 12648, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 222 + ] + }, + { + "id": 12649, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 222 + ] + }, + { + "id": 12650, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 223 + ] + }, + { + "id": 12651, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 223 + ] + }, + { + "id": 12652, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 223 + ] + }, + { + "id": 12653, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 223 + ] + }, + { + "id": 12654, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 223 + ] + }, + { + "id": 12655, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 223 + ] + }, + { + "id": 12656, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 223 + ] + }, + { + "id": 12657, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 223 + ] + }, + { + "id": 12658, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 223 + ] + } + ] + }, + { + "id": 682, + "name": "sniffer_egg", + "translation_key": "block.minecraft.sniffer_egg", + "item_id": 566, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "hatch", + "values": [ + "0", + "1", + "2" + ] + } + ], + "default_state_id": 12659, + "states": [ + { + "id": 12659, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 224 + ] + }, + { + "id": 12660, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 224 + ] + }, + { + "id": 12661, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 224 + ] + } + ] + }, + { + "id": 683, + "name": "dead_tube_coral_block", + "translation_key": "block.minecraft.dead_tube_coral_block", + "item_id": 567, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12662, + "states": [ + { + "id": 12662, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 684, + "name": "dead_brain_coral_block", + "translation_key": "block.minecraft.dead_brain_coral_block", + "item_id": 568, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12663, + "states": [ + { + "id": 12663, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 685, + "name": "dead_bubble_coral_block", + "translation_key": "block.minecraft.dead_bubble_coral_block", + "item_id": 569, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12664, + "states": [ + { + "id": 12664, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 686, + "name": "dead_fire_coral_block", + "translation_key": "block.minecraft.dead_fire_coral_block", + "item_id": 570, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12665, + "states": [ + { + "id": 12665, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 687, + "name": "dead_horn_coral_block", + "translation_key": "block.minecraft.dead_horn_coral_block", + "item_id": 571, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12666, + "states": [ + { + "id": 12666, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 688, + "name": "tube_coral_block", + "translation_key": "block.minecraft.tube_coral_block", + "item_id": 572, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12667, + "states": [ + { + "id": 12667, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 689, + "name": "brain_coral_block", + "translation_key": "block.minecraft.brain_coral_block", + "item_id": 573, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12668, + "states": [ + { + "id": 12668, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 690, + "name": "bubble_coral_block", + "translation_key": "block.minecraft.bubble_coral_block", + "item_id": 574, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12669, + "states": [ + { + "id": 12669, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 691, + "name": "fire_coral_block", + "translation_key": "block.minecraft.fire_coral_block", + "item_id": 575, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12670, + "states": [ + { + "id": 12670, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 692, + "name": "horn_coral_block", + "translation_key": "block.minecraft.horn_coral_block", + "item_id": 576, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12671, + "states": [ + { + "id": 12671, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 693, + "name": "dead_tube_coral", + "translation_key": "block.minecraft.dead_tube_coral", + "item_id": 586, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12672, + "states": [ + { + "id": 12672, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12673, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 694, + "name": "dead_brain_coral", + "translation_key": "block.minecraft.dead_brain_coral", + "item_id": 582, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12674, + "states": [ + { + "id": 12674, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12675, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 695, + "name": "dead_bubble_coral", + "translation_key": "block.minecraft.dead_bubble_coral", + "item_id": 583, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12676, + "states": [ + { + "id": 12676, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12677, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 696, + "name": "dead_fire_coral", + "translation_key": "block.minecraft.dead_fire_coral", + "item_id": 584, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12678, + "states": [ + { + "id": 12678, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12679, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 697, + "name": "dead_horn_coral", + "translation_key": "block.minecraft.dead_horn_coral", + "item_id": 585, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12680, + "states": [ + { + "id": 12680, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12681, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 698, + "name": "tube_coral", + "translation_key": "block.minecraft.tube_coral", + "item_id": 577, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12682, + "states": [ + { + "id": 12682, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12683, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 699, + "name": "brain_coral", + "translation_key": "block.minecraft.brain_coral", + "item_id": 578, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12684, + "states": [ + { + "id": 12684, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12685, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 700, + "name": "bubble_coral", + "translation_key": "block.minecraft.bubble_coral", + "item_id": 579, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12686, + "states": [ + { + "id": 12686, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12687, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 701, + "name": "fire_coral", + "translation_key": "block.minecraft.fire_coral", + "item_id": 580, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12688, + "states": [ + { + "id": 12688, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12689, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 702, + "name": "horn_coral", + "translation_key": "block.minecraft.horn_coral", + "item_id": 581, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12690, + "states": [ + { + "id": 12690, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12691, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 703, + "name": "dead_tube_coral_fan", + "translation_key": "block.minecraft.dead_tube_coral_fan", + "item_id": 592, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 713, + "properties": [ + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12692, + "states": [ + { + "id": 12692, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12693, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 704, + "name": "dead_brain_coral_fan", + "translation_key": "block.minecraft.dead_brain_coral_fan", + "item_id": 593, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 714, + "properties": [ + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12694, + "states": [ + { + "id": 12694, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12695, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 705, + "name": "dead_bubble_coral_fan", + "translation_key": "block.minecraft.dead_bubble_coral_fan", + "item_id": 594, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 715, + "properties": [ + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12696, + "states": [ + { + "id": 12696, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12697, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 706, + "name": "dead_fire_coral_fan", + "translation_key": "block.minecraft.dead_fire_coral_fan", + "item_id": 595, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 716, + "properties": [ + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12698, + "states": [ + { + "id": 12698, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12699, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 707, + "name": "dead_horn_coral_fan", + "translation_key": "block.minecraft.dead_horn_coral_fan", + "item_id": 596, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 717, + "properties": [ + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12700, + "states": [ + { + "id": 12700, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12701, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 708, + "name": "tube_coral_fan", + "translation_key": "block.minecraft.tube_coral_fan", + "item_id": 587, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 718, + "properties": [ + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12702, + "states": [ + { + "id": 12702, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12703, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 709, + "name": "brain_coral_fan", + "translation_key": "block.minecraft.brain_coral_fan", + "item_id": 588, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 719, + "properties": [ + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12704, + "states": [ + { + "id": 12704, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12705, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 710, + "name": "bubble_coral_fan", + "translation_key": "block.minecraft.bubble_coral_fan", + "item_id": 589, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 720, + "properties": [ + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12706, + "states": [ + { + "id": 12706, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12707, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 711, + "name": "fire_coral_fan", + "translation_key": "block.minecraft.fire_coral_fan", + "item_id": 590, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 721, + "properties": [ + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12708, + "states": [ + { + "id": 12708, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12709, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 712, + "name": "horn_coral_fan", + "translation_key": "block.minecraft.horn_coral_fan", + "item_id": 591, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 722, + "properties": [ + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12710, + "states": [ + { + "id": 12710, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12711, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 713, + "name": "dead_tube_coral_wall_fan", + "translation_key": "block.minecraft.dead_tube_coral_wall_fan", + "item_id": 592, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12712, + "states": [ + { + "id": 12712, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12713, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12714, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12715, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12716, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12717, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12718, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12719, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 714, + "name": "dead_brain_coral_wall_fan", + "translation_key": "block.minecraft.dead_brain_coral_wall_fan", + "item_id": 593, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12720, + "states": [ + { + "id": 12720, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12721, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12722, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12723, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12724, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12725, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12726, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12727, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 715, + "name": "dead_bubble_coral_wall_fan", + "translation_key": "block.minecraft.dead_bubble_coral_wall_fan", + "item_id": 594, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12728, + "states": [ + { + "id": 12728, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12729, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12730, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12731, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12732, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12733, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12734, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12735, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 716, + "name": "dead_fire_coral_wall_fan", + "translation_key": "block.minecraft.dead_fire_coral_wall_fan", + "item_id": 595, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12736, + "states": [ + { + "id": 12736, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12737, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12738, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12739, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12740, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12741, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12742, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12743, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 717, + "name": "dead_horn_coral_wall_fan", + "translation_key": "block.minecraft.dead_horn_coral_wall_fan", + "item_id": 596, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12744, + "states": [ + { + "id": 12744, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12745, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12746, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12747, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12748, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12749, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12750, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 12751, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 718, + "name": "tube_coral_wall_fan", + "translation_key": "block.minecraft.tube_coral_wall_fan", + "item_id": 587, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12752, + "states": [ + { + "id": 12752, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12753, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12754, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12755, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12756, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12757, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12758, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12759, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 719, + "name": "brain_coral_wall_fan", + "translation_key": "block.minecraft.brain_coral_wall_fan", + "item_id": 588, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12760, + "states": [ + { + "id": 12760, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12761, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12762, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12763, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12764, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12765, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12766, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12767, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 720, + "name": "bubble_coral_wall_fan", + "translation_key": "block.minecraft.bubble_coral_wall_fan", + "item_id": 589, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12768, + "states": [ + { + "id": 12768, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12769, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12770, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12771, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12772, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12773, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12774, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12775, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 721, + "name": "fire_coral_wall_fan", + "translation_key": "block.minecraft.fire_coral_wall_fan", + "item_id": 590, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12776, + "states": [ + { + "id": 12776, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12777, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12778, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12779, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12780, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12781, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12782, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12783, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 722, + "name": "horn_coral_wall_fan", + "translation_key": "block.minecraft.horn_coral_wall_fan", + "item_id": 591, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12784, + "states": [ + { + "id": 12784, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12785, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12786, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12787, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12788, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12789, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12790, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12791, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 723, + "name": "sea_pickle", + "translation_key": "block.minecraft.sea_pickle", + "item_id": 179, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "pickles", + "values": [ + "1", + "2", + "3", + "4" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12792, + "states": [ + { + "id": 12792, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 225 + ] + }, + { + "id": 12793, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 225 + ] + }, + { + "id": 12794, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 226 + ] + }, + { + "id": 12795, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 226 + ] + }, + { + "id": 12796, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 227 + ] + }, + { + "id": 12797, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 227 + ] + }, + { + "id": 12798, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 228 + ] + }, + { + "id": 12799, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 228 + ] + } + ] + }, + { + "id": 724, + "name": "blue_ice", + "translation_key": "block.minecraft.blue_ice", + "item_id": 597, + "hardness": 2.8, + "blast_resistance": 2.8, + "slipperiness": 0.989, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12800, + "states": [ + { + "id": 12800, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 725, + "name": "conduit", + "translation_key": "block.minecraft.conduit", + "item_id": 598, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12801, + "states": [ + { + "id": 12801, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 229 + ], + "block_entity_type": 25 + }, + { + "id": 12802, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 229 + ], + "block_entity_type": 25 + } + ] + }, + { + "id": 726, + "name": "bamboo_sapling", + "translation_key": "block.minecraft.bamboo_sapling", + "item_id": 0, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12803, + "states": [ + { + "id": 12803, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 727, + "name": "bamboo", + "translation_key": "block.minecraft.bamboo", + "item_id": 229, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "age", + "values": [ + "0", + "1" + ] + }, + { + "name": "leaves", + "values": [ + "none", + "small", + "large" + ] + }, + { + "name": "stage", + "values": [ + "0", + "1" + ] + } + ], + "default_state_id": 12804, + "states": [ + { + "id": 12804, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 230 + ] + }, + { + "id": 12805, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 230 + ] + }, + { + "id": 12806, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 230 + ] + }, + { + "id": 12807, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 230 + ] + }, + { + "id": 12808, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 230 + ] + }, + { + "id": 12809, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 230 + ] + }, + { + "id": 12810, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 230 + ] + }, + { + "id": 12811, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 230 + ] + }, + { + "id": 12812, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 230 + ] + }, + { + "id": 12813, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 230 + ] + }, + { + "id": 12814, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 230 + ] + }, + { + "id": 12815, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 230 + ] + } + ] + }, + { + "id": 728, + "name": "potted_bamboo", + "translation_key": "block.minecraft.potted_bamboo", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12816, + "states": [ + { + "id": 12816, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 729, + "name": "void_air", + "translation_key": "block.minecraft.void_air", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12817, + "states": [ + { + "id": 12817, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 730, + "name": "cave_air", + "translation_key": "block.minecraft.cave_air", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 12818, + "states": [ + { + "id": 12818, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 731, + "name": "bubble_column", + "translation_key": "block.minecraft.bubble_column", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "drag", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12819, + "states": [ + { + "id": 12819, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 12820, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 732, + "name": "polished_granite_stairs", + "translation_key": "block.minecraft.polished_granite_stairs", + "item_id": 599, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12832, + "states": [ + { + "id": 12821, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 12822, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 12823, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 12824, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 12825, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 12826, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 12827, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 12828, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 12829, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 12830, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 12831, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 12832, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 12833, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 12834, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 12835, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 12836, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 12837, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 12838, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 12839, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 12840, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 12841, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 12842, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 12843, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 12844, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 12845, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 12846, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 12847, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 12848, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 12849, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 12850, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 12851, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 12852, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 12853, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 12854, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 12855, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 12856, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 12857, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 12858, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 12859, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 12860, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 12861, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 12862, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 12863, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 12864, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 12865, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 12866, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 12867, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 12868, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 12869, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 12870, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 12871, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 12872, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 12873, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 12874, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 12875, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 12876, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 12877, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 12878, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 12879, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 12880, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 12881, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 12882, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 12883, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 12884, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 12885, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 12886, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 12887, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 12888, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 12889, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 12890, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 12891, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 12892, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 12893, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 12894, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 12895, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 12896, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 12897, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 12898, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 12899, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 12900, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 733, + "name": "smooth_red_sandstone_stairs", + "translation_key": "block.minecraft.smooth_red_sandstone_stairs", + "item_id": 600, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12912, + "states": [ + { + "id": 12901, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 12902, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 12903, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 12904, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 12905, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 12906, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 12907, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 12908, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 12909, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 12910, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 12911, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 12912, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 12913, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 12914, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 12915, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 12916, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 12917, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 12918, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 12919, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 12920, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 12921, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 12922, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 12923, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 12924, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 12925, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 12926, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 12927, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 12928, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 12929, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 12930, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 12931, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 12932, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 12933, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 12934, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 12935, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 12936, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 12937, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 12938, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 12939, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 12940, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 12941, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 12942, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 12943, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 12944, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 12945, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 12946, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 12947, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 12948, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 12949, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 12950, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 12951, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 12952, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 12953, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 12954, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 12955, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 12956, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 12957, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 12958, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 12959, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 12960, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 12961, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 12962, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 12963, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 12964, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 12965, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 12966, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 12967, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 12968, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 12969, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 12970, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 12971, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 12972, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 12973, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 12974, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 12975, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 12976, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 12977, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 12978, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 12979, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 12980, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 734, + "name": "mossy_stone_brick_stairs", + "translation_key": "block.minecraft.mossy_stone_brick_stairs", + "item_id": 601, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 12992, + "states": [ + { + "id": 12981, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 12982, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 12983, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 12984, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 12985, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 12986, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 12987, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 12988, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 12989, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 12990, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 12991, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 12992, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 12993, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 12994, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 12995, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 12996, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 12997, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 12998, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 12999, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13000, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13001, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 13002, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 13003, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13004, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13005, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13006, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13007, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13008, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13009, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13010, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13011, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 13012, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 13013, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13014, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13015, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13016, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13017, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13018, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13019, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13020, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13021, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 13022, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 13023, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13024, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13025, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13026, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13027, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13028, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13029, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13030, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13031, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 13032, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 13033, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13034, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13035, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13036, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13037, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13038, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13039, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13040, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13041, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 13042, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 13043, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13044, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13045, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13046, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13047, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13048, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13049, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13050, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13051, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 13052, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 13053, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13054, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13055, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13056, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13057, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13058, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13059, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13060, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 735, + "name": "polished_diorite_stairs", + "translation_key": "block.minecraft.polished_diorite_stairs", + "item_id": 602, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 13072, + "states": [ + { + "id": 13061, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 13062, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 13063, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13064, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13065, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13066, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13067, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13068, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13069, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13070, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13071, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 13072, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 13073, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13074, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13075, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13076, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13077, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13078, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13079, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13080, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13081, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 13082, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 13083, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13084, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13085, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13086, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13087, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13088, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13089, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13090, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13091, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 13092, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 13093, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13094, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13095, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13096, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13097, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13098, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13099, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13100, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13101, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 13102, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 13103, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13104, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13105, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13106, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13107, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13108, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13109, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13110, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13111, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 13112, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 13113, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13114, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13115, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13116, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13117, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13118, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13119, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13120, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13121, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 13122, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 13123, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13124, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13125, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13126, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13127, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13128, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13129, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13130, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13131, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 13132, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 13133, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13134, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13135, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13136, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13137, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13138, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13139, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13140, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 736, + "name": "mossy_cobblestone_stairs", + "translation_key": "block.minecraft.mossy_cobblestone_stairs", + "item_id": 603, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 13152, + "states": [ + { + "id": 13141, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 13142, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 13143, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13144, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13145, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13146, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13147, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13148, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13149, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13150, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13151, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 13152, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 13153, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13154, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13155, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13156, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13157, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13158, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13159, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13160, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13161, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 13162, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 13163, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13164, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13165, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13166, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13167, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13168, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13169, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13170, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13171, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 13172, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 13173, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13174, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13175, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13176, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13177, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13178, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13179, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13180, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13181, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 13182, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 13183, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13184, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13185, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13186, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13187, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13188, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13189, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13190, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13191, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 13192, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 13193, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13194, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13195, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13196, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13197, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13198, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13199, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13200, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13201, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 13202, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 13203, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13204, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13205, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13206, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13207, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13208, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13209, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13210, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13211, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 13212, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 13213, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13214, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13215, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13216, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13217, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13218, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13219, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13220, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 737, + "name": "end_stone_brick_stairs", + "translation_key": "block.minecraft.end_stone_brick_stairs", + "item_id": 604, + "hardness": 3.0, + "blast_resistance": 9.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 13232, + "states": [ + { + "id": 13221, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 13222, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 13223, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13224, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13225, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13226, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13227, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13228, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13229, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13230, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13231, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 13232, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 13233, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13234, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13235, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13236, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13237, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13238, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13239, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13240, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13241, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 13242, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 13243, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13244, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13245, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13246, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13247, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13248, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13249, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13250, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13251, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 13252, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 13253, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13254, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13255, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13256, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13257, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13258, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13259, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13260, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13261, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 13262, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 13263, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13264, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13265, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13266, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13267, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13268, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13269, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13270, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13271, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 13272, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 13273, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13274, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13275, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13276, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13277, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13278, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13279, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13280, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13281, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 13282, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 13283, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13284, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13285, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13286, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13287, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13288, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13289, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13290, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13291, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 13292, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 13293, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13294, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13295, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13296, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13297, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13298, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13299, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13300, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 738, + "name": "stone_stairs", + "translation_key": "block.minecraft.stone_stairs", + "item_id": 605, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 13312, + "states": [ + { + "id": 13301, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 13302, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 13303, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13304, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13305, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13306, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13307, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13308, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13309, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13310, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13311, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 13312, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 13313, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13314, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13315, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13316, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13317, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13318, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13319, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13320, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13321, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 13322, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 13323, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13324, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13325, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13326, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13327, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13328, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13329, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13330, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13331, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 13332, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 13333, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13334, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13335, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13336, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13337, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13338, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13339, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13340, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13341, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 13342, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 13343, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13344, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13345, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13346, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13347, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13348, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13349, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13350, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13351, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 13352, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 13353, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13354, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13355, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13356, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13357, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13358, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13359, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13360, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13361, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 13362, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 13363, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13364, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13365, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13366, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13367, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13368, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13369, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13370, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13371, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 13372, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 13373, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13374, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13375, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13376, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13377, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13378, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13379, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13380, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 739, + "name": "smooth_sandstone_stairs", + "translation_key": "block.minecraft.smooth_sandstone_stairs", + "item_id": 606, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 13392, + "states": [ + { + "id": 13381, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 13382, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 13383, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13384, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13385, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13386, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13387, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13388, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13389, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13390, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13391, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 13392, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 13393, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13394, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13395, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13396, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13397, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13398, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13399, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13400, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13401, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 13402, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 13403, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13404, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13405, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13406, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13407, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13408, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13409, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13410, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13411, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 13412, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 13413, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13414, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13415, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13416, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13417, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13418, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13419, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13420, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13421, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 13422, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 13423, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13424, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13425, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13426, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13427, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13428, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13429, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13430, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13431, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 13432, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 13433, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13434, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13435, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13436, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13437, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13438, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13439, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13440, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13441, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 13442, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 13443, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13444, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13445, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13446, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13447, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13448, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13449, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13450, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13451, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 13452, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 13453, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13454, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13455, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13456, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13457, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13458, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13459, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13460, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 740, + "name": "smooth_quartz_stairs", + "translation_key": "block.minecraft.smooth_quartz_stairs", + "item_id": 607, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 13472, + "states": [ + { + "id": 13461, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 13462, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 13463, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13464, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13465, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13466, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13467, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13468, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13469, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13470, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13471, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 13472, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 13473, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13474, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13475, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13476, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13477, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13478, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13479, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13480, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13481, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 13482, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 13483, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13484, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13485, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13486, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13487, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13488, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13489, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13490, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13491, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 13492, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 13493, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13494, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13495, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13496, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13497, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13498, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13499, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13500, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13501, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 13502, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 13503, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13504, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13505, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13506, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13507, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13508, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13509, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13510, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13511, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 13512, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 13513, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13514, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13515, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13516, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13517, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13518, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13519, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13520, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13521, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 13522, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 13523, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13524, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13525, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13526, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13527, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13528, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13529, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13530, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13531, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 13532, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 13533, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13534, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13535, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13536, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13537, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13538, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13539, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13540, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 741, + "name": "granite_stairs", + "translation_key": "block.minecraft.granite_stairs", + "item_id": 608, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 13552, + "states": [ + { + "id": 13541, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 13542, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 13543, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13544, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13545, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13546, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13547, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13548, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13549, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13550, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13551, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 13552, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 13553, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13554, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13555, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13556, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13557, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13558, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13559, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13560, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13561, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 13562, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 13563, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13564, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13565, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13566, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13567, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13568, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13569, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13570, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13571, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 13572, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 13573, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13574, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13575, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13576, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13577, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13578, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13579, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13580, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13581, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 13582, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 13583, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13584, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13585, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13586, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13587, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13588, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13589, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13590, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13591, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 13592, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 13593, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13594, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13595, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13596, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13597, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13598, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13599, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13600, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13601, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 13602, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 13603, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13604, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13605, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13606, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13607, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13608, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13609, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13610, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13611, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 13612, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 13613, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13614, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13615, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13616, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13617, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13618, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13619, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13620, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 742, + "name": "andesite_stairs", + "translation_key": "block.minecraft.andesite_stairs", + "item_id": 609, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 13632, + "states": [ + { + "id": 13621, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 13622, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 13623, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13624, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13625, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13626, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13627, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13628, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13629, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13630, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13631, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 13632, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 13633, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13634, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13635, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13636, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13637, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13638, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13639, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13640, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13641, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 13642, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 13643, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13644, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13645, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13646, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13647, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13648, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13649, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13650, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13651, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 13652, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 13653, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13654, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13655, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13656, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13657, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13658, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13659, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13660, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13661, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 13662, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 13663, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13664, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13665, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13666, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13667, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13668, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13669, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13670, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13671, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 13672, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 13673, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13674, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13675, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13676, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13677, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13678, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13679, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13680, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13681, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 13682, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 13683, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13684, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13685, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13686, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13687, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13688, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13689, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13690, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13691, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 13692, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 13693, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13694, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13695, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13696, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13697, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13698, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13699, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13700, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 743, + "name": "red_nether_brick_stairs", + "translation_key": "block.minecraft.red_nether_brick_stairs", + "item_id": 610, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 13712, + "states": [ + { + "id": 13701, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 13702, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 13703, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13704, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13705, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13706, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13707, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13708, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13709, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13710, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13711, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 13712, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 13713, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13714, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13715, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13716, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13717, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13718, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13719, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13720, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13721, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 13722, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 13723, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13724, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13725, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13726, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13727, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13728, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13729, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13730, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13731, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 13732, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 13733, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13734, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13735, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13736, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13737, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13738, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13739, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13740, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13741, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 13742, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 13743, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13744, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13745, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13746, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13747, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13748, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13749, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13750, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13751, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 13752, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 13753, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13754, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13755, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13756, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13757, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13758, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13759, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13760, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13761, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 13762, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 13763, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13764, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13765, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13766, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13767, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13768, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13769, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13770, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13771, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 13772, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 13773, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13774, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13775, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13776, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13777, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13778, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13779, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13780, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 744, + "name": "polished_andesite_stairs", + "translation_key": "block.minecraft.polished_andesite_stairs", + "item_id": 611, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 13792, + "states": [ + { + "id": 13781, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 13782, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 13783, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13784, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13785, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13786, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13787, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13788, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13789, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13790, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13791, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 13792, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 13793, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13794, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13795, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13796, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13797, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13798, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13799, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13800, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13801, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 13802, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 13803, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13804, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13805, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13806, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13807, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13808, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13809, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13810, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13811, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 13812, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 13813, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13814, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13815, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13816, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13817, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13818, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13819, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13820, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13821, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 13822, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 13823, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13824, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13825, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13826, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13827, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13828, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13829, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13830, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13831, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 13832, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 13833, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13834, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13835, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13836, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13837, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13838, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13839, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13840, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13841, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 13842, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 13843, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13844, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13845, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13846, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13847, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13848, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13849, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13850, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13851, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 13852, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 13853, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13854, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13855, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13856, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13857, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13858, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13859, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13860, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 745, + "name": "diorite_stairs", + "translation_key": "block.minecraft.diorite_stairs", + "item_id": 612, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 13872, + "states": [ + { + "id": 13861, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 13862, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 13863, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13864, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13865, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13866, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13867, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13868, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13869, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13870, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13871, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 13872, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 13873, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13874, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13875, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13876, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13877, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13878, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13879, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13880, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13881, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 13882, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 13883, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13884, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13885, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13886, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13887, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13888, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13889, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13890, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13891, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 13892, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 13893, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13894, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13895, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13896, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13897, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13898, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13899, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13900, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13901, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 13902, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 13903, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13904, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 13905, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13906, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 13907, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13908, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 13909, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13910, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 13911, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 13912, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 13913, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13914, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 13915, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13916, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 13917, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13918, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 13919, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13920, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 13921, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 13922, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 13923, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13924, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 13925, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13926, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 13927, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13928, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 13929, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13930, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 13931, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 13932, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 13933, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13934, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 13935, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13936, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 13937, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13938, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 13939, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 13940, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 746, + "name": "polished_granite_slab", + "translation_key": "block.minecraft.polished_granite_slab", + "item_id": 617, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 13944, + "states": [ + { + "id": 13941, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 13942, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 13943, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 13944, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 13945, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 13946, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 747, + "name": "smooth_red_sandstone_slab", + "translation_key": "block.minecraft.smooth_red_sandstone_slab", + "item_id": 618, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 13950, + "states": [ + { + "id": 13947, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 13948, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 13949, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 13950, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 13951, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 13952, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 748, + "name": "mossy_stone_brick_slab", + "translation_key": "block.minecraft.mossy_stone_brick_slab", + "item_id": 619, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 13956, + "states": [ + { + "id": 13953, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 13954, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 13955, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 13956, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 13957, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 13958, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 749, + "name": "polished_diorite_slab", + "translation_key": "block.minecraft.polished_diorite_slab", + "item_id": 620, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 13962, + "states": [ + { + "id": 13959, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 13960, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 13961, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 13962, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 13963, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 13964, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 750, + "name": "mossy_cobblestone_slab", + "translation_key": "block.minecraft.mossy_cobblestone_slab", + "item_id": 621, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 13968, + "states": [ + { + "id": 13965, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 13966, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 13967, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 13968, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 13969, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 13970, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 751, + "name": "end_stone_brick_slab", + "translation_key": "block.minecraft.end_stone_brick_slab", + "item_id": 622, + "hardness": 3.0, + "blast_resistance": 9.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 13974, + "states": [ + { + "id": 13971, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 13972, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 13973, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 13974, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 13975, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 13976, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 752, + "name": "smooth_sandstone_slab", + "translation_key": "block.minecraft.smooth_sandstone_slab", + "item_id": 623, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 13980, + "states": [ + { + "id": 13977, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 13978, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 13979, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 13980, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 13981, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 13982, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 753, + "name": "smooth_quartz_slab", + "translation_key": "block.minecraft.smooth_quartz_slab", + "item_id": 624, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 13986, + "states": [ + { + "id": 13983, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 13984, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 13985, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 13986, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 13987, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 13988, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 754, + "name": "granite_slab", + "translation_key": "block.minecraft.granite_slab", + "item_id": 625, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 13992, + "states": [ + { + "id": 13989, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 13990, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 13991, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 13992, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 13993, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 13994, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 755, + "name": "andesite_slab", + "translation_key": "block.minecraft.andesite_slab", + "item_id": 626, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 13998, + "states": [ + { + "id": 13995, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 13996, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 13997, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 13998, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 13999, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 14000, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 756, + "name": "red_nether_brick_slab", + "translation_key": "block.minecraft.red_nether_brick_slab", + "item_id": 627, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 14004, + "states": [ + { + "id": 14001, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 14002, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 14003, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 14004, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 14005, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 14006, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 757, + "name": "polished_andesite_slab", + "translation_key": "block.minecraft.polished_andesite_slab", + "item_id": 628, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 14010, + "states": [ + { + "id": 14007, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 14008, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 14009, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 14010, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 14011, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 14012, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 758, + "name": "diorite_slab", + "translation_key": "block.minecraft.diorite_slab", + "item_id": 629, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 14016, + "states": [ + { + "id": 14013, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 14014, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 14015, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 14016, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 14017, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 14018, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 759, + "name": "brick_wall", + "translation_key": "block.minecraft.brick_wall", + "item_id": 377, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "north", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "south", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "none", + "low", + "tall" + ] + } + ], + "default_state_id": 14022, + "states": [ + { + "id": 14019, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 14020, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 14021, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 14022, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 14023, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 14024, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 14025, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 14026, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 14027, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 14028, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 14029, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 14030, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 14031, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 14032, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 14033, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 14034, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 14035, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 14036, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 14037, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 14038, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 14039, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 14040, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 14041, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 14042, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 14043, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 14044, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 14045, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 14046, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 14047, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 14048, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 14049, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 14050, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 14051, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 14052, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 14053, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 14054, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 14055, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 14056, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 14057, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 14058, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 14059, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 14060, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 14061, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 14062, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 14063, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 14064, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 14065, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 14066, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 14067, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 14068, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14069, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14070, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 14071, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14072, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14073, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 14074, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14075, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14076, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 14077, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14078, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14079, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 14080, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14081, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14082, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 14083, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14084, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14085, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 14086, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14087, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14088, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 14089, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14090, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14091, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 14092, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 14093, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 14094, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 14095, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 14096, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 14097, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 14098, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 14099, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 14100, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 14101, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 14102, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 14103, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 14104, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14105, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14106, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 14107, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14108, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14109, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 14110, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14111, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14112, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 14113, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14114, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14115, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 14116, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14117, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14118, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 14119, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14120, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14121, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 14122, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14123, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14124, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 14125, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14126, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14127, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 14128, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 14129, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 14130, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 14131, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 14132, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 14133, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 14134, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 14135, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 14136, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 14137, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 14138, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 14139, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 14140, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14141, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14142, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 14143, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14144, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14145, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 14146, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14147, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14148, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 14149, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14150, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14151, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 14152, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14153, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14154, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 14155, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14156, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14157, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 14158, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14159, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14160, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 14161, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14162, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14163, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 14164, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14165, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14166, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 14167, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14168, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14169, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 14170, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14171, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14172, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 14173, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14174, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14175, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14176, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14177, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14178, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14179, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14180, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14181, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14182, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14183, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14184, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14185, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14186, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14187, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14188, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14189, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14190, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14191, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14192, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14193, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14194, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14195, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14196, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14197, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14198, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14199, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 14200, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14201, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14202, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 14203, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14204, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14205, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 14206, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14207, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14208, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 14209, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14210, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14211, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14212, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14213, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14214, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14215, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14216, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14217, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14218, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14219, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14220, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14221, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14222, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14223, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14224, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14225, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14226, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14227, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14228, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14229, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14230, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14231, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14232, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14233, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14234, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14235, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 14236, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 14237, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 14238, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 14239, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 14240, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 14241, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 14242, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 14243, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 14244, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 14245, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 14246, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 14247, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 14248, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14249, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14250, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 14251, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14252, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14253, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 14254, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14255, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14256, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 14257, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14258, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14259, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 14260, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14261, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14262, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 14263, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14264, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14265, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 14266, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14267, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14268, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 14269, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14270, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14271, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 14272, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14273, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14274, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 14275, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14276, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14277, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 14278, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14279, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14280, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 14281, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14282, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14283, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14284, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14285, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14286, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14287, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14288, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14289, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14290, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14291, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14292, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14293, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14294, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14295, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14296, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14297, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14298, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14299, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14300, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14301, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14302, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14303, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14304, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14305, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14306, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14307, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 14308, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14309, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14310, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 14311, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14312, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14313, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 14314, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14315, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14316, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 14317, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14318, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14319, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14320, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14321, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14322, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14323, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14324, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14325, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14326, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14327, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14328, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14329, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14330, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14331, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14332, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14333, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14334, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14335, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14336, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14337, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14338, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14339, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14340, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14341, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14342, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + } + ] + }, + { + "id": 760, + "name": "prismarine_wall", + "translation_key": "block.minecraft.prismarine_wall", + "item_id": 378, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "north", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "south", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "none", + "low", + "tall" + ] + } + ], + "default_state_id": 14346, + "states": [ + { + "id": 14343, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 14344, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 14345, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 14346, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 14347, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 14348, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 14349, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 14350, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 14351, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 14352, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 14353, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 14354, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 14355, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 14356, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 14357, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 14358, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 14359, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 14360, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 14361, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 14362, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 14363, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 14364, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 14365, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 14366, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 14367, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 14368, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 14369, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 14370, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 14371, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 14372, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 14373, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 14374, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 14375, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 14376, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 14377, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 14378, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 14379, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 14380, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 14381, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 14382, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 14383, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 14384, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 14385, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 14386, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 14387, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 14388, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 14389, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 14390, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 14391, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 14392, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14393, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14394, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 14395, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14396, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14397, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 14398, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14399, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14400, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 14401, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14402, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14403, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 14404, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14405, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14406, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 14407, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14408, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14409, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 14410, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14411, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14412, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 14413, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14414, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14415, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 14416, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 14417, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 14418, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 14419, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 14420, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 14421, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 14422, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 14423, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 14424, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 14425, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 14426, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 14427, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 14428, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14429, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14430, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 14431, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14432, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14433, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 14434, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14435, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14436, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 14437, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14438, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14439, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 14440, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14441, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14442, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 14443, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14444, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14445, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 14446, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14447, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14448, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 14449, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14450, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14451, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 14452, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 14453, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 14454, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 14455, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 14456, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 14457, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 14458, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 14459, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 14460, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 14461, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 14462, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 14463, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 14464, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14465, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14466, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 14467, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14468, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14469, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 14470, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14471, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14472, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 14473, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14474, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14475, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 14476, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14477, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14478, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 14479, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14480, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14481, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 14482, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14483, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14484, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 14485, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14486, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14487, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 14488, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14489, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14490, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 14491, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14492, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14493, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 14494, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14495, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14496, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 14497, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14498, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14499, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14500, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14501, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14502, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14503, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14504, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14505, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14506, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14507, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14508, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14509, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14510, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14511, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14512, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14513, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14514, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14515, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14516, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14517, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14518, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14519, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14520, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14521, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14522, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14523, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 14524, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14525, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14526, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 14527, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14528, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14529, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 14530, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14531, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14532, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 14533, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14534, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14535, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14536, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14537, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14538, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14539, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14540, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14541, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14542, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14543, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14544, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14545, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14546, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14547, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14548, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14549, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14550, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14551, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14552, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14553, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14554, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14555, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14556, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14557, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14558, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14559, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 14560, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 14561, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 14562, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 14563, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 14564, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 14565, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 14566, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 14567, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 14568, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 14569, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 14570, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 14571, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 14572, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14573, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14574, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 14575, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14576, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14577, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 14578, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14579, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14580, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 14581, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14582, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14583, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 14584, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14585, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14586, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 14587, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14588, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14589, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 14590, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14591, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14592, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 14593, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14594, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14595, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 14596, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14597, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14598, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 14599, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14600, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14601, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 14602, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14603, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14604, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 14605, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14606, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14607, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14608, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14609, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14610, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14611, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14612, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14613, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14614, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14615, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14616, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14617, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14618, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14619, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14620, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14621, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14622, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14623, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14624, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14625, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14626, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14627, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14628, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14629, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14630, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14631, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 14632, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14633, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14634, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 14635, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14636, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14637, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 14638, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14639, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14640, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 14641, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14642, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14643, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14644, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14645, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14646, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14647, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14648, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14649, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14650, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14651, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14652, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14653, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14654, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14655, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14656, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14657, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14658, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14659, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14660, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14661, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14662, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14663, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14664, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14665, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14666, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + } + ] + }, + { + "id": 761, + "name": "red_sandstone_wall", + "translation_key": "block.minecraft.red_sandstone_wall", + "item_id": 379, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "north", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "south", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "none", + "low", + "tall" + ] + } + ], + "default_state_id": 14670, + "states": [ + { + "id": 14667, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 14668, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 14669, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 14670, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 14671, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 14672, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 14673, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 14674, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 14675, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 14676, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 14677, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 14678, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 14679, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 14680, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 14681, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 14682, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 14683, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 14684, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 14685, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 14686, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 14687, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 14688, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 14689, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 14690, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 14691, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 14692, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 14693, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 14694, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 14695, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 14696, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 14697, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 14698, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 14699, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 14700, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 14701, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 14702, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 14703, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 14704, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 14705, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 14706, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 14707, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 14708, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 14709, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 14710, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 14711, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 14712, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 14713, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 14714, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 14715, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 14716, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14717, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14718, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 14719, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14720, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14721, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 14722, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14723, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14724, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 14725, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14726, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14727, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 14728, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14729, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14730, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 14731, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14732, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14733, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 14734, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14735, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14736, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 14737, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14738, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14739, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 14740, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 14741, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 14742, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 14743, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 14744, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 14745, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 14746, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 14747, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 14748, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 14749, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 14750, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 14751, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 14752, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14753, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14754, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 14755, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14756, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14757, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 14758, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14759, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14760, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 14761, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14762, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14763, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 14764, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14765, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14766, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 14767, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14768, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14769, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 14770, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14771, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14772, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 14773, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14774, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 14775, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 14776, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 14777, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 14778, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 14779, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 14780, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 14781, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 14782, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 14783, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 14784, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 14785, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 14786, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 14787, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 14788, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14789, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14790, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 14791, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14792, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14793, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 14794, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14795, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14796, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 14797, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14798, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14799, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 14800, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14801, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14802, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 14803, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14804, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14805, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 14806, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14807, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14808, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 14809, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14810, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14811, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 14812, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14813, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14814, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 14815, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14816, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14817, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 14818, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14819, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14820, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 14821, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14822, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14823, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14824, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14825, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14826, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14827, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14828, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14829, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14830, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14831, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14832, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14833, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14834, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14835, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14836, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14837, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14838, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14839, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14840, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14841, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14842, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14843, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14844, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14845, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14846, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14847, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 14848, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14849, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14850, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 14851, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14852, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14853, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 14854, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14855, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14856, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 14857, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14858, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14859, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14860, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14861, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14862, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14863, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14864, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14865, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14866, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14867, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14868, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14869, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14870, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14871, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14872, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14873, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14874, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14875, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14876, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14877, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14878, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14879, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14880, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14881, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14882, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14883, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 14884, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 14885, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 14886, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 14887, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 14888, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 14889, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 14890, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 14891, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 14892, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 14893, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 14894, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 14895, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 14896, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14897, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14898, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 14899, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14900, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14901, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 14902, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14903, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14904, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 14905, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14906, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14907, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 14908, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14909, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14910, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 14911, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14912, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 14913, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 14914, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14915, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14916, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 14917, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14918, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 14919, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 14920, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14921, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14922, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 14923, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14924, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14925, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 14926, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14927, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14928, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 14929, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14930, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14931, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14932, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14933, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14934, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14935, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14936, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14937, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14938, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14939, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14940, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14941, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14942, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14943, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14944, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14945, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14946, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14947, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14948, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14949, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14950, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14951, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14952, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14953, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14954, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14955, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 14956, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14957, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14958, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 14959, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14960, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 14961, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 14962, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14963, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14964, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 14965, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14966, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 14967, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14968, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14969, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14970, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14971, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14972, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14973, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14974, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14975, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14976, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14977, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14978, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14979, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14980, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14981, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14982, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 14983, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14984, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 14985, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14986, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14987, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14988, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 14989, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 14990, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + } + ] + }, + { + "id": 762, + "name": "mossy_stone_brick_wall", + "translation_key": "block.minecraft.mossy_stone_brick_wall", + "item_id": 380, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "north", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "south", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "none", + "low", + "tall" + ] + } + ], + "default_state_id": 14994, + "states": [ + { + "id": 14991, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 14992, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 14993, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 14994, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 14995, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 14996, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 14997, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 14998, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 14999, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 15000, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 15001, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 15002, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 15003, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 15004, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15005, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15006, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 15007, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15008, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15009, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 15010, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15011, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15012, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 15013, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15014, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15015, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 15016, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15017, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15018, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 15019, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15020, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15021, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 15022, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15023, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15024, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 15025, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15026, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15027, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 15028, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 15029, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 15030, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 15031, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 15032, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 15033, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 15034, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 15035, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 15036, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 15037, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 15038, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 15039, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 15040, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15041, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15042, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 15043, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15044, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15045, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 15046, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15047, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15048, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 15049, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15050, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15051, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 15052, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15053, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15054, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 15055, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15056, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15057, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 15058, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15059, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15060, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 15061, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15062, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15063, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 15064, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 15065, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 15066, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 15067, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 15068, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 15069, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 15070, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 15071, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 15072, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 15073, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 15074, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 15075, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 15076, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15077, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15078, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 15079, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15080, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15081, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 15082, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15083, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15084, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 15085, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15086, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15087, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 15088, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15089, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15090, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 15091, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15092, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15093, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 15094, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15095, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15096, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 15097, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15098, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15099, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 15100, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 15101, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 15102, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 15103, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 15104, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 15105, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 15106, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 15107, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 15108, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 15109, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 15110, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 15111, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 15112, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15113, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15114, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 15115, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15116, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15117, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 15118, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15119, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15120, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 15121, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15122, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15123, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 15124, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15125, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15126, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 15127, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15128, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15129, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 15130, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15131, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15132, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 15133, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15134, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15135, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 15136, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15137, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15138, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 15139, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15140, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15141, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 15142, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15143, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15144, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 15145, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15146, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15147, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15148, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15149, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15150, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15151, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15152, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15153, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15154, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15155, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15156, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15157, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15158, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15159, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15160, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15161, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15162, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15163, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15164, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15165, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15166, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15167, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15168, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15169, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15170, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15171, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 15172, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15173, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15174, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 15175, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15176, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15177, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 15178, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15179, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15180, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 15181, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15182, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15183, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15184, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15185, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15186, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15187, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15188, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15189, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15190, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15191, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15192, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15193, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15194, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15195, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15196, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15197, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15198, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15199, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15200, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15201, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15202, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15203, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15204, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15205, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15206, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15207, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 15208, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 15209, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 15210, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 15211, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 15212, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 15213, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 15214, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 15215, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 15216, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 15217, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 15218, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 15219, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 15220, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15221, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15222, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 15223, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15224, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15225, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 15226, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15227, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15228, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 15229, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15230, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15231, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 15232, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15233, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15234, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 15235, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15236, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15237, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 15238, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15239, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15240, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 15241, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15242, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15243, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 15244, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15245, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15246, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 15247, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15248, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15249, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 15250, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15251, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15252, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 15253, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15254, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15255, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15256, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15257, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15258, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15259, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15260, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15261, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15262, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15263, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15264, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15265, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15266, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15267, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15268, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15269, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15270, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15271, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15272, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15273, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15274, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15275, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15276, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15277, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15278, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15279, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 15280, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15281, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15282, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 15283, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15284, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15285, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 15286, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15287, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15288, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 15289, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15290, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15291, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15292, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15293, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15294, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15295, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15296, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15297, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15298, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15299, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15300, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15301, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15302, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15303, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15304, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15305, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15306, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15307, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15308, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15309, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15310, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15311, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15312, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15313, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15314, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + } + ] + }, + { + "id": 763, + "name": "granite_wall", + "translation_key": "block.minecraft.granite_wall", + "item_id": 381, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "north", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "south", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "none", + "low", + "tall" + ] + } + ], + "default_state_id": 15318, + "states": [ + { + "id": 15315, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 15316, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 15317, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 15318, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 15319, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 15320, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 15321, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 15322, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 15323, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 15324, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 15325, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 15326, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 15327, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 15328, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15329, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15330, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 15331, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15332, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15333, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 15334, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15335, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15336, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 15337, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15338, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15339, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 15340, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15341, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15342, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 15343, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15344, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15345, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 15346, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15347, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15348, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 15349, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15350, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15351, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 15352, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 15353, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 15354, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 15355, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 15356, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 15357, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 15358, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 15359, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 15360, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 15361, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 15362, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 15363, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 15364, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15365, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15366, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 15367, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15368, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15369, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 15370, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15371, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15372, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 15373, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15374, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15375, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 15376, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15377, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15378, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 15379, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15380, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15381, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 15382, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15383, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15384, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 15385, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15386, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15387, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 15388, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 15389, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 15390, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 15391, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 15392, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 15393, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 15394, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 15395, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 15396, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 15397, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 15398, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 15399, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 15400, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15401, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15402, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 15403, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15404, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15405, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 15406, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15407, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15408, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 15409, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15410, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15411, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 15412, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15413, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15414, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 15415, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15416, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15417, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 15418, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15419, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15420, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 15421, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15422, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15423, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 15424, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 15425, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 15426, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 15427, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 15428, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 15429, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 15430, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 15431, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 15432, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 15433, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 15434, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 15435, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 15436, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15437, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15438, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 15439, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15440, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15441, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 15442, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15443, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15444, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 15445, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15446, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15447, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 15448, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15449, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15450, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 15451, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15452, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15453, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 15454, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15455, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15456, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 15457, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15458, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15459, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 15460, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15461, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15462, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 15463, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15464, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15465, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 15466, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15467, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15468, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 15469, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15470, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15471, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15472, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15473, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15474, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15475, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15476, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15477, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15478, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15479, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15480, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15481, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15482, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15483, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15484, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15485, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15486, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15487, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15488, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15489, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15490, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15491, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15492, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15493, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15494, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15495, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 15496, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15497, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15498, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 15499, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15500, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15501, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 15502, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15503, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15504, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 15505, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15506, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15507, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15508, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15509, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15510, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15511, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15512, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15513, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15514, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15515, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15516, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15517, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15518, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15519, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15520, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15521, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15522, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15523, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15524, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15525, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15526, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15527, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15528, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15529, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15530, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15531, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 15532, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 15533, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 15534, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 15535, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 15536, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 15537, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 15538, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 15539, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 15540, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 15541, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 15542, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 15543, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 15544, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15545, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15546, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 15547, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15548, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15549, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 15550, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15551, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15552, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 15553, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15554, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15555, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 15556, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15557, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15558, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 15559, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15560, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15561, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 15562, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15563, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15564, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 15565, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15566, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15567, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 15568, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15569, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15570, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 15571, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15572, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15573, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 15574, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15575, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15576, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 15577, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15578, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15579, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15580, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15581, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15582, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15583, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15584, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15585, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15586, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15587, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15588, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15589, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15590, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15591, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15592, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15593, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15594, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15595, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15596, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15597, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15598, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15599, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15600, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15601, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15602, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15603, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 15604, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15605, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15606, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 15607, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15608, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15609, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 15610, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15611, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15612, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 15613, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15614, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15615, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15616, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15617, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15618, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15619, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15620, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15621, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15622, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15623, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15624, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15625, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15626, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15627, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15628, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15629, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15630, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15631, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15632, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15633, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15634, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15635, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15636, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15637, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15638, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + } + ] + }, + { + "id": 764, + "name": "stone_brick_wall", + "translation_key": "block.minecraft.stone_brick_wall", + "item_id": 382, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "north", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "south", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "none", + "low", + "tall" + ] + } + ], + "default_state_id": 15642, + "states": [ + { + "id": 15639, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 15640, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 15641, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 15642, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 15643, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 15644, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 15645, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 15646, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 15647, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 15648, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 15649, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 15650, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 15651, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 15652, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15653, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15654, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 15655, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15656, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15657, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 15658, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15659, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15660, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 15661, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15662, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15663, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 15664, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15665, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15666, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 15667, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15668, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15669, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 15670, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15671, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15672, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 15673, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15674, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15675, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 15676, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 15677, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 15678, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 15679, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 15680, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 15681, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 15682, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 15683, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 15684, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 15685, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 15686, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 15687, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 15688, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15689, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15690, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 15691, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15692, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15693, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 15694, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15695, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15696, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 15697, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15698, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15699, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 15700, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15701, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15702, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 15703, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15704, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15705, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 15706, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15707, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15708, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 15709, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15710, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15711, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 15712, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 15713, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 15714, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 15715, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 15716, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 15717, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 15718, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 15719, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 15720, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 15721, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 15722, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 15723, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 15724, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15725, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15726, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 15727, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15728, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15729, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 15730, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15731, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15732, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 15733, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15734, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15735, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 15736, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15737, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15738, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 15739, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15740, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15741, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 15742, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15743, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15744, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 15745, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15746, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 15747, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 15748, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 15749, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 15750, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 15751, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 15752, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 15753, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 15754, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 15755, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 15756, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 15757, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 15758, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 15759, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 15760, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15761, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15762, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 15763, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15764, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15765, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 15766, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15767, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15768, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 15769, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15770, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15771, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 15772, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15773, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15774, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 15775, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15776, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15777, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 15778, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15779, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15780, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 15781, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15782, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15783, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 15784, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15785, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15786, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 15787, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15788, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15789, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 15790, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15791, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15792, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 15793, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15794, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15795, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15796, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15797, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15798, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15799, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15800, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15801, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15802, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15803, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15804, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15805, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15806, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15807, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15808, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15809, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15810, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15811, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15812, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15813, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15814, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15815, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15816, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15817, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15818, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15819, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 15820, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15821, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15822, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 15823, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15824, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15825, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 15826, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15827, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15828, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 15829, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15830, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15831, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15832, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15833, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15834, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15835, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15836, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15837, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15838, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15839, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15840, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15841, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15842, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15843, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15844, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15845, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15846, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15847, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15848, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15849, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15850, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15851, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15852, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15853, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15854, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15855, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 15856, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 15857, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 15858, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 15859, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 15860, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 15861, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 15862, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 15863, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 15864, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 15865, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 15866, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 15867, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 15868, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15869, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15870, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 15871, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15872, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15873, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 15874, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15875, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15876, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 15877, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15878, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15879, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 15880, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15881, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15882, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 15883, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15884, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 15885, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 15886, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15887, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15888, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 15889, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15890, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 15891, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 15892, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15893, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15894, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 15895, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15896, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15897, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 15898, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15899, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15900, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 15901, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15902, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15903, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15904, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15905, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15906, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15907, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15908, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15909, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15910, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15911, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15912, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15913, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15914, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15915, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15916, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15917, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15918, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15919, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15920, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15921, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15922, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15923, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15924, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15925, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15926, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15927, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 15928, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15929, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15930, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 15931, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15932, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 15933, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 15934, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15935, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15936, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 15937, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15938, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 15939, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15940, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15941, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15942, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15943, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15944, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15945, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15946, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15947, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15948, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15949, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15950, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15951, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15952, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15953, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15954, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 15955, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15956, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 15957, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15958, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15959, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15960, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 15961, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 15962, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + } + ] + }, + { + "id": 765, + "name": "mud_brick_wall", + "translation_key": "block.minecraft.mud_brick_wall", + "item_id": 383, + "hardness": 1.5, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "north", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "south", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "none", + "low", + "tall" + ] + } + ], + "default_state_id": 15966, + "states": [ + { + "id": 15963, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 15964, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 15965, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 15966, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 15967, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 15968, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 15969, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 15970, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 15971, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 15972, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 15973, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 15974, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 15975, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 15976, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15977, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15978, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 15979, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15980, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15981, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 15982, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15983, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15984, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 15985, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15986, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15987, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 15988, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15989, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15990, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 15991, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15992, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 15993, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 15994, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15995, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15996, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 15997, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15998, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 15999, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 16000, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16001, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16002, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 16003, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16004, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16005, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 16006, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16007, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16008, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 16009, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16010, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16011, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16012, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16013, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16014, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16015, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16016, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16017, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16018, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16019, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16020, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16021, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16022, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16023, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16024, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16025, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16026, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16027, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16028, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16029, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16030, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16031, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16032, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16033, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16034, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16035, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 16036, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16037, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16038, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 16039, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16040, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16041, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 16042, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16043, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16044, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 16045, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16046, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16047, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16048, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16049, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16050, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16051, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16052, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16053, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16054, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16055, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16056, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16057, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16058, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16059, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16060, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16061, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16062, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16063, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16064, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16065, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16066, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16067, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16068, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16069, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16070, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16071, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 16072, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 16073, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 16074, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 16075, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 16076, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 16077, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 16078, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 16079, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 16080, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 16081, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 16082, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 16083, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 16084, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16085, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16086, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 16087, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16088, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16089, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 16090, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16091, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16092, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 16093, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16094, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16095, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 16096, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16097, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16098, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 16099, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16100, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16101, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 16102, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16103, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16104, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 16105, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16106, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16107, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 16108, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16109, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16110, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 16111, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16112, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16113, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 16114, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16115, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16116, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 16117, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16118, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16119, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16120, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16121, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16122, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16123, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16124, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16125, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16126, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16127, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16128, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16129, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16130, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16131, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16132, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16133, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16134, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16135, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16136, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16137, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16138, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16139, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16140, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16141, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16142, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16143, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 16144, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16145, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16146, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 16147, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16148, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16149, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 16150, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16151, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16152, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 16153, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16154, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16155, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16156, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16157, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16158, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16159, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16160, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16161, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16162, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16163, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16164, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16165, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16166, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16167, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16168, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16169, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16170, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16171, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16172, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16173, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16174, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16175, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16176, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16177, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16178, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16179, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 16180, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 16181, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 16182, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 16183, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 16184, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 16185, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 16186, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 16187, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 16188, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 16189, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 16190, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 16191, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 16192, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16193, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16194, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 16195, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16196, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16197, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 16198, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16199, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16200, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 16201, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16202, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16203, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 16204, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16205, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16206, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 16207, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16208, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16209, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 16210, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16211, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16212, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 16213, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16214, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16215, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 16216, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16217, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16218, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 16219, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16220, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16221, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 16222, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16223, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16224, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 16225, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16226, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16227, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16228, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16229, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16230, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16231, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16232, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16233, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16234, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16235, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16236, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16237, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16238, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16239, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16240, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16241, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16242, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16243, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16244, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16245, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16246, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16247, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16248, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16249, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16250, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16251, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 16252, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16253, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16254, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 16255, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16256, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16257, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 16258, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16259, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16260, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 16261, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16262, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16263, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16264, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16265, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16266, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16267, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16268, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16269, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16270, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16271, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16272, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16273, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16274, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16275, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16276, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16277, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16278, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16279, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16280, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16281, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16282, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16283, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16284, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16285, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16286, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + } + ] + }, + { + "id": 766, + "name": "nether_brick_wall", + "translation_key": "block.minecraft.nether_brick_wall", + "item_id": 384, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "north", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "south", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "none", + "low", + "tall" + ] + } + ], + "default_state_id": 16290, + "states": [ + { + "id": 16287, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 16288, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 16289, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 16290, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 16291, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 16292, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 16293, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 16294, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 16295, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 16296, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 16297, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 16298, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 16299, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 16300, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 16301, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 16302, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 16303, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 16304, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 16305, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 16306, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 16307, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 16308, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 16309, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 16310, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 16311, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 16312, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 16313, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 16314, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 16315, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 16316, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 16317, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 16318, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 16319, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 16320, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 16321, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 16322, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 16323, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 16324, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16325, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16326, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 16327, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16328, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16329, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 16330, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16331, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16332, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 16333, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16334, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16335, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16336, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16337, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16338, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16339, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16340, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16341, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16342, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16343, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16344, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16345, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16346, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16347, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16348, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16349, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16350, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16351, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16352, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16353, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16354, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16355, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16356, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16357, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16358, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16359, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 16360, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16361, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16362, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 16363, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16364, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16365, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 16366, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16367, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16368, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 16369, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16370, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16371, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16372, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16373, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16374, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16375, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16376, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16377, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16378, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16379, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16380, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16381, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16382, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16383, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16384, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16385, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16386, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16387, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16388, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16389, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16390, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16391, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16392, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16393, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16394, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16395, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 16396, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 16397, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 16398, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 16399, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 16400, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 16401, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 16402, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 16403, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 16404, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 16405, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 16406, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 16407, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 16408, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16409, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16410, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 16411, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16412, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16413, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 16414, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16415, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16416, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 16417, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16418, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16419, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 16420, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16421, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16422, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 16423, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16424, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16425, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 16426, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16427, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16428, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 16429, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16430, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16431, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 16432, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16433, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16434, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 16435, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16436, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16437, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 16438, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16439, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16440, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 16441, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16442, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16443, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16444, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16445, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16446, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16447, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16448, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16449, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16450, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16451, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16452, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16453, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16454, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16455, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16456, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16457, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16458, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16459, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16460, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16461, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16462, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16463, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16464, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16465, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16466, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16467, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 16468, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16469, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16470, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 16471, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16472, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16473, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 16474, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16475, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16476, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 16477, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16478, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16479, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16480, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16481, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16482, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16483, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16484, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16485, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16486, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16487, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16488, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16489, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16490, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16491, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16492, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16493, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16494, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16495, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16496, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16497, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16498, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16499, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16500, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16501, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16502, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16503, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 16504, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 16505, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 16506, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 16507, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 16508, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 16509, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 16510, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 16511, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 16512, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 16513, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 16514, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 16515, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 16516, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16517, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16518, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 16519, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16520, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16521, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 16522, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16523, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16524, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 16525, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16526, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16527, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 16528, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16529, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16530, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 16531, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16532, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16533, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 16534, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16535, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16536, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 16537, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16538, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16539, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 16540, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16541, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16542, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 16543, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16544, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16545, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 16546, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16547, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16548, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 16549, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16550, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16551, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16552, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16553, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16554, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16555, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16556, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16557, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16558, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16559, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16560, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16561, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16562, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16563, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16564, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16565, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16566, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16567, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16568, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16569, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16570, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16571, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16572, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16573, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16574, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16575, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 16576, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16577, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16578, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 16579, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16580, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16581, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 16582, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16583, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16584, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 16585, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16586, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16587, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16588, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16589, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16590, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16591, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16592, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16593, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16594, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16595, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16596, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16597, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16598, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16599, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16600, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16601, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16602, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16603, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16604, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16605, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16606, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16607, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16608, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16609, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16610, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + } + ] + }, + { + "id": 767, + "name": "andesite_wall", + "translation_key": "block.minecraft.andesite_wall", + "item_id": 385, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "north", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "south", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "none", + "low", + "tall" + ] + } + ], + "default_state_id": 16614, + "states": [ + { + "id": 16611, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 16612, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 16613, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 16614, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 16615, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 16616, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 16617, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 16618, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 16619, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 16620, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 16621, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 16622, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 16623, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 16624, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 16625, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 16626, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 16627, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 16628, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 16629, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 16630, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 16631, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 16632, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 16633, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 16634, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 16635, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 16636, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 16637, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 16638, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 16639, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 16640, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 16641, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 16642, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 16643, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 16644, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 16645, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 16646, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 16647, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 16648, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16649, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16650, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 16651, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16652, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16653, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 16654, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16655, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16656, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 16657, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16658, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16659, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16660, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16661, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16662, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16663, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16664, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16665, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16666, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16667, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16668, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16669, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16670, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16671, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16672, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16673, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16674, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16675, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16676, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16677, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16678, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16679, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16680, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16681, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16682, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16683, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 16684, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16685, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16686, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 16687, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16688, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16689, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 16690, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16691, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16692, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 16693, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16694, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16695, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16696, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16697, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16698, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16699, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16700, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16701, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16702, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16703, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16704, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16705, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16706, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16707, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16708, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16709, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16710, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16711, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16712, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16713, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16714, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16715, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16716, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16717, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16718, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16719, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 16720, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 16721, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 16722, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 16723, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 16724, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 16725, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 16726, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 16727, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 16728, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 16729, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 16730, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 16731, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 16732, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16733, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16734, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 16735, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16736, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16737, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 16738, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16739, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16740, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 16741, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16742, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16743, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 16744, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16745, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16746, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 16747, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16748, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16749, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 16750, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16751, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16752, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 16753, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16754, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16755, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 16756, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16757, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16758, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 16759, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16760, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16761, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 16762, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16763, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16764, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 16765, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16766, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16767, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16768, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16769, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16770, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16771, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16772, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16773, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16774, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16775, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16776, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16777, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16778, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16779, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16780, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16781, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16782, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16783, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16784, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16785, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16786, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16787, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16788, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16789, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16790, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16791, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 16792, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16793, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16794, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 16795, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16796, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16797, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 16798, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16799, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16800, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 16801, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16802, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16803, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16804, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16805, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16806, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16807, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16808, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16809, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16810, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16811, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16812, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16813, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16814, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16815, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16816, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16817, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16818, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16819, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16820, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16821, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16822, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16823, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16824, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16825, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16826, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16827, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 16828, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 16829, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 16830, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 16831, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 16832, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 16833, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 16834, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 16835, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 16836, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 16837, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 16838, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 16839, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 16840, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16841, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16842, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 16843, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16844, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16845, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 16846, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16847, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16848, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 16849, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16850, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16851, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 16852, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16853, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16854, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 16855, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16856, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 16857, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 16858, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16859, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16860, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 16861, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16862, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 16863, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 16864, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16865, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16866, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 16867, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16868, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16869, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 16870, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16871, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16872, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 16873, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16874, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16875, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16876, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16877, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16878, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16879, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16880, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16881, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16882, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16883, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16884, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16885, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16886, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16887, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16888, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16889, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16890, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16891, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16892, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16893, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16894, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16895, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16896, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16897, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16898, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16899, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 16900, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16901, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16902, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 16903, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16904, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 16905, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 16906, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16907, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16908, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 16909, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16910, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 16911, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16912, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16913, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16914, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16915, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16916, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16917, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16918, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16919, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16920, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16921, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16922, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16923, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16924, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16925, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16926, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 16927, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16928, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16929, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16930, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16931, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16932, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 16933, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 16934, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + } + ] + }, + { + "id": 768, + "name": "red_nether_brick_wall", + "translation_key": "block.minecraft.red_nether_brick_wall", + "item_id": 386, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "north", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "south", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "none", + "low", + "tall" + ] + } + ], + "default_state_id": 16938, + "states": [ + { + "id": 16935, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 16936, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 16937, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 16938, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 16939, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 16940, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 16941, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 16942, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 16943, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 16944, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 16945, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 16946, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 16947, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 16948, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 16949, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 16950, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 16951, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 16952, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 16953, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 16954, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 16955, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 16956, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 16957, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 16958, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 16959, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 16960, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 16961, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 16962, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 16963, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 16964, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 16965, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 16966, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 16967, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 16968, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 16969, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 16970, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 16971, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 16972, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16973, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16974, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 16975, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16976, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 16977, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 16978, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16979, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16980, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 16981, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16982, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 16983, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16984, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16985, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16986, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16987, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16988, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16989, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16990, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16991, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16992, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 16993, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16994, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 16995, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16996, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16997, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 16998, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 16999, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17000, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17001, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17002, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17003, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17004, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17005, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17006, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17007, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 17008, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17009, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17010, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 17011, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17012, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17013, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 17014, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17015, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17016, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 17017, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17018, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17019, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17020, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17021, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17022, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17023, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17024, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17025, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17026, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17027, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17028, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17029, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17030, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17031, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17032, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17033, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17034, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17035, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17036, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17037, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17038, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17039, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17040, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17041, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17042, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17043, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 17044, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 17045, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 17046, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 17047, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 17048, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 17049, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 17050, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 17051, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 17052, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 17053, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 17054, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 17055, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 17056, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17057, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17058, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 17059, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17060, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17061, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 17062, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17063, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17064, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 17065, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17066, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17067, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 17068, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17069, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17070, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 17071, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17072, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17073, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 17074, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17075, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17076, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 17077, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17078, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17079, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 17080, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17081, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17082, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 17083, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17084, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17085, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 17086, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17087, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17088, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 17089, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17090, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17091, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17092, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17093, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17094, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17095, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17096, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17097, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17098, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17099, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17100, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17101, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17102, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17103, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17104, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17105, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17106, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17107, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17108, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17109, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17110, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17111, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17112, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17113, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17114, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17115, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 17116, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17117, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17118, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 17119, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17120, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17121, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 17122, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17123, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17124, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 17125, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17126, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17127, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17128, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17129, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17130, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17131, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17132, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17133, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17134, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17135, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17136, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17137, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17138, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17139, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17140, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17141, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17142, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17143, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17144, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17145, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17146, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17147, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17148, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17149, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17150, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17151, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 17152, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 17153, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 17154, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 17155, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 17156, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 17157, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 17158, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 17159, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 17160, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 17161, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 17162, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 17163, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 17164, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17165, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17166, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 17167, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17168, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17169, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 17170, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17171, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17172, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 17173, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17174, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17175, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 17176, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17177, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17178, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 17179, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17180, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17181, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 17182, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17183, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17184, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 17185, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17186, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17187, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 17188, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17189, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17190, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 17191, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17192, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17193, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 17194, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17195, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17196, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 17197, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17198, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17199, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17200, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17201, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17202, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17203, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17204, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17205, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17206, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17207, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17208, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17209, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17210, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17211, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17212, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17213, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17214, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17215, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17216, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17217, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17218, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17219, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17220, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17221, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17222, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17223, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 17224, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17225, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17226, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 17227, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17228, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17229, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 17230, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17231, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17232, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 17233, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17234, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17235, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17236, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17237, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17238, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17239, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17240, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17241, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17242, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17243, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17244, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17245, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17246, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17247, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17248, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17249, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17250, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17251, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17252, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17253, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17254, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17255, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17256, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17257, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17258, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + } + ] + }, + { + "id": 769, + "name": "sandstone_wall", + "translation_key": "block.minecraft.sandstone_wall", + "item_id": 387, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "north", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "south", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "none", + "low", + "tall" + ] + } + ], + "default_state_id": 17262, + "states": [ + { + "id": 17259, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 17260, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 17261, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 17262, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 17263, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 17264, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 17265, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 17266, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 17267, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 17268, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 17269, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 17270, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 17271, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 17272, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 17273, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 17274, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 17275, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 17276, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 17277, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 17278, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 17279, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 17280, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 17281, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 17282, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 17283, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 17284, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 17285, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 17286, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 17287, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 17288, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 17289, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 17290, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 17291, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 17292, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 17293, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 17294, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 17295, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 17296, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17297, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17298, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 17299, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17300, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17301, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 17302, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17303, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17304, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 17305, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17306, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17307, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17308, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17309, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17310, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17311, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17312, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17313, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17314, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17315, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17316, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17317, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17318, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17319, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17320, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17321, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17322, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17323, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17324, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17325, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17326, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17327, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17328, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17329, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17330, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17331, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 17332, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17333, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17334, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 17335, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17336, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17337, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 17338, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17339, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17340, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 17341, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17342, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17343, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17344, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17345, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17346, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17347, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17348, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17349, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17350, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17351, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17352, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17353, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17354, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17355, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17356, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17357, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17358, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17359, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17360, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17361, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17362, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17363, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17364, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17365, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17366, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17367, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 17368, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 17369, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 17370, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 17371, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 17372, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 17373, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 17374, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 17375, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 17376, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 17377, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 17378, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 17379, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 17380, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17381, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17382, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 17383, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17384, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17385, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 17386, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17387, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17388, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 17389, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17390, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17391, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 17392, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17393, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17394, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 17395, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17396, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17397, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 17398, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17399, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17400, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 17401, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17402, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17403, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 17404, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17405, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17406, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 17407, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17408, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17409, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 17410, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17411, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17412, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 17413, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17414, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17415, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17416, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17417, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17418, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17419, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17420, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17421, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17422, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17423, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17424, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17425, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17426, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17427, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17428, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17429, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17430, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17431, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17432, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17433, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17434, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17435, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17436, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17437, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17438, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17439, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 17440, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17441, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17442, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 17443, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17444, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17445, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 17446, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17447, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17448, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 17449, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17450, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17451, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17452, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17453, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17454, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17455, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17456, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17457, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17458, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17459, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17460, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17461, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17462, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17463, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17464, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17465, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17466, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17467, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17468, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17469, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17470, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17471, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17472, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17473, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17474, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17475, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 17476, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 17477, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 17478, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 17479, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 17480, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 17481, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 17482, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 17483, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 17484, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 17485, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 17486, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 17487, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 17488, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17489, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17490, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 17491, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17492, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17493, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 17494, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17495, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17496, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 17497, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17498, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17499, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 17500, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17501, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17502, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 17503, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17504, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17505, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 17506, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17507, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17508, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 17509, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17510, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17511, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 17512, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17513, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17514, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 17515, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17516, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17517, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 17518, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17519, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17520, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 17521, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17522, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17523, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17524, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17525, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17526, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17527, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17528, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17529, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17530, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17531, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17532, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17533, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17534, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17535, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17536, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17537, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17538, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17539, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17540, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17541, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17542, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17543, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17544, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17545, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17546, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17547, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 17548, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17549, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17550, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 17551, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17552, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17553, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 17554, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17555, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17556, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 17557, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17558, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17559, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17560, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17561, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17562, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17563, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17564, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17565, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17566, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17567, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17568, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17569, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17570, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17571, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17572, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17573, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17574, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17575, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17576, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17577, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17578, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17579, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17580, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17581, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17582, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + } + ] + }, + { + "id": 770, + "name": "end_stone_brick_wall", + "translation_key": "block.minecraft.end_stone_brick_wall", + "item_id": 388, + "hardness": 3.0, + "blast_resistance": 9.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "north", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "south", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "none", + "low", + "tall" + ] + } + ], + "default_state_id": 17586, + "states": [ + { + "id": 17583, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 17584, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 17585, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 17586, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 17587, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 17588, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 17589, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 17590, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 17591, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 17592, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 17593, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 17594, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 17595, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 17596, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 17597, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 17598, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 17599, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 17600, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 17601, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 17602, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 17603, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 17604, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 17605, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 17606, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 17607, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 17608, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 17609, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 17610, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 17611, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 17612, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 17613, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 17614, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 17615, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 17616, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 17617, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 17618, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 17619, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 17620, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17621, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17622, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 17623, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17624, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17625, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 17626, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17627, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17628, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 17629, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17630, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17631, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17632, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17633, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17634, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17635, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17636, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17637, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17638, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17639, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17640, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17641, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17642, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17643, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17644, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17645, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17646, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17647, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17648, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17649, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17650, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17651, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17652, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17653, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17654, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17655, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 17656, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17657, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17658, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 17659, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17660, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17661, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 17662, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17663, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17664, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 17665, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17666, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17667, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17668, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17669, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17670, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17671, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17672, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17673, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17674, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17675, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17676, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17677, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17678, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17679, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17680, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17681, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17682, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17683, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17684, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17685, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17686, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17687, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17688, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17689, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17690, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17691, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 17692, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 17693, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 17694, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 17695, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 17696, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 17697, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 17698, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 17699, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 17700, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 17701, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 17702, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 17703, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 17704, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17705, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17706, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 17707, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17708, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17709, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 17710, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17711, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17712, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 17713, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17714, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17715, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 17716, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17717, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17718, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 17719, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17720, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17721, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 17722, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17723, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17724, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 17725, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17726, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17727, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 17728, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17729, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17730, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 17731, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17732, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17733, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 17734, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17735, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17736, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 17737, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17738, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17739, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17740, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17741, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17742, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17743, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17744, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17745, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17746, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17747, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17748, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17749, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17750, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17751, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17752, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17753, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17754, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17755, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17756, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17757, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17758, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17759, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17760, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17761, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17762, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17763, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 17764, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17765, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17766, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 17767, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17768, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17769, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 17770, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17771, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17772, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 17773, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17774, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17775, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17776, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17777, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17778, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17779, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17780, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17781, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17782, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17783, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17784, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17785, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17786, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17787, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17788, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17789, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17790, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17791, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17792, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17793, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17794, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17795, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17796, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17797, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17798, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17799, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 17800, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 17801, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 17802, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 17803, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 17804, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 17805, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 17806, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 17807, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 17808, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 17809, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 17810, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 17811, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 17812, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17813, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17814, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 17815, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17816, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17817, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 17818, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17819, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17820, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 17821, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17822, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17823, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 17824, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17825, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17826, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 17827, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17828, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 17829, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 17830, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17831, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17832, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 17833, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17834, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 17835, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 17836, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17837, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17838, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 17839, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17840, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17841, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 17842, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17843, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17844, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 17845, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17846, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17847, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17848, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17849, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17850, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17851, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17852, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17853, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17854, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17855, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17856, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17857, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17858, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17859, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17860, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17861, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17862, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17863, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17864, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17865, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17866, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17867, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17868, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17869, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17870, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17871, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 17872, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17873, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17874, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 17875, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17876, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 17877, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 17878, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17879, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17880, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 17881, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17882, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 17883, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17884, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17885, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17886, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17887, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17888, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17889, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17890, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17891, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17892, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17893, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17894, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17895, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17896, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17897, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17898, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 17899, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17900, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17901, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17902, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17903, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17904, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 17905, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 17906, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + } + ] + }, + { + "id": 771, + "name": "diorite_wall", + "translation_key": "block.minecraft.diorite_wall", + "item_id": 389, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "north", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "south", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "none", + "low", + "tall" + ] + } + ], + "default_state_id": 17910, + "states": [ + { + "id": 17907, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 17908, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 17909, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 17910, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 17911, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 17912, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 17913, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 17914, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 17915, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 17916, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 17917, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 17918, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 17919, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 17920, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 17921, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 17922, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 17923, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 17924, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 17925, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 17926, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 17927, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 17928, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 17929, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 17930, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 17931, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 17932, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 17933, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 17934, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 17935, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 17936, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 17937, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 17938, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 17939, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 17940, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 17941, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 17942, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 17943, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 17944, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17945, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17946, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 17947, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17948, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17949, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 17950, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17951, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17952, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 17953, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17954, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17955, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17956, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17957, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17958, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17959, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17960, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17961, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17962, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17963, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17964, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17965, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17966, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17967, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17968, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17969, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17970, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17971, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17972, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17973, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17974, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17975, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17976, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17977, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17978, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17979, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 17980, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17981, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17982, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 17983, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17984, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 17985, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 17986, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17987, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17988, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 17989, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17990, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 17991, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17992, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17993, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17994, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 17995, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17996, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 17997, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 17998, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 17999, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 18000, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 18001, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 18002, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 18003, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 18004, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18005, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18006, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 18007, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18008, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18009, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 18010, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 18011, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 18012, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 18013, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 18014, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 18015, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 18016, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 18017, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 18018, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 18019, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 18020, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 18021, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 18022, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 18023, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 18024, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 18025, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 18026, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 18027, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 18028, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 18029, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 18030, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 18031, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 18032, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 18033, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 18034, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 18035, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 18036, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 18037, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 18038, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 18039, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 18040, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 18041, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 18042, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 18043, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 18044, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 18045, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 18046, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 18047, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 18048, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 18049, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 18050, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 18051, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 18052, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 18053, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 18054, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 18055, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 18056, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 18057, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 18058, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 18059, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 18060, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 18061, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 18062, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 18063, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 18064, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18065, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18066, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 18067, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18068, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18069, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 18070, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18071, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18072, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 18073, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18074, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18075, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 18076, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18077, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18078, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 18079, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18080, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18081, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 18082, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18083, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18084, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 18085, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18086, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18087, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 18088, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 18089, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 18090, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 18091, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 18092, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 18093, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 18094, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 18095, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 18096, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 18097, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 18098, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 18099, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 18100, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18101, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18102, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 18103, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18104, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18105, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 18106, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18107, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18108, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 18109, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18110, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18111, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 18112, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18113, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18114, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 18115, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18116, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18117, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 18118, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18119, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18120, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 18121, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18122, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18123, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 18124, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 18125, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 18126, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 18127, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 18128, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 18129, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 18130, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 18131, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 18132, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 18133, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 18134, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 18135, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 18136, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 18137, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 18138, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 18139, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 18140, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 18141, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 18142, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 18143, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 18144, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 18145, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 18146, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 18147, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 18148, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 18149, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 18150, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 18151, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 18152, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 18153, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 18154, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 18155, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 18156, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 18157, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 18158, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 18159, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 18160, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 18161, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 18162, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 18163, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 18164, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 18165, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 18166, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 18167, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 18168, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 18169, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 18170, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 18171, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 18172, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18173, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18174, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 18175, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18176, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18177, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 18178, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18179, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18180, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 18181, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18182, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18183, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 18184, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18185, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18186, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 18187, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18188, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18189, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 18190, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18191, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18192, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 18193, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18194, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18195, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 18196, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 18197, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 18198, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 18199, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 18200, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 18201, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 18202, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 18203, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 18204, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 18205, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 18206, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 18207, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 18208, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18209, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18210, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 18211, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18212, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18213, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 18214, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18215, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18216, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 18217, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18218, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18219, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 18220, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18221, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18222, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 18223, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18224, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 18225, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 18226, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18227, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18228, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 18229, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 18230, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + } + ] + }, + { + "id": 772, + "name": "scaffolding", + "translation_key": "block.minecraft.scaffolding", + "item_id": 634, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "bottom", + "values": [ + "true", + "false" + ] + }, + { + "name": "distance", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 18262, + "states": [ + { + "id": 18231, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18232, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18233, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18234, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18235, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18236, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18237, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18238, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18239, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18240, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18241, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18242, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18243, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18244, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18245, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18246, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18247, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18248, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18249, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18250, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18251, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18252, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18253, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18254, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18255, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18256, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18257, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18258, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18259, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18260, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18261, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + }, + { + "id": 18262, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 231, + 232, + 233, + 234, + 235, + 236, + 237 + ] + } + ] + }, + { + "id": 773, + "name": "loom", + "translation_key": "block.minecraft.loom", + "item_id": 1145, + "hardness": 2.5, + "blast_resistance": 2.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 18263, + "states": [ + { + "id": 18263, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 18264, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 18265, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 18266, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 774, + "name": "barrel", + "translation_key": "block.minecraft.barrel", + "item_id": 1154, + "hardness": 2.5, + "blast_resistance": 2.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 18268, + "states": [ + { + "id": 18267, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 26 + }, + { + "id": 18268, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 26 + }, + { + "id": 18269, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 26 + }, + { + "id": 18270, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 26 + }, + { + "id": 18271, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 26 + }, + { + "id": 18272, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 26 + }, + { + "id": 18273, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 26 + }, + { + "id": 18274, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 26 + }, + { + "id": 18275, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 26 + }, + { + "id": 18276, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 26 + }, + { + "id": 18277, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 26 + }, + { + "id": 18278, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 26 + } + ] + }, + { + "id": 775, + "name": "smoker", + "translation_key": "block.minecraft.smoker", + "item_id": 1155, + "hardness": 3.5, + "blast_resistance": 3.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 18280, + "states": [ + { + "id": 18279, + "luminance": 13, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 27 + }, + { + "id": 18280, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 27 + }, + { + "id": 18281, + "luminance": 13, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 27 + }, + { + "id": 18282, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 27 + }, + { + "id": 18283, + "luminance": 13, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 27 + }, + { + "id": 18284, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 27 + }, + { + "id": 18285, + "luminance": 13, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 27 + }, + { + "id": 18286, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 27 + } + ] + }, + { + "id": 776, + "name": "blast_furnace", + "translation_key": "block.minecraft.blast_furnace", + "item_id": 1156, + "hardness": 3.5, + "blast_resistance": 3.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 18288, + "states": [ + { + "id": 18287, + "luminance": 13, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 28 + }, + { + "id": 18288, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 28 + }, + { + "id": 18289, + "luminance": 13, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 28 + }, + { + "id": 18290, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 28 + }, + { + "id": 18291, + "luminance": 13, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 28 + }, + { + "id": 18292, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 28 + }, + { + "id": 18293, + "luminance": 13, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 28 + }, + { + "id": 18294, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 28 + } + ] + }, + { + "id": 777, + "name": "cartography_table", + "translation_key": "block.minecraft.cartography_table", + "item_id": 1157, + "hardness": 2.5, + "blast_resistance": 2.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 18295, + "states": [ + { + "id": 18295, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 778, + "name": "fletching_table", + "translation_key": "block.minecraft.fletching_table", + "item_id": 1158, + "hardness": 2.5, + "blast_resistance": 2.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 18296, + "states": [ + { + "id": 18296, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 779, + "name": "grindstone", + "translation_key": "block.minecraft.grindstone", + "item_id": 1159, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "face", + "values": [ + "floor", + "wall", + "ceiling" + ] + }, + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 18301, + "states": [ + { + "id": 18297, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 238, + 239, + 240, + 241, + 242, + 243, + 244 + ] + }, + { + "id": 18298, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 238, + 239, + 240, + 241, + 242, + 243, + 244 + ] + }, + { + "id": 18299, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 245, + 246, + 247, + 248, + 249, + 250, + 251 + ] + }, + { + "id": 18300, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 245, + 246, + 247, + 248, + 249, + 250, + 251 + ] + }, + { + "id": 18301, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 252, + 253, + 254, + 255, + 256 + ] + }, + { + "id": 18302, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 257, + 258, + 259, + 260, + 261 + ] + }, + { + "id": 18303, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 262, + 263, + 264, + 265, + 266 + ] + }, + { + "id": 18304, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 267, + 268, + 269, + 270, + 271 + ] + }, + { + "id": 18305, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 272, + 273, + 274, + 275, + 276 + ] + }, + { + "id": 18306, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 272, + 273, + 274, + 275, + 276 + ] + }, + { + "id": 18307, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 277, + 278, + 279, + 280, + 281 + ] + }, + { + "id": 18308, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 277, + 278, + 279, + 280, + 281 + ] + } + ] + }, + { + "id": 780, + "name": "lectern", + "translation_key": "block.minecraft.lectern", + "item_id": 648, + "hardness": 2.5, + "blast_resistance": 2.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "has_book", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 18312, + "states": [ + { + "id": 18309, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 282 + ], + "block_entity_type": 29 + }, + { + "id": 18310, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 282 + ], + "block_entity_type": 29 + }, + { + "id": 18311, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 282 + ], + "block_entity_type": 29 + }, + { + "id": 18312, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 282 + ], + "block_entity_type": 29 + }, + { + "id": 18313, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 282 + ], + "block_entity_type": 29 + }, + { + "id": 18314, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 282 + ], + "block_entity_type": 29 + }, + { + "id": 18315, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 282 + ], + "block_entity_type": 29 + }, + { + "id": 18316, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 282 + ], + "block_entity_type": 29 + }, + { + "id": 18317, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 282 + ], + "block_entity_type": 29 + }, + { + "id": 18318, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 282 + ], + "block_entity_type": 29 + }, + { + "id": 18319, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 282 + ], + "block_entity_type": 29 + }, + { + "id": 18320, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 282 + ], + "block_entity_type": 29 + }, + { + "id": 18321, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 282 + ], + "block_entity_type": 29 + }, + { + "id": 18322, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 282 + ], + "block_entity_type": 29 + }, + { + "id": 18323, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 282 + ], + "block_entity_type": 29 + }, + { + "id": 18324, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 282 + ], + "block_entity_type": 29 + } + ] + }, + { + "id": 781, + "name": "smithing_table", + "translation_key": "block.minecraft.smithing_table", + "item_id": 1160, + "hardness": 2.5, + "blast_resistance": 2.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 18325, + "states": [ + { + "id": 18325, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 782, + "name": "stonecutter", + "translation_key": "block.minecraft.stonecutter", + "item_id": 1161, + "hardness": 3.5, + "blast_resistance": 3.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + } + ], + "default_state_id": 18326, + "states": [ + { + "id": 18326, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 283 + ] + }, + { + "id": 18327, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 283 + ] + }, + { + "id": 18328, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 283 + ] + }, + { + "id": 18329, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 283 + ] + } + ] + }, + { + "id": 783, + "name": "bell", + "translation_key": "block.minecraft.bell", + "item_id": 1162, + "hardness": 5.0, + "blast_resistance": 5.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "attachment", + "values": [ + "floor", + "ceiling", + "single_wall", + "double_wall" + ] + }, + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 18331, + "states": [ + { + "id": 18330, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 284 + ], + "block_entity_type": 30 + }, + { + "id": 18331, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 284 + ], + "block_entity_type": 30 + }, + { + "id": 18332, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 284 + ], + "block_entity_type": 30 + }, + { + "id": 18333, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 284 + ], + "block_entity_type": 30 + }, + { + "id": 18334, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 285 + ], + "block_entity_type": 30 + }, + { + "id": 18335, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 285 + ], + "block_entity_type": 30 + }, + { + "id": 18336, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 285 + ], + "block_entity_type": 30 + }, + { + "id": 18337, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 285 + ], + "block_entity_type": 30 + }, + { + "id": 18338, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 286, + 287, + 288 + ], + "block_entity_type": 30 + }, + { + "id": 18339, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 286, + 287, + 288 + ], + "block_entity_type": 30 + }, + { + "id": 18340, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 286, + 287, + 288 + ], + "block_entity_type": 30 + }, + { + "id": 18341, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 286, + 287, + 288 + ], + "block_entity_type": 30 + }, + { + "id": 18342, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 286, + 287, + 288 + ], + "block_entity_type": 30 + }, + { + "id": 18343, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 286, + 287, + 288 + ], + "block_entity_type": 30 + }, + { + "id": 18344, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 286, + 287, + 288 + ], + "block_entity_type": 30 + }, + { + "id": 18345, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 286, + 287, + 288 + ], + "block_entity_type": 30 + }, + { + "id": 18346, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 286, + 287, + 289 + ], + "block_entity_type": 30 + }, + { + "id": 18347, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 286, + 287, + 289 + ], + "block_entity_type": 30 + }, + { + "id": 18348, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 286, + 287, + 290 + ], + "block_entity_type": 30 + }, + { + "id": 18349, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 286, + 287, + 290 + ], + "block_entity_type": 30 + }, + { + "id": 18350, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 286, + 287, + 291 + ], + "block_entity_type": 30 + }, + { + "id": 18351, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 286, + 287, + 291 + ], + "block_entity_type": 30 + }, + { + "id": 18352, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 286, + 287, + 292 + ], + "block_entity_type": 30 + }, + { + "id": 18353, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 286, + 287, + 292 + ], + "block_entity_type": 30 + }, + { + "id": 18354, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 286, + 287, + 293 + ], + "block_entity_type": 30 + }, + { + "id": 18355, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 286, + 287, + 293 + ], + "block_entity_type": 30 + }, + { + "id": 18356, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 286, + 287, + 293 + ], + "block_entity_type": 30 + }, + { + "id": 18357, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 286, + 287, + 293 + ], + "block_entity_type": 30 + }, + { + "id": 18358, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 286, + 287, + 294 + ], + "block_entity_type": 30 + }, + { + "id": 18359, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 286, + 287, + 294 + ], + "block_entity_type": 30 + }, + { + "id": 18360, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 286, + 287, + 294 + ], + "block_entity_type": 30 + }, + { + "id": 18361, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 286, + 287, + 294 + ], + "block_entity_type": 30 + } + ] + }, + { + "id": 784, + "name": "lantern", + "translation_key": "block.minecraft.lantern", + "item_id": 1163, + "hardness": 3.5, + "blast_resistance": 3.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "hanging", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 18365, + "states": [ + { + "id": 18362, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 295, + 296 + ] + }, + { + "id": 18363, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 295, + 296 + ] + }, + { + "id": 18364, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 297, + 298 + ] + }, + { + "id": 18365, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 297, + 298 + ] + } + ] + }, + { + "id": 785, + "name": "soul_lantern", + "translation_key": "block.minecraft.soul_lantern", + "item_id": 1164, + "hardness": 3.5, + "blast_resistance": 3.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "hanging", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 18369, + "states": [ + { + "id": 18366, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 295, + 296 + ] + }, + { + "id": 18367, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 295, + 296 + ] + }, + { + "id": 18368, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 297, + 298 + ] + }, + { + "id": 18369, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 297, + 298 + ] + } + ] + }, + { + "id": 786, + "name": "campfire", + "translation_key": "block.minecraft.campfire", + "item_id": 1167, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "lit", + "values": [ + "true", + "false" + ] + }, + { + "name": "signal_fire", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 18373, + "states": [ + { + "id": 18370, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18371, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18372, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18373, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18374, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18375, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18376, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18377, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18378, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18379, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18380, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18381, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18382, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18383, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18384, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18385, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18386, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18387, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18388, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18389, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18390, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18391, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18392, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18393, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18394, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18395, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18396, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18397, + "luminance": 15, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18398, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18399, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18400, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18401, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + } + ] + }, + { + "id": 787, + "name": "soul_campfire", + "translation_key": "block.minecraft.soul_campfire", + "item_id": 1168, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "lit", + "values": [ + "true", + "false" + ] + }, + { + "name": "signal_fire", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 18405, + "states": [ + { + "id": 18402, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18403, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18404, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18405, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18406, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18407, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18408, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18409, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18410, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18411, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18412, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18413, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18414, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18415, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18416, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18417, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18418, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18419, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18420, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18421, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18422, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18423, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18424, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18425, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18426, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18427, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18428, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18429, + "luminance": 10, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18430, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18431, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18432, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + }, + { + "id": 18433, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 299 + ], + "block_entity_type": 32 + } + ] + }, + { + "id": 788, + "name": "sweet_berry_bush", + "translation_key": "block.minecraft.sweet_berry_bush", + "item_id": 1165, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "age", + "values": [ + "0", + "1", + "2", + "3" + ] + } + ], + "default_state_id": 18434, + "states": [ + { + "id": 18434, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18435, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18436, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18437, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 789, + "name": "warped_stem", + "translation_key": "block.minecraft.warped_stem", + "item_id": 121, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 18439, + "states": [ + { + "id": 18438, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 18439, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 18440, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 790, + "name": "stripped_warped_stem", + "translation_key": "block.minecraft.stripped_warped_stem", + "item_id": 132, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 18442, + "states": [ + { + "id": 18441, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 18442, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 18443, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 791, + "name": "warped_hyphae", + "translation_key": "block.minecraft.warped_hyphae", + "item_id": 153, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 18445, + "states": [ + { + "id": 18444, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 18445, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 18446, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 792, + "name": "stripped_warped_hyphae", + "translation_key": "block.minecraft.stripped_warped_hyphae", + "item_id": 142, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 18448, + "states": [ + { + "id": 18447, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 18448, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 18449, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 793, + "name": "warped_nylium", + "translation_key": "block.minecraft.warped_nylium", + "item_id": 21, + "hardness": 0.4, + "blast_resistance": 0.4, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 18450, + "states": [ + { + "id": 18450, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 794, + "name": "warped_fungus", + "translation_key": "block.minecraft.warped_fungus", + "item_id": 215, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 18451, + "states": [ + { + "id": 18451, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 795, + "name": "warped_wart_block", + "translation_key": "block.minecraft.warped_wart_block", + "item_id": 496, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 18452, + "states": [ + { + "id": 18452, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 796, + "name": "warped_roots", + "translation_key": "block.minecraft.warped_roots", + "item_id": 217, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 18453, + "states": [ + { + "id": 18453, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 797, + "name": "nether_sprouts", + "translation_key": "block.minecraft.nether_sprouts", + "item_id": 218, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 18454, + "states": [ + { + "id": 18454, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 798, + "name": "crimson_stem", + "translation_key": "block.minecraft.crimson_stem", + "item_id": 120, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 18456, + "states": [ + { + "id": 18455, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 18456, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 18457, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 799, + "name": "stripped_crimson_stem", + "translation_key": "block.minecraft.stripped_crimson_stem", + "item_id": 131, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 18459, + "states": [ + { + "id": 18458, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 18459, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 18460, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 800, + "name": "crimson_hyphae", + "translation_key": "block.minecraft.crimson_hyphae", + "item_id": 152, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 18462, + "states": [ + { + "id": 18461, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 18462, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 18463, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 801, + "name": "stripped_crimson_hyphae", + "translation_key": "block.minecraft.stripped_crimson_hyphae", + "item_id": 141, + "hardness": 2.0, + "blast_resistance": 2.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 18465, + "states": [ + { + "id": 18464, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 18465, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 18466, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 802, + "name": "crimson_nylium", + "translation_key": "block.minecraft.crimson_nylium", + "item_id": 20, + "hardness": 0.4, + "blast_resistance": 0.4, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 18467, + "states": [ + { + "id": 18467, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 803, + "name": "crimson_fungus", + "translation_key": "block.minecraft.crimson_fungus", + "item_id": 214, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 18468, + "states": [ + { + "id": 18468, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 804, + "name": "shroomlight", + "translation_key": "block.minecraft.shroomlight", + "item_id": 1169, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 18469, + "states": [ + { + "id": 18469, + "luminance": 15, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 805, + "name": "weeping_vines", + "translation_key": "block.minecraft.weeping_vines", + "item_id": 219, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "age", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24", + "25" + ] + } + ], + "default_state_id": 18470, + "states": [ + { + "id": 18470, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18471, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18472, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18473, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18474, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18475, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18476, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18477, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18478, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18479, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18480, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18481, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18482, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18483, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18484, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18485, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18486, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18487, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18488, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18489, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18490, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18491, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18492, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18493, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18494, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18495, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 806, + "name": "weeping_vines_plant", + "translation_key": "block.minecraft.weeping_vines_plant", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 18496, + "states": [ + { + "id": 18496, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 807, + "name": "twisting_vines", + "translation_key": "block.minecraft.twisting_vines", + "item_id": 220, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "age", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24", + "25" + ] + } + ], + "default_state_id": 18497, + "states": [ + { + "id": 18497, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18498, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18499, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18500, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18501, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18502, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18503, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18504, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18505, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18506, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18507, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18508, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18509, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18510, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18511, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18512, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18513, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18514, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18515, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18516, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18517, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18518, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18519, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18520, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18521, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18522, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 808, + "name": "twisting_vines_plant", + "translation_key": "block.minecraft.twisting_vines_plant", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 18523, + "states": [ + { + "id": 18523, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 809, + "name": "crimson_roots", + "translation_key": "block.minecraft.crimson_roots", + "item_id": 216, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 18524, + "states": [ + { + "id": 18524, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 810, + "name": "crimson_planks", + "translation_key": "block.minecraft.crimson_planks", + "item_id": 32, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 18525, + "states": [ + { + "id": 18525, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 811, + "name": "warped_planks", + "translation_key": "block.minecraft.warped_planks", + "item_id": 33, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 18526, + "states": [ + { + "id": 18526, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 812, + "name": "crimson_slab", + "translation_key": "block.minecraft.crimson_slab", + "item_id": 240, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 18530, + "states": [ + { + "id": 18527, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 18528, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 18529, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 18530, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 18531, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 18532, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 813, + "name": "warped_slab", + "translation_key": "block.minecraft.warped_slab", + "item_id": 241, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 18536, + "states": [ + { + "id": 18533, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 18534, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 18535, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 18536, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 18537, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 18538, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 814, + "name": "crimson_pressure_plate", + "translation_key": "block.minecraft.crimson_pressure_plate", + "item_id": 686, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 18540, + "states": [ + { + "id": 18539, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18540, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 815, + "name": "warped_pressure_plate", + "translation_key": "block.minecraft.warped_pressure_plate", + "item_id": 687, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 18542, + "states": [ + { + "id": 18541, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18542, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 816, + "name": "crimson_fence", + "translation_key": "block.minecraft.crimson_fence", + "item_id": 298, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 18574, + "states": [ + { + "id": 18543, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76, + 77 + ] + }, + { + "id": 18544, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78, + 79 + ] + }, + { + "id": 18545, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76, + 77 + ] + }, + { + "id": 18546, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78, + 79 + ] + }, + { + "id": 18547, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76 + ] + }, + { + "id": 18548, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80, + 79 + ] + }, + { + "id": 18549, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76 + ] + }, + { + "id": 18550, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80, + 79 + ] + }, + { + "id": 18551, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 77 + ] + }, + { + "id": 18552, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81, + 79 + ] + }, + { + "id": 18553, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 77 + ] + }, + { + "id": 18554, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81, + 79 + ] + }, + { + "id": 18555, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 18556, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 82 + ] + }, + { + "id": 18557, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 18558, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 82 + ] + }, + { + "id": 18559, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76, + 77 + ] + }, + { + "id": 18560, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 18561, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76, + 77 + ] + }, + { + "id": 18562, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 18563, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76 + ] + }, + { + "id": 18564, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80 + ] + }, + { + "id": 18565, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76 + ] + }, + { + "id": 18566, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80 + ] + }, + { + "id": 18567, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 77 + ] + }, + { + "id": 18568, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81 + ] + }, + { + "id": 18569, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 77 + ] + }, + { + "id": 18570, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81 + ] + }, + { + "id": 18571, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83 + ] + }, + { + "id": 18572, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 84 + ] + }, + { + "id": 18573, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83 + ] + }, + { + "id": 18574, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 84 + ] + } + ] + }, + { + "id": 817, + "name": "warped_fence", + "translation_key": "block.minecraft.warped_fence", + "item_id": 299, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 18606, + "states": [ + { + "id": 18575, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76, + 77 + ] + }, + { + "id": 18576, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78, + 79 + ] + }, + { + "id": 18577, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76, + 77 + ] + }, + { + "id": 18578, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78, + 79 + ] + }, + { + "id": 18579, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76 + ] + }, + { + "id": 18580, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80, + 79 + ] + }, + { + "id": 18581, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 76 + ] + }, + { + "id": 18582, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80, + 79 + ] + }, + { + "id": 18583, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 77 + ] + }, + { + "id": 18584, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81, + 79 + ] + }, + { + "id": 18585, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75, + 77 + ] + }, + { + "id": 18586, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81, + 79 + ] + }, + { + "id": 18587, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 18588, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 82 + ] + }, + { + "id": 18589, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 18590, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 82 + ] + }, + { + "id": 18591, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76, + 77 + ] + }, + { + "id": 18592, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 18593, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76, + 77 + ] + }, + { + "id": 18594, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 18595, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76 + ] + }, + { + "id": 18596, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80 + ] + }, + { + "id": 18597, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 76 + ] + }, + { + "id": 18598, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 80 + ] + }, + { + "id": 18599, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 77 + ] + }, + { + "id": 18600, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81 + ] + }, + { + "id": 18601, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83, + 77 + ] + }, + { + "id": 18602, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 81 + ] + }, + { + "id": 18603, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83 + ] + }, + { + "id": 18604, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 84 + ] + }, + { + "id": 18605, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 83 + ] + }, + { + "id": 18606, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 84 + ] + } + ] + }, + { + "id": 818, + "name": "crimson_trapdoor", + "translation_key": "block.minecraft.crimson_trapdoor", + "item_id": 710, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 18622, + "states": [ + { + "id": 18607, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 18608, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 18609, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 18610, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 18611, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18612, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18613, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18614, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18615, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 18616, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 18617, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 18618, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 18619, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18620, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18621, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18622, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18623, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 18624, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 18625, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 18626, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 18627, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18628, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18629, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18630, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18631, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 18632, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 18633, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 18634, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 18635, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18636, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18637, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18638, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18639, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 18640, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 18641, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 18642, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 18643, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18644, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18645, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18646, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18647, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 18648, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 18649, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 18650, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 18651, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18652, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18653, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18654, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18655, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 18656, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 18657, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 18658, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 18659, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18660, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18661, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18662, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18663, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 18664, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 18665, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 18666, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 18667, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18668, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18669, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18670, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + } + ] + }, + { + "id": 819, + "name": "warped_trapdoor", + "translation_key": "block.minecraft.warped_trapdoor", + "item_id": 711, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 18686, + "states": [ + { + "id": 18671, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 18672, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 18673, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 18674, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 18675, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18676, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18677, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18678, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18679, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 18680, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 18681, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 18682, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 18683, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18684, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18685, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18686, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18687, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 18688, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 18689, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 18690, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 18691, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18692, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18693, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18694, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18695, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 18696, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 18697, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 18698, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 18699, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18700, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18701, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18702, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18703, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 18704, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 18705, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 18706, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 18707, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18708, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18709, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18710, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18711, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 18712, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 18713, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 18714, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 18715, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18716, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18717, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18718, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18719, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 18720, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 18721, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 18722, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 18723, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18724, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18725, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18726, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 92 + ] + }, + { + "id": 18727, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 18728, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 18729, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 18730, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 18731, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18732, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18733, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + }, + { + "id": 18734, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 93 + ] + } + ] + }, + { + "id": 820, + "name": "crimson_fence_gate", + "translation_key": "block.minecraft.crimson_fence_gate", + "item_id": 721, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "in_wall", + "values": [ + "true", + "false" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 18742, + "states": [ + { + "id": 18735, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18736, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18737, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 18738, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 18739, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18740, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18741, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 18742, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 18743, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18744, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18745, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 18746, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 18747, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18748, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18749, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 18750, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 18751, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18752, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18753, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 18754, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 18755, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18756, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18757, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 18758, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 18759, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18760, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18761, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 18762, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 18763, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18764, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18765, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 18766, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + } + ] + }, + { + "id": 821, + "name": "warped_fence_gate", + "translation_key": "block.minecraft.warped_fence_gate", + "item_id": 722, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "in_wall", + "values": [ + "true", + "false" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 18774, + "states": [ + { + "id": 18767, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18768, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18769, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 18770, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 18771, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18772, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18773, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 18774, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 18775, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18776, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18777, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 18778, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 18779, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18780, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18781, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 18782, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 75 + ] + }, + { + "id": 18783, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18784, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18785, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 18786, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 18787, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18788, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18789, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 18790, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 18791, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18792, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18793, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 18794, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 18795, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18796, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 18797, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + }, + { + "id": 18798, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 78 + ] + } + ] + }, + { + "id": 822, + "name": "crimson_stairs", + "translation_key": "block.minecraft.crimson_stairs", + "item_id": 371, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 18810, + "states": [ + { + "id": 18799, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 18800, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 18801, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 18802, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 18803, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 18804, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 18805, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 18806, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 18807, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 18808, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 18809, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 18810, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 18811, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 18812, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 18813, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 18814, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 18815, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 18816, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 18817, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 18818, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 18819, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 18820, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 18821, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 18822, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 18823, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 18824, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 18825, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 18826, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 18827, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 18828, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 18829, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 18830, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 18831, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 18832, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 18833, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 18834, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 18835, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 18836, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 18837, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 18838, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 18839, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 18840, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 18841, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 18842, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 18843, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 18844, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 18845, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 18846, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 18847, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 18848, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 18849, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 18850, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 18851, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 18852, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 18853, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 18854, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 18855, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 18856, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 18857, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 18858, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 18859, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 18860, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 18861, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 18862, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 18863, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 18864, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 18865, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 18866, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 18867, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 18868, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 18869, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 18870, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 18871, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 18872, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 18873, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 18874, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 18875, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 18876, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 18877, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 18878, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 823, + "name": "warped_stairs", + "translation_key": "block.minecraft.warped_stairs", + "item_id": 372, + "hardness": 2.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 18890, + "states": [ + { + "id": 18879, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 18880, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 18881, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 18882, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 18883, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 18884, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 18885, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 18886, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 18887, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 18888, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 18889, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 18890, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 18891, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 18892, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 18893, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 18894, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 18895, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 18896, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 18897, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 18898, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 18899, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 18900, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 18901, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 18902, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 18903, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 18904, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 18905, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 18906, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 18907, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 18908, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 18909, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 18910, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 18911, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 18912, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 18913, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 18914, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 18915, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 18916, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 18917, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 18918, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 18919, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 18920, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 18921, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 18922, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 18923, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 18924, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 18925, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 18926, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 18927, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 18928, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 18929, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 18930, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 18931, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 18932, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 18933, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 18934, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 18935, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 18936, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 18937, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 18938, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 18939, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 18940, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 18941, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 18942, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 18943, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 18944, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 18945, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 18946, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 18947, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 18948, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 18949, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 18950, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 18951, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 18952, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 18953, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 18954, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 18955, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 18956, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 18957, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 18958, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 824, + "name": "crimson_button", + "translation_key": "block.minecraft.crimson_button", + "item_id": 671, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "face", + "values": [ + "floor", + "wall", + "ceiling" + ] + }, + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 18968, + "states": [ + { + "id": 18959, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18960, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18961, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18962, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18963, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18964, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18965, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18966, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18967, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18968, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18969, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18970, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18971, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18972, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18973, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18974, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18975, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18976, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18977, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18978, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18979, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18980, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18981, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18982, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 825, + "name": "warped_button", + "translation_key": "block.minecraft.warped_button", + "item_id": 672, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "face", + "values": [ + "floor", + "wall", + "ceiling" + ] + }, + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 18992, + "states": [ + { + "id": 18983, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18984, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18985, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18986, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18987, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18988, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18989, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18990, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18991, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18992, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18993, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18994, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18995, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18996, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18997, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18998, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 18999, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 19000, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 19001, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 19002, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 19003, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 19004, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 19005, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 19006, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 826, + "name": "crimson_door", + "translation_key": "block.minecraft.crimson_door", + "item_id": 698, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "upper", + "lower" + ] + }, + { + "name": "hinge", + "values": [ + "left", + "right" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 19018, + "states": [ + { + "id": 19007, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19008, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19009, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19010, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19011, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19012, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19013, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19014, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19015, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19016, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19017, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19018, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19019, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19020, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19021, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19022, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19023, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19024, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19025, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19026, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19027, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19028, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19029, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19030, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19031, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19032, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19033, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19034, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19035, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19036, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19037, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19038, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19039, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19040, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19041, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19042, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19043, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19044, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19045, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19046, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19047, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19048, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19049, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19050, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19051, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19052, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19053, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19054, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19055, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19056, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19057, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19058, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19059, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19060, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19061, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19062, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19063, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19064, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19065, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19066, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19067, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19068, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19069, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19070, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + } + ] + }, + { + "id": 827, + "name": "warped_door", + "translation_key": "block.minecraft.warped_door", + "item_id": 699, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "upper", + "lower" + ] + }, + { + "name": "hinge", + "values": [ + "left", + "right" + ] + }, + { + "name": "open", + "values": [ + "true", + "false" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 19082, + "states": [ + { + "id": 19071, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19072, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19073, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19074, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19075, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19076, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19077, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19078, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19079, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19080, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19081, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19082, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19083, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19084, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19085, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19086, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19087, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19088, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19089, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19090, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19091, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19092, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19093, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19094, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19095, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19096, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19097, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19098, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19099, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19100, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19101, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19102, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19103, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19104, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19105, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19106, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19107, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19108, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19109, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19110, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19111, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19112, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19113, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19114, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19115, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19116, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19117, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19118, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 66 + ] + }, + { + "id": 19119, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19120, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19121, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19122, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19123, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19124, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19125, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19126, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19127, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19128, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 67 + ] + }, + { + "id": 19129, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19130, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19131, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19132, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 65 + ] + }, + { + "id": 19133, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + }, + { + "id": 19134, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 64 + ] + } + ] + }, + { + "id": 828, + "name": "crimson_sign", + "translation_key": "block.minecraft.crimson_sign", + "item_id": 855, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 830, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 19136, + "states": [ + { + "id": 19135, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19136, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19137, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19138, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19139, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19140, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19141, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19142, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19143, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19144, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19145, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19146, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19147, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19148, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19149, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19150, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19151, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19152, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19153, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19154, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19155, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19156, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19157, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19158, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19159, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19160, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19161, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19162, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19163, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19164, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19165, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19166, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + } + ] + }, + { + "id": 829, + "name": "warped_sign", + "translation_key": "block.minecraft.warped_sign", + "item_id": 856, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "wall_variant_id": 831, + "properties": [ + { + "name": "rotation", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 19168, + "states": [ + { + "id": 19167, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19168, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19169, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19170, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19171, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19172, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19173, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19174, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19175, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19176, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19177, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19178, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19179, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19180, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19181, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19182, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19183, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19184, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19185, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19186, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19187, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19188, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19189, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19190, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19191, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19192, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19193, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19194, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19195, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19196, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19197, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19198, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + } + ] + }, + { + "id": 830, + "name": "crimson_wall_sign", + "translation_key": "block.minecraft.crimson_sign", + "item_id": 855, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 19200, + "states": [ + { + "id": 19199, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19200, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19201, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19202, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19203, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19204, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19205, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19206, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + } + ] + }, + { + "id": 831, + "name": "warped_wall_sign", + "translation_key": "block.minecraft.warped_sign", + "item_id": 856, + "hardness": 1.0, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 19208, + "states": [ + { + "id": 19207, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19208, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19209, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19210, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19211, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19212, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19213, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + }, + { + "id": 19214, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [], + "block_entity_type": 7 + } + ] + }, + { + "id": 832, + "name": "structure_block", + "translation_key": "block.minecraft.structure_block", + "item_id": 754, + "hardness": -1.0, + "blast_resistance": 3600000.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "mode", + "values": [ + "save", + "load", + "corner", + "data" + ] + } + ], + "default_state_id": 19216, + "states": [ + { + "id": 19215, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 20 + }, + { + "id": 19216, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 20 + }, + { + "id": 19217, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 20 + }, + { + "id": 19218, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 20 + } + ] + }, + { + "id": 833, + "name": "jigsaw", + "translation_key": "block.minecraft.jigsaw", + "item_id": 755, + "hardness": -1.0, + "blast_resistance": 3600000.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "orientation", + "values": [ + "down_east", + "down_north", + "down_south", + "down_west", + "up_east", + "up_north", + "up_south", + "up_west", + "west_up", + "east_up", + "north_up", + "south_up" + ] + } + ], + "default_state_id": 19229, + "states": [ + { + "id": 19219, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 31 + }, + { + "id": 19220, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 31 + }, + { + "id": 19221, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 31 + }, + { + "id": 19222, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 31 + }, + { + "id": 19223, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 31 + }, + { + "id": 19224, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 31 + }, + { + "id": 19225, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 31 + }, + { + "id": 19226, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 31 + }, + { + "id": 19227, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 31 + }, + { + "id": 19228, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 31 + }, + { + "id": 19229, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 31 + }, + { + "id": 19230, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 31 + } + ] + }, + { + "id": 834, + "name": "composter", + "translation_key": "block.minecraft.composter", + "item_id": 1153, + "hardness": 0.6, + "blast_resistance": 0.6, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "level", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8" + ] + } + ], + "default_state_id": 19231, + "states": [ + { + "id": 19231, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 300, + 301, + 302, + 303 + ] + }, + { + "id": 19232, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 300, + 301, + 302, + 303 + ] + }, + { + "id": 19233, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 300, + 301, + 302, + 303 + ] + }, + { + "id": 19234, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 300, + 301, + 302, + 303 + ] + }, + { + "id": 19235, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 300, + 301, + 302, + 303 + ] + }, + { + "id": 19236, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 300, + 301, + 302, + 303 + ] + }, + { + "id": 19237, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 300, + 301, + 302, + 303 + ] + }, + { + "id": 19238, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 300, + 301, + 302, + 303 + ] + }, + { + "id": 19239, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 70, + 300, + 301, + 302, + 303 + ] + } + ] + }, + { + "id": 835, + "name": "target", + "translation_key": "block.minecraft.target", + "item_id": 649, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "power", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + } + ], + "default_state_id": 19240, + "states": [ + { + "id": 19240, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 19241, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 19242, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 19243, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 19244, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 19245, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 19246, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 19247, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 19248, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 19249, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 19250, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 19251, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 19252, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 19253, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 19254, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 19255, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 836, + "name": "bee_nest", + "translation_key": "block.minecraft.bee_nest", + "item_id": 1171, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "honey_level", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5" + ] + } + ], + "default_state_id": 19256, + "states": [ + { + "id": 19256, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19257, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19258, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19259, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19260, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19261, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19262, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19263, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19264, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19265, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19266, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19267, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19268, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19269, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19270, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19271, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19272, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19273, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19274, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19275, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19276, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19277, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19278, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19279, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + } + ] + }, + { + "id": 837, + "name": "beehive", + "translation_key": "block.minecraft.beehive", + "item_id": 1172, + "hardness": 0.6, + "blast_resistance": 0.6, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "honey_level", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5" + ] + } + ], + "default_state_id": 19280, + "states": [ + { + "id": 19280, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19281, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19282, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19283, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19284, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19285, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19286, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19287, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19288, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19289, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19290, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19291, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19292, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19293, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19294, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19295, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19296, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19297, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19298, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19299, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19300, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19301, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19302, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + }, + { + "id": 19303, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 33 + } + ] + }, + { + "id": 838, + "name": "honey_block", + "translation_key": "block.minecraft.honey_block", + "item_id": 643, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 0.4, + "jump_factor": 0.5, + "properties": [], + "default_state_id": 19304, + "states": [ + { + "id": 19304, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 74 + ] + } + ] + }, + { + "id": 839, + "name": "honeycomb_block", + "translation_key": "block.minecraft.honeycomb_block", + "item_id": 1174, + "hardness": 0.6, + "blast_resistance": 0.6, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 19305, + "states": [ + { + "id": 19305, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 840, + "name": "netherite_block", + "translation_key": "block.minecraft.netherite_block", + "item_id": 78, + "hardness": 50.0, + "blast_resistance": 1200.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 19306, + "states": [ + { + "id": 19306, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 841, + "name": "ancient_debris", + "translation_key": "block.minecraft.ancient_debris", + "item_id": 67, + "hardness": 30.0, + "blast_resistance": 1200.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 19307, + "states": [ + { + "id": 19307, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 842, + "name": "crying_obsidian", + "translation_key": "block.minecraft.crying_obsidian", + "item_id": 1176, + "hardness": 50.0, + "blast_resistance": 1200.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 19308, + "states": [ + { + "id": 19308, + "luminance": 10, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 843, + "name": "respawn_anchor", + "translation_key": "block.minecraft.respawn_anchor", + "item_id": 1189, + "hardness": 50.0, + "blast_resistance": 1200.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "charges", + "values": [ + "0", + "1", + "2", + "3", + "4" + ] + } + ], + "default_state_id": 19309, + "states": [ + { + "id": 19309, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 19310, + "luminance": 3, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 19311, + "luminance": 7, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 19312, + "luminance": 11, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 19313, + "luminance": 15, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 844, + "name": "potted_crimson_fungus", + "translation_key": "block.minecraft.potted_crimson_fungus", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 19314, + "states": [ + { + "id": 19314, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 845, + "name": "potted_warped_fungus", + "translation_key": "block.minecraft.potted_warped_fungus", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 19315, + "states": [ + { + "id": 19315, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 846, + "name": "potted_crimson_roots", + "translation_key": "block.minecraft.potted_crimson_roots", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 19316, + "states": [ + { + "id": 19316, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 847, + "name": "potted_warped_roots", + "translation_key": "block.minecraft.potted_warped_roots", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 19317, + "states": [ + { + "id": 19317, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 848, + "name": "lodestone", + "translation_key": "block.minecraft.lodestone", + "item_id": 1175, + "hardness": 3.5, + "blast_resistance": 3.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 19318, + "states": [ + { + "id": 19318, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 849, + "name": "blackstone", + "translation_key": "block.minecraft.blackstone", + "item_id": 1177, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 19319, + "states": [ + { + "id": 19319, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 850, + "name": "blackstone_stairs", + "translation_key": "block.minecraft.blackstone_stairs", + "item_id": 1179, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 19331, + "states": [ + { + "id": 19320, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 19321, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 19322, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 19323, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 19324, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 19325, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 19326, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 19327, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 19328, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 19329, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 19330, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 19331, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 19332, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 19333, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 19334, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 19335, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 19336, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 19337, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 19338, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 19339, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 19340, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 19341, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 19342, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 19343, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 19344, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 19345, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 19346, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 19347, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 19348, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 19349, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 19350, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 19351, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 19352, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 19353, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 19354, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 19355, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 19356, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 19357, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 19358, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 19359, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 19360, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 19361, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 19362, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 19363, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 19364, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 19365, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 19366, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 19367, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 19368, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 19369, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 19370, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 19371, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 19372, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 19373, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 19374, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 19375, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 19376, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 19377, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 19378, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 19379, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 19380, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 19381, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 19382, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 19383, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 19384, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 19385, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 19386, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 19387, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 19388, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 19389, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 19390, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 19391, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 19392, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 19393, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 19394, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 19395, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 19396, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 19397, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 19398, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 19399, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 851, + "name": "blackstone_wall", + "translation_key": "block.minecraft.blackstone_wall", + "item_id": 390, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "north", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "south", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "none", + "low", + "tall" + ] + } + ], + "default_state_id": 19403, + "states": [ + { + "id": 19400, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 19401, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 19402, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 19403, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 19404, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 19405, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 19406, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 19407, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 19408, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 19409, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 19410, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 19411, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 19412, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 19413, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 19414, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 19415, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 19416, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 19417, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 19418, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 19419, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 19420, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 19421, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 19422, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 19423, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 19424, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 19425, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 19426, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 19427, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 19428, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 19429, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 19430, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 19431, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 19432, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 19433, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 19434, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 19435, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 19436, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 19437, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 19438, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 19439, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 19440, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 19441, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 19442, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 19443, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 19444, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 19445, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 19446, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 19447, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 19448, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 19449, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19450, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19451, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 19452, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19453, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19454, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 19455, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19456, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19457, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 19458, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19459, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19460, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 19461, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19462, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19463, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 19464, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19465, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19466, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 19467, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19468, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19469, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 19470, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19471, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19472, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 19473, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 19474, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 19475, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 19476, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 19477, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 19478, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 19479, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 19480, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 19481, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 19482, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 19483, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 19484, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 19485, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19486, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19487, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 19488, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19489, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19490, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 19491, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19492, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19493, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 19494, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19495, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19496, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 19497, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19498, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19499, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 19500, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19501, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19502, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 19503, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19504, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19505, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 19506, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19507, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19508, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 19509, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 19510, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 19511, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 19512, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 19513, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 19514, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 19515, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 19516, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 19517, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 19518, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 19519, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 19520, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 19521, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 19522, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 19523, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 19524, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 19525, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 19526, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 19527, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 19528, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 19529, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 19530, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 19531, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 19532, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 19533, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 19534, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 19535, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 19536, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 19537, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 19538, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 19539, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 19540, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 19541, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 19542, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 19543, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 19544, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 19545, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 19546, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 19547, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 19548, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 19549, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 19550, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 19551, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 19552, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 19553, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 19554, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 19555, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 19556, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 19557, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19558, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19559, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 19560, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19561, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19562, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 19563, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19564, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19565, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 19566, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19567, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19568, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 19569, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19570, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19571, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 19572, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19573, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19574, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 19575, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19576, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19577, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 19578, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19579, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19580, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 19581, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 19582, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 19583, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 19584, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 19585, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 19586, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 19587, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 19588, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 19589, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 19590, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 19591, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 19592, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 19593, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19594, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19595, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 19596, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19597, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19598, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 19599, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19600, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19601, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 19602, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19603, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19604, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 19605, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19606, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19607, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 19608, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19609, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19610, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 19611, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19612, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19613, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 19614, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19615, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19616, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 19617, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 19618, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 19619, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 19620, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 19621, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 19622, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 19623, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 19624, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 19625, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 19626, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 19627, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 19628, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 19629, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 19630, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 19631, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 19632, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 19633, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 19634, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 19635, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 19636, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 19637, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 19638, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 19639, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 19640, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 19641, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 19642, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 19643, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 19644, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 19645, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 19646, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 19647, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 19648, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 19649, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 19650, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 19651, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 19652, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 19653, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 19654, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 19655, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 19656, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 19657, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 19658, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 19659, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 19660, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 19661, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 19662, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 19663, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 19664, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 19665, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19666, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19667, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 19668, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19669, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19670, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 19671, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19672, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19673, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 19674, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19675, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19676, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 19677, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19678, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19679, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 19680, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19681, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19682, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 19683, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19684, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19685, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 19686, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19687, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19688, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 19689, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 19690, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 19691, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 19692, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 19693, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 19694, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 19695, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 19696, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 19697, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 19698, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 19699, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 19700, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 19701, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19702, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19703, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 19704, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19705, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19706, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 19707, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19708, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19709, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 19710, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19711, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19712, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 19713, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19714, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19715, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 19716, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19717, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19718, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 19719, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19720, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19721, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 19722, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19723, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + } + ] + }, + { + "id": 852, + "name": "blackstone_slab", + "translation_key": "block.minecraft.blackstone_slab", + "item_id": 1178, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 19727, + "states": [ + { + "id": 19724, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 19725, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 19726, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 19727, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 19728, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 19729, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 853, + "name": "polished_blackstone", + "translation_key": "block.minecraft.polished_blackstone", + "item_id": 1181, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 19730, + "states": [ + { + "id": 19730, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 854, + "name": "polished_blackstone_bricks", + "translation_key": "block.minecraft.polished_blackstone_bricks", + "item_id": 1185, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 19731, + "states": [ + { + "id": 19731, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 855, + "name": "cracked_polished_blackstone_bricks", + "translation_key": "block.minecraft.cracked_polished_blackstone_bricks", + "item_id": 1188, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 19732, + "states": [ + { + "id": 19732, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 856, + "name": "chiseled_polished_blackstone", + "translation_key": "block.minecraft.chiseled_polished_blackstone", + "item_id": 1184, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 19733, + "states": [ + { + "id": 19733, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 857, + "name": "polished_blackstone_brick_slab", + "translation_key": "block.minecraft.polished_blackstone_brick_slab", + "item_id": 1186, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 19737, + "states": [ + { + "id": 19734, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 19735, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 19736, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 19737, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 19738, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 19739, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 858, + "name": "polished_blackstone_brick_stairs", + "translation_key": "block.minecraft.polished_blackstone_brick_stairs", + "item_id": 1187, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 19751, + "states": [ + { + "id": 19740, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 19741, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 19742, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 19743, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 19744, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 19745, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 19746, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 19747, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 19748, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 19749, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 19750, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 19751, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 19752, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 19753, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 19754, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 19755, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 19756, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 19757, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 19758, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 19759, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 19760, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 19761, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 19762, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 19763, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 19764, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 19765, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 19766, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 19767, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 19768, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 19769, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 19770, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 19771, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 19772, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 19773, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 19774, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 19775, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 19776, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 19777, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 19778, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 19779, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 19780, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 19781, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 19782, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 19783, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 19784, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 19785, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 19786, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 19787, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 19788, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 19789, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 19790, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 19791, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 19792, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 19793, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 19794, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 19795, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 19796, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 19797, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 19798, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 19799, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 19800, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 19801, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 19802, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 19803, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 19804, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 19805, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 19806, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 19807, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 19808, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 19809, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 19810, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 19811, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 19812, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 19813, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 19814, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 19815, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 19816, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 19817, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 19818, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 19819, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 859, + "name": "polished_blackstone_brick_wall", + "translation_key": "block.minecraft.polished_blackstone_brick_wall", + "item_id": 392, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "north", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "south", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "none", + "low", + "tall" + ] + } + ], + "default_state_id": 19823, + "states": [ + { + "id": 19820, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 19821, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 19822, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 19823, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 19824, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 19825, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 19826, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 19827, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 19828, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 19829, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 19830, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 19831, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 19832, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 19833, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 19834, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 19835, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 19836, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 19837, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 19838, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 19839, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 19840, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 19841, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 19842, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 19843, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 19844, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 19845, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 19846, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 19847, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 19848, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 19849, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 19850, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 19851, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 19852, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 19853, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 19854, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 19855, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 19856, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 19857, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 19858, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 19859, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 19860, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 19861, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 19862, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 19863, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 19864, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 19865, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 19866, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 19867, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 19868, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 19869, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19870, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19871, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 19872, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19873, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19874, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 19875, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19876, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19877, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 19878, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19879, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19880, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 19881, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19882, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19883, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 19884, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19885, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19886, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 19887, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19888, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19889, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 19890, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19891, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19892, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 19893, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 19894, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 19895, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 19896, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 19897, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 19898, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 19899, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 19900, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 19901, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 19902, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 19903, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 19904, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 19905, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19906, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19907, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 19908, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19909, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19910, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 19911, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19912, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19913, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 19914, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19915, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19916, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 19917, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19918, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19919, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 19920, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19921, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19922, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 19923, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19924, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19925, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 19926, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19927, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 19928, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 19929, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 19930, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 19931, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 19932, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 19933, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 19934, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 19935, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 19936, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 19937, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 19938, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 19939, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 19940, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 19941, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 19942, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 19943, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 19944, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 19945, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 19946, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 19947, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 19948, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 19949, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 19950, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 19951, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 19952, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 19953, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 19954, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 19955, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 19956, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 19957, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 19958, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 19959, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 19960, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 19961, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 19962, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 19963, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 19964, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 19965, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 19966, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 19967, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 19968, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 19969, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 19970, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 19971, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 19972, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 19973, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 19974, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 19975, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 19976, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 19977, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19978, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19979, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 19980, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19981, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19982, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 19983, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19984, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19985, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 19986, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19987, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19988, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 19989, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19990, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19991, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 19992, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19993, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 19994, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 19995, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19996, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19997, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 19998, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 19999, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20000, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 20001, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20002, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20003, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 20004, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20005, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20006, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 20007, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20008, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20009, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 20010, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20011, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20012, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20013, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20014, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20015, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20016, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20017, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20018, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20019, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20020, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20021, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20022, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20023, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20024, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20025, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20026, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20027, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20028, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20029, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20030, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20031, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20032, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20033, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20034, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20035, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20036, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 20037, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 20038, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 20039, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 20040, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 20041, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 20042, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 20043, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 20044, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 20045, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 20046, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 20047, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 20048, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 20049, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 20050, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 20051, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 20052, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 20053, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 20054, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 20055, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 20056, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 20057, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 20058, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 20059, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 20060, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 20061, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 20062, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 20063, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 20064, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 20065, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 20066, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 20067, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 20068, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 20069, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 20070, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 20071, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 20072, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 20073, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20074, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20075, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 20076, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20077, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20078, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 20079, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20080, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20081, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 20082, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20083, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20084, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20085, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20086, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20087, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20088, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20089, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20090, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20091, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20092, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20093, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20094, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20095, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20096, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20097, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20098, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20099, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20100, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20101, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20102, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20103, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20104, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20105, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20106, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20107, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20108, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 20109, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20110, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20111, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 20112, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20113, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20114, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 20115, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20116, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20117, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 20118, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20119, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20120, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20121, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20122, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20123, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20124, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20125, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20126, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20127, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20128, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20129, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20130, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20131, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20132, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20133, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20134, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20135, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20136, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20137, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20138, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20139, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20140, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20141, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20142, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20143, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + } + ] + }, + { + "id": 860, + "name": "gilded_blackstone", + "translation_key": "block.minecraft.gilded_blackstone", + "item_id": 1180, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 20144, + "states": [ + { + "id": 20144, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 861, + "name": "polished_blackstone_stairs", + "translation_key": "block.minecraft.polished_blackstone_stairs", + "item_id": 1183, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20156, + "states": [ + { + "id": 20145, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 20146, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 20147, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 20148, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 20149, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 20150, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 20151, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 20152, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 20153, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 20154, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 20155, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 20156, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 20157, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 20158, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 20159, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 20160, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 20161, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 20162, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 20163, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 20164, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 20165, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 20166, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 20167, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 20168, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 20169, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 20170, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 20171, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 20172, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 20173, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 20174, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 20175, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 20176, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 20177, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 20178, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 20179, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 20180, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 20181, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 20182, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 20183, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 20184, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 20185, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 20186, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 20187, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 20188, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 20189, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 20190, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 20191, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 20192, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 20193, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 20194, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 20195, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 20196, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 20197, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 20198, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 20199, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 20200, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 20201, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 20202, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 20203, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 20204, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 20205, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 20206, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 20207, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 20208, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 20209, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 20210, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 20211, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 20212, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 20213, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 20214, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 20215, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 20216, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 20217, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 20218, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 20219, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 20220, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 20221, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 20222, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 20223, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 20224, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 862, + "name": "polished_blackstone_slab", + "translation_key": "block.minecraft.polished_blackstone_slab", + "item_id": 1182, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20228, + "states": [ + { + "id": 20225, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 20226, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 20227, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 20228, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 20229, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 20230, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 863, + "name": "polished_blackstone_pressure_plate", + "translation_key": "block.minecraft.polished_blackstone_pressure_plate", + "item_id": 674, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20232, + "states": [ + { + "id": 20231, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 20232, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 864, + "name": "polished_blackstone_button", + "translation_key": "block.minecraft.polished_blackstone_button", + "item_id": 661, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "face", + "values": [ + "floor", + "wall", + "ceiling" + ] + }, + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20242, + "states": [ + { + "id": 20233, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 20234, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 20235, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 20236, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 20237, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 20238, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 20239, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 20240, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 20241, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 20242, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 20243, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 20244, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 20245, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 20246, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 20247, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 20248, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 20249, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 20250, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 20251, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 20252, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 20253, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 20254, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 20255, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 20256, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 865, + "name": "polished_blackstone_wall", + "translation_key": "block.minecraft.polished_blackstone_wall", + "item_id": 391, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "north", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "south", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "none", + "low", + "tall" + ] + } + ], + "default_state_id": 20260, + "states": [ + { + "id": 20257, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 20258, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 20259, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 20260, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 20261, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 20262, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 20263, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 20264, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 20265, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 20266, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 20267, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 20268, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 20269, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 20270, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 20271, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 20272, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 20273, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 20274, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 20275, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 20276, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 20277, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 20278, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 20279, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 20280, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 20281, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 20282, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 20283, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 20284, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 20285, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 20286, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 20287, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 20288, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 20289, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 20290, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 20291, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 20292, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 20293, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 20294, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 20295, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 20296, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 20297, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 20298, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 20299, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 20300, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 20301, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 20302, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 20303, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 20304, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 20305, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 20306, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20307, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20308, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 20309, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20310, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20311, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 20312, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 20313, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 20314, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 20315, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 20316, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 20317, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 20318, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20319, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20320, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 20321, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20322, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20323, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 20324, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 20325, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 20326, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 20327, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 20328, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 20329, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 20330, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 20331, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 20332, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 20333, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 20334, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 20335, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 20336, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 20337, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 20338, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 20339, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 20340, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 20341, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 20342, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20343, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20344, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 20345, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20346, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20347, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 20348, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 20349, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 20350, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 20351, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 20352, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 20353, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 20354, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20355, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20356, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 20357, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20358, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20359, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 20360, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 20361, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 20362, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 20363, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 20364, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 20365, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 20366, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 20367, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 20368, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 20369, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 20370, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 20371, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 20372, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 20373, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 20374, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 20375, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 20376, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 20377, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 20378, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 20379, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 20380, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 20381, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 20382, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 20383, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 20384, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 20385, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 20386, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 20387, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 20388, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 20389, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 20390, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 20391, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 20392, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 20393, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 20394, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 20395, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 20396, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 20397, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 20398, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 20399, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 20400, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 20401, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 20402, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20403, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20404, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 20405, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20406, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20407, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 20408, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20409, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20410, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 20411, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20412, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20413, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20414, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20415, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20416, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20417, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20418, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20419, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20420, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20421, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20422, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20423, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20424, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20425, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20426, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20427, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20428, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20429, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20430, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20431, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20432, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20433, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20434, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20435, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20436, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20437, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 20438, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20439, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20440, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 20441, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20442, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20443, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 20444, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20445, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20446, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 20447, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20448, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20449, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20450, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20451, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20452, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20453, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20454, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20455, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20456, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20457, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20458, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20459, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20460, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20461, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20462, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20463, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20464, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20465, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20466, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20467, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20468, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20469, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20470, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20471, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20472, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20473, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 20474, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 20475, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 20476, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 20477, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 20478, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 20479, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 20480, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 20481, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 20482, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 20483, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 20484, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 20485, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 20486, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 20487, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 20488, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 20489, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 20490, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 20491, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 20492, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 20493, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 20494, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 20495, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 20496, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 20497, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 20498, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 20499, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 20500, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 20501, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 20502, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 20503, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 20504, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 20505, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 20506, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 20507, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 20508, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 20509, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 20510, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20511, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20512, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 20513, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20514, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20515, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 20516, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20517, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20518, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 20519, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20520, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20521, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20522, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20523, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20524, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20525, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20526, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20527, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20528, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20529, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20530, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20531, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20532, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20533, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20534, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20535, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20536, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20537, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20538, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20539, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20540, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20541, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20542, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20543, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20544, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20545, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 20546, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20547, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20548, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 20549, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20550, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 20551, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 20552, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20553, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20554, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 20555, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20556, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 20557, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20558, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20559, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20560, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20561, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20562, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20563, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20564, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20565, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20566, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20567, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20568, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20569, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20570, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20571, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20572, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 20573, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20574, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 20575, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20576, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20577, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20578, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 20579, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 20580, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + } + ] + }, + { + "id": 866, + "name": "chiseled_nether_bricks", + "translation_key": "block.minecraft.chiseled_nether_bricks", + "item_id": 346, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 20581, + "states": [ + { + "id": 20581, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 867, + "name": "cracked_nether_bricks", + "translation_key": "block.minecraft.cracked_nether_bricks", + "item_id": 345, + "hardness": 2.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 20582, + "states": [ + { + "id": 20582, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 868, + "name": "quartz_bricks", + "translation_key": "block.minecraft.quartz_bricks", + "item_id": 402, + "hardness": 0.8, + "blast_resistance": 0.8, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 20583, + "states": [ + { + "id": 20583, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 869, + "name": "candle", + "translation_key": "block.minecraft.candle", + "item_id": 1190, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "candles", + "values": [ + "1", + "2", + "3", + "4" + ] + }, + { + "name": "lit", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20587, + "states": [ + { + "id": 20584, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20585, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20586, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20587, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20588, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20589, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20590, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20591, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20592, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20593, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20594, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20595, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20596, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20597, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20598, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20599, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + } + ] + }, + { + "id": 870, + "name": "white_candle", + "translation_key": "block.minecraft.white_candle", + "item_id": 1191, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "candles", + "values": [ + "1", + "2", + "3", + "4" + ] + }, + { + "name": "lit", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20603, + "states": [ + { + "id": 20600, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20601, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20602, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20603, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20604, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20605, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20606, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20607, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20608, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20609, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20610, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20611, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20612, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20613, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20614, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20615, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + } + ] + }, + { + "id": 871, + "name": "orange_candle", + "translation_key": "block.minecraft.orange_candle", + "item_id": 1192, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "candles", + "values": [ + "1", + "2", + "3", + "4" + ] + }, + { + "name": "lit", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20619, + "states": [ + { + "id": 20616, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20617, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20618, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20619, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20620, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20621, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20622, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20623, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20624, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20625, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20626, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20627, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20628, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20629, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20630, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20631, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + } + ] + }, + { + "id": 872, + "name": "magenta_candle", + "translation_key": "block.minecraft.magenta_candle", + "item_id": 1193, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "candles", + "values": [ + "1", + "2", + "3", + "4" + ] + }, + { + "name": "lit", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20635, + "states": [ + { + "id": 20632, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20633, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20634, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20635, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20636, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20637, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20638, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20639, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20640, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20641, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20642, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20643, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20644, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20645, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20646, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20647, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + } + ] + }, + { + "id": 873, + "name": "light_blue_candle", + "translation_key": "block.minecraft.light_blue_candle", + "item_id": 1194, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "candles", + "values": [ + "1", + "2", + "3", + "4" + ] + }, + { + "name": "lit", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20651, + "states": [ + { + "id": 20648, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20649, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20650, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20651, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20652, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20653, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20654, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20655, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20656, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20657, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20658, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20659, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20660, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20661, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20662, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20663, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + } + ] + }, + { + "id": 874, + "name": "yellow_candle", + "translation_key": "block.minecraft.yellow_candle", + "item_id": 1195, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "candles", + "values": [ + "1", + "2", + "3", + "4" + ] + }, + { + "name": "lit", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20667, + "states": [ + { + "id": 20664, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20665, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20666, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20667, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20668, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20669, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20670, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20671, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20672, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20673, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20674, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20675, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20676, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20677, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20678, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20679, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + } + ] + }, + { + "id": 875, + "name": "lime_candle", + "translation_key": "block.minecraft.lime_candle", + "item_id": 1196, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "candles", + "values": [ + "1", + "2", + "3", + "4" + ] + }, + { + "name": "lit", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20683, + "states": [ + { + "id": 20680, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20681, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20682, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20683, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20684, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20685, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20686, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20687, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20688, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20689, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20690, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20691, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20692, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20693, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20694, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20695, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + } + ] + }, + { + "id": 876, + "name": "pink_candle", + "translation_key": "block.minecraft.pink_candle", + "item_id": 1197, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "candles", + "values": [ + "1", + "2", + "3", + "4" + ] + }, + { + "name": "lit", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20699, + "states": [ + { + "id": 20696, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20697, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20698, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20699, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20700, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20701, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20702, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20703, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20704, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20705, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20706, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20707, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20708, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20709, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20710, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20711, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + } + ] + }, + { + "id": 877, + "name": "gray_candle", + "translation_key": "block.minecraft.gray_candle", + "item_id": 1198, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "candles", + "values": [ + "1", + "2", + "3", + "4" + ] + }, + { + "name": "lit", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20715, + "states": [ + { + "id": 20712, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20713, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20714, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20715, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20716, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20717, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20718, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20719, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20720, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20721, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20722, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20723, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20724, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20725, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20726, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20727, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + } + ] + }, + { + "id": 878, + "name": "light_gray_candle", + "translation_key": "block.minecraft.light_gray_candle", + "item_id": 1199, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "candles", + "values": [ + "1", + "2", + "3", + "4" + ] + }, + { + "name": "lit", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20731, + "states": [ + { + "id": 20728, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20729, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20730, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20731, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20732, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20733, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20734, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20735, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20736, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20737, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20738, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20739, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20740, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20741, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20742, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20743, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + } + ] + }, + { + "id": 879, + "name": "cyan_candle", + "translation_key": "block.minecraft.cyan_candle", + "item_id": 1200, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "candles", + "values": [ + "1", + "2", + "3", + "4" + ] + }, + { + "name": "lit", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20747, + "states": [ + { + "id": 20744, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20745, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20746, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20747, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20748, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20749, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20750, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20751, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20752, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20753, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20754, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20755, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20756, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20757, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20758, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20759, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + } + ] + }, + { + "id": 880, + "name": "purple_candle", + "translation_key": "block.minecraft.purple_candle", + "item_id": 1201, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "candles", + "values": [ + "1", + "2", + "3", + "4" + ] + }, + { + "name": "lit", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20763, + "states": [ + { + "id": 20760, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20761, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20762, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20763, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20764, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20765, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20766, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20767, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20768, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20769, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20770, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20771, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20772, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20773, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20774, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20775, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + } + ] + }, + { + "id": 881, + "name": "blue_candle", + "translation_key": "block.minecraft.blue_candle", + "item_id": 1202, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "candles", + "values": [ + "1", + "2", + "3", + "4" + ] + }, + { + "name": "lit", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20779, + "states": [ + { + "id": 20776, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20777, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20778, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20779, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20780, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20781, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20782, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20783, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20784, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20785, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20786, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20787, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20788, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20789, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20790, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20791, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + } + ] + }, + { + "id": 882, + "name": "brown_candle", + "translation_key": "block.minecraft.brown_candle", + "item_id": 1203, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "candles", + "values": [ + "1", + "2", + "3", + "4" + ] + }, + { + "name": "lit", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20795, + "states": [ + { + "id": 20792, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20793, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20794, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20795, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20796, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20797, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20798, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20799, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20800, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20801, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20802, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20803, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20804, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20805, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20806, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20807, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + } + ] + }, + { + "id": 883, + "name": "green_candle", + "translation_key": "block.minecraft.green_candle", + "item_id": 1204, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "candles", + "values": [ + "1", + "2", + "3", + "4" + ] + }, + { + "name": "lit", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20811, + "states": [ + { + "id": 20808, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20809, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20810, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20811, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20812, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20813, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20814, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20815, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20816, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20817, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20818, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20819, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20820, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20821, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20822, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20823, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + } + ] + }, + { + "id": 884, + "name": "red_candle", + "translation_key": "block.minecraft.red_candle", + "item_id": 1205, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "candles", + "values": [ + "1", + "2", + "3", + "4" + ] + }, + { + "name": "lit", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20827, + "states": [ + { + "id": 20824, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20825, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20826, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20827, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20828, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20829, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20830, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20831, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20832, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20833, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20834, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20835, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20836, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20837, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20838, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20839, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + } + ] + }, + { + "id": 885, + "name": "black_candle", + "translation_key": "block.minecraft.black_candle", + "item_id": 1206, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "candles", + "values": [ + "1", + "2", + "3", + "4" + ] + }, + { + "name": "lit", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20843, + "states": [ + { + "id": 20840, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20841, + "luminance": 3, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20842, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20843, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 304 + ] + }, + { + "id": 20844, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20845, + "luminance": 6, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20846, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20847, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 305 + ] + }, + { + "id": 20848, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20849, + "luminance": 9, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20850, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20851, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 306 + ] + }, + { + "id": 20852, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20853, + "luminance": 12, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20854, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + }, + { + "id": 20855, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 307 + ] + } + ] + }, + { + "id": 886, + "name": "candle_cake", + "translation_key": "block.minecraft.candle_cake", + "item_id": 0, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20857, + "states": [ + { + "id": 20856, + "luminance": 3, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + }, + { + "id": 20857, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + } + ] + }, + { + "id": 887, + "name": "white_candle_cake", + "translation_key": "block.minecraft.white_candle_cake", + "item_id": 0, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20859, + "states": [ + { + "id": 20858, + "luminance": 3, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + }, + { + "id": 20859, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + } + ] + }, + { + "id": 888, + "name": "orange_candle_cake", + "translation_key": "block.minecraft.orange_candle_cake", + "item_id": 0, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20861, + "states": [ + { + "id": 20860, + "luminance": 3, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + }, + { + "id": 20861, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + } + ] + }, + { + "id": 889, + "name": "magenta_candle_cake", + "translation_key": "block.minecraft.magenta_candle_cake", + "item_id": 0, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20863, + "states": [ + { + "id": 20862, + "luminance": 3, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + }, + { + "id": 20863, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + } + ] + }, + { + "id": 890, + "name": "light_blue_candle_cake", + "translation_key": "block.minecraft.light_blue_candle_cake", + "item_id": 0, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20865, + "states": [ + { + "id": 20864, + "luminance": 3, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + }, + { + "id": 20865, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + } + ] + }, + { + "id": 891, + "name": "yellow_candle_cake", + "translation_key": "block.minecraft.yellow_candle_cake", + "item_id": 0, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20867, + "states": [ + { + "id": 20866, + "luminance": 3, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + }, + { + "id": 20867, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + } + ] + }, + { + "id": 892, + "name": "lime_candle_cake", + "translation_key": "block.minecraft.lime_candle_cake", + "item_id": 0, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20869, + "states": [ + { + "id": 20868, + "luminance": 3, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + }, + { + "id": 20869, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + } + ] + }, + { + "id": 893, + "name": "pink_candle_cake", + "translation_key": "block.minecraft.pink_candle_cake", + "item_id": 0, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20871, + "states": [ + { + "id": 20870, + "luminance": 3, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + }, + { + "id": 20871, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + } + ] + }, + { + "id": 894, + "name": "gray_candle_cake", + "translation_key": "block.minecraft.gray_candle_cake", + "item_id": 0, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20873, + "states": [ + { + "id": 20872, + "luminance": 3, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + }, + { + "id": 20873, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + } + ] + }, + { + "id": 895, + "name": "light_gray_candle_cake", + "translation_key": "block.minecraft.light_gray_candle_cake", + "item_id": 0, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20875, + "states": [ + { + "id": 20874, + "luminance": 3, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + }, + { + "id": 20875, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + } + ] + }, + { + "id": 896, + "name": "cyan_candle_cake", + "translation_key": "block.minecraft.cyan_candle_cake", + "item_id": 0, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20877, + "states": [ + { + "id": 20876, + "luminance": 3, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + }, + { + "id": 20877, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + } + ] + }, + { + "id": 897, + "name": "purple_candle_cake", + "translation_key": "block.minecraft.purple_candle_cake", + "item_id": 0, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20879, + "states": [ + { + "id": 20878, + "luminance": 3, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + }, + { + "id": 20879, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + } + ] + }, + { + "id": 898, + "name": "blue_candle_cake", + "translation_key": "block.minecraft.blue_candle_cake", + "item_id": 0, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20881, + "states": [ + { + "id": 20880, + "luminance": 3, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + }, + { + "id": 20881, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + } + ] + }, + { + "id": 899, + "name": "brown_candle_cake", + "translation_key": "block.minecraft.brown_candle_cake", + "item_id": 0, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20883, + "states": [ + { + "id": 20882, + "luminance": 3, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + }, + { + "id": 20883, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + } + ] + }, + { + "id": 900, + "name": "green_candle_cake", + "translation_key": "block.minecraft.green_candle_cake", + "item_id": 0, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20885, + "states": [ + { + "id": 20884, + "luminance": 3, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + }, + { + "id": 20885, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + } + ] + }, + { + "id": 901, + "name": "red_candle_cake", + "translation_key": "block.minecraft.red_candle_cake", + "item_id": 0, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20887, + "states": [ + { + "id": 20886, + "luminance": 3, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + }, + { + "id": 20887, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + } + ] + }, + { + "id": 902, + "name": "black_candle_cake", + "translation_key": "block.minecraft.black_candle_cake", + "item_id": 0, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "lit", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20889, + "states": [ + { + "id": 20888, + "luminance": 3, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + }, + { + "id": 20889, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 85, + 308 + ] + } + ] + }, + { + "id": 903, + "name": "amethyst_block", + "translation_key": "block.minecraft.amethyst_block", + "item_id": 72, + "hardness": 1.5, + "blast_resistance": 1.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 20890, + "states": [ + { + "id": 20890, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 904, + "name": "budding_amethyst", + "translation_key": "block.minecraft.budding_amethyst", + "item_id": 73, + "hardness": 1.5, + "blast_resistance": 1.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 20891, + "states": [ + { + "id": 20891, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 905, + "name": "amethyst_cluster", + "translation_key": "block.minecraft.amethyst_cluster", + "item_id": 1210, + "hardness": 1.5, + "blast_resistance": 1.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20901, + "states": [ + { + "id": 20892, + "luminance": 5, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 309 + ] + }, + { + "id": 20893, + "luminance": 5, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 309 + ] + }, + { + "id": 20894, + "luminance": 5, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 310 + ] + }, + { + "id": 20895, + "luminance": 5, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 310 + ] + }, + { + "id": 20896, + "luminance": 5, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 311 + ] + }, + { + "id": 20897, + "luminance": 5, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 311 + ] + }, + { + "id": 20898, + "luminance": 5, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 312 + ] + }, + { + "id": 20899, + "luminance": 5, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 312 + ] + }, + { + "id": 20900, + "luminance": 5, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 313 + ] + }, + { + "id": 20901, + "luminance": 5, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 313 + ] + }, + { + "id": 20902, + "luminance": 5, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 314 + ] + }, + { + "id": 20903, + "luminance": 5, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 314 + ] + } + ] + }, + { + "id": 906, + "name": "large_amethyst_bud", + "translation_key": "block.minecraft.large_amethyst_bud", + "item_id": 1209, + "hardness": 1.5, + "blast_resistance": 1.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20913, + "states": [ + { + "id": 20904, + "luminance": 4, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 315 + ] + }, + { + "id": 20905, + "luminance": 4, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 315 + ] + }, + { + "id": 20906, + "luminance": 4, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 316 + ] + }, + { + "id": 20907, + "luminance": 4, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 316 + ] + }, + { + "id": 20908, + "luminance": 4, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 317 + ] + }, + { + "id": 20909, + "luminance": 4, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 317 + ] + }, + { + "id": 20910, + "luminance": 4, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 318 + ] + }, + { + "id": 20911, + "luminance": 4, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 318 + ] + }, + { + "id": 20912, + "luminance": 4, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 319 + ] + }, + { + "id": 20913, + "luminance": 4, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 319 + ] + }, + { + "id": 20914, + "luminance": 4, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 320 + ] + }, + { + "id": 20915, + "luminance": 4, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 320 + ] + } + ] + }, + { + "id": 907, + "name": "medium_amethyst_bud", + "translation_key": "block.minecraft.medium_amethyst_bud", + "item_id": 1208, + "hardness": 1.5, + "blast_resistance": 1.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20925, + "states": [ + { + "id": 20916, + "luminance": 2, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 321 + ] + }, + { + "id": 20917, + "luminance": 2, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 321 + ] + }, + { + "id": 20918, + "luminance": 2, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 322 + ] + }, + { + "id": 20919, + "luminance": 2, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 322 + ] + }, + { + "id": 20920, + "luminance": 2, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 323 + ] + }, + { + "id": 20921, + "luminance": 2, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 323 + ] + }, + { + "id": 20922, + "luminance": 2, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 324 + ] + }, + { + "id": 20923, + "luminance": 2, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 324 + ] + }, + { + "id": 20924, + "luminance": 2, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 325 + ] + }, + { + "id": 20925, + "luminance": 2, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 325 + ] + }, + { + "id": 20926, + "luminance": 2, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 326 + ] + }, + { + "id": 20927, + "luminance": 2, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 326 + ] + } + ] + }, + { + "id": 908, + "name": "small_amethyst_bud", + "translation_key": "block.minecraft.small_amethyst_bud", + "item_id": 1207, + "hardness": 1.5, + "blast_resistance": 1.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20937, + "states": [ + { + "id": 20928, + "luminance": 1, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 327 + ] + }, + { + "id": 20929, + "luminance": 1, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 327 + ] + }, + { + "id": 20930, + "luminance": 1, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 328 + ] + }, + { + "id": 20931, + "luminance": 1, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 328 + ] + }, + { + "id": 20932, + "luminance": 1, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 329 + ] + }, + { + "id": 20933, + "luminance": 1, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 329 + ] + }, + { + "id": 20934, + "luminance": 1, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 330 + ] + }, + { + "id": 20935, + "luminance": 1, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 330 + ] + }, + { + "id": 20936, + "luminance": 1, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 331 + ] + }, + { + "id": 20937, + "luminance": 1, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 331 + ] + }, + { + "id": 20938, + "luminance": 1, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 126 + ] + }, + { + "id": 20939, + "luminance": 1, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 126 + ] + } + ] + }, + { + "id": 909, + "name": "tuff", + "translation_key": "block.minecraft.tuff", + "item_id": 12, + "hardness": 1.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 20940, + "states": [ + { + "id": 20940, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 910, + "name": "calcite", + "translation_key": "block.minecraft.calcite", + "item_id": 11, + "hardness": 0.75, + "blast_resistance": 0.75, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 20941, + "states": [ + { + "id": 20941, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 911, + "name": "tinted_glass", + "translation_key": "block.minecraft.tinted_glass", + "item_id": 167, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 20942, + "states": [ + { + "id": 20942, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 912, + "name": "powder_snow", + "translation_key": "block.minecraft.powder_snow", + "item_id": 871, + "hardness": 0.25, + "blast_resistance": 0.25, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 20943, + "states": [ + { + "id": 20943, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 913, + "name": "sculk_sensor", + "translation_key": "block.minecraft.sculk_sensor", + "item_id": 653, + "hardness": 1.5, + "blast_resistance": 1.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "power", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "sculk_sensor_phase", + "values": [ + "inactive", + "active", + "cooldown" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 20945, + "states": [ + { + "id": 20944, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20945, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20946, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20947, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20948, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20949, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20950, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20951, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20952, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20953, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20954, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20955, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20956, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20957, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20958, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20959, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20960, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20961, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20962, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20963, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20964, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20965, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20966, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20967, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20968, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20969, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20970, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20971, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20972, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20973, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20974, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20975, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20976, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20977, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20978, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20979, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20980, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20981, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20982, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20983, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20984, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20985, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20986, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20987, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20988, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20989, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20990, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20991, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20992, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20993, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20994, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20995, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20996, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20997, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20998, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 20999, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21000, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21001, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21002, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21003, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21004, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21005, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21006, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21007, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21008, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21009, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21010, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21011, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21012, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21013, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21014, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21015, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21016, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21017, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21018, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21019, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21020, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21021, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21022, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21023, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21024, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21025, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21026, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21027, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21028, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21029, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21030, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21031, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21032, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21033, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21034, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21035, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21036, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21037, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21038, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + }, + { + "id": 21039, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 34 + } + ] + }, + { + "id": 914, + "name": "calibrated_sculk_sensor", + "translation_key": "block.minecraft.calibrated_sculk_sensor", + "item_id": 654, + "hardness": 1.5, + "blast_resistance": 1.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "power", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15" + ] + }, + { + "name": "sculk_sensor_phase", + "values": [ + "inactive", + "active", + "cooldown" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 21041, + "states": [ + { + "id": 21040, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21041, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21042, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21043, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21044, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21045, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21046, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21047, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21048, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21049, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21050, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21051, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21052, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21053, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21054, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21055, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21056, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21057, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21058, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21059, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21060, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21061, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21062, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21063, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21064, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21065, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21066, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21067, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21068, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21069, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21070, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21071, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21072, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21073, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21074, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21075, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21076, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21077, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21078, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21079, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21080, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21081, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21082, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21083, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21084, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21085, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21086, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21087, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21088, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21089, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21090, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21091, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21092, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21093, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21094, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21095, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21096, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21097, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21098, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21099, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21100, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21101, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21102, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21103, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21104, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21105, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21106, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21107, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21108, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21109, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21110, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21111, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21112, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21113, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21114, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21115, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21116, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21117, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21118, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21119, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21120, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21121, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21122, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21123, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21124, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21125, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21126, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21127, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21128, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21129, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21130, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21131, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21132, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21133, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21134, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21135, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21136, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21137, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21138, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21139, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21140, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21141, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21142, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21143, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21144, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21145, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21146, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21147, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21148, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21149, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21150, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21151, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21152, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21153, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21154, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21155, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21156, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21157, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21158, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21159, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21160, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21161, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21162, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21163, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21164, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21165, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21166, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21167, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21168, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21169, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21170, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21171, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21172, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21173, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21174, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21175, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21176, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21177, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21178, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21179, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21180, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21181, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21182, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21183, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21184, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21185, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21186, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21187, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21188, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21189, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21190, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21191, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21192, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21193, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21194, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21195, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21196, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21197, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21198, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21199, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21200, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21201, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21202, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21203, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21204, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21205, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21206, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21207, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21208, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21209, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21210, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21211, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21212, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21213, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21214, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21215, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21216, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21217, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21218, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21219, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21220, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21221, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21222, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21223, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21224, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21225, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21226, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21227, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21228, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21229, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21230, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21231, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21232, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21233, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21234, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21235, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21236, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21237, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21238, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21239, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21240, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21241, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21242, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21243, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21244, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21245, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21246, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21247, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21248, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21249, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21250, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21251, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21252, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21253, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21254, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21255, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21256, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21257, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21258, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21259, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21260, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21261, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21262, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21263, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21264, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21265, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21266, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21267, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21268, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21269, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21270, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21271, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21272, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21273, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21274, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21275, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21276, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21277, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21278, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21279, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21280, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21281, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21282, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21283, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21284, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21285, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21286, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21287, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21288, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21289, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21290, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21291, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21292, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21293, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21294, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21295, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21296, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21297, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21298, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21299, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21300, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21301, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21302, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21303, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21304, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21305, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21306, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21307, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21308, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21309, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21310, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21311, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21312, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21313, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21314, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21315, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21316, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21317, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21318, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21319, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21320, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21321, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21322, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21323, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21324, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21325, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21326, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21327, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21328, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21329, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21330, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21331, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21332, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21333, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21334, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21335, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21336, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21337, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21338, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21339, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21340, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21341, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21342, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21343, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21344, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21345, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21346, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21347, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21348, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21349, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21350, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21351, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21352, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21353, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21354, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21355, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21356, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21357, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21358, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21359, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21360, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21361, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21362, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21363, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21364, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21365, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21366, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21367, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21368, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21369, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21370, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21371, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21372, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21373, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21374, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21375, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21376, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21377, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21378, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21379, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21380, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21381, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21382, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21383, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21384, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21385, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21386, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21387, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21388, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21389, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21390, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21391, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21392, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21393, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21394, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21395, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21396, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21397, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21398, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21399, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21400, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21401, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21402, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21403, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21404, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21405, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21406, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21407, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21408, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21409, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21410, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21411, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21412, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21413, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21414, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21415, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21416, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21417, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21418, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21419, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21420, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21421, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21422, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + }, + { + "id": 21423, + "luminance": 1, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 35 + } + ] + }, + { + "id": 915, + "name": "sculk", + "translation_key": "block.minecraft.sculk", + "item_id": 349, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 21424, + "states": [ + { + "id": 21424, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 916, + "name": "sculk_vein", + "translation_key": "block.minecraft.sculk_vein", + "item_id": 350, + "hardness": 0.2, + "blast_resistance": 0.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "down", + "values": [ + "true", + "false" + ] + }, + { + "name": "east", + "values": [ + "true", + "false" + ] + }, + { + "name": "north", + "values": [ + "true", + "false" + ] + }, + { + "name": "south", + "values": [ + "true", + "false" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 21552, + "states": [ + { + "id": 21425, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21426, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21427, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21428, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21429, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21430, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21431, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21432, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21433, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21434, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21435, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21436, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21437, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21438, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21439, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21440, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21441, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21442, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21443, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21444, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21445, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21446, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21447, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21448, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21449, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21450, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21451, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21452, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21453, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21454, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21455, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21456, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21457, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21458, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21459, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21460, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21461, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21462, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21463, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21464, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21465, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21466, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21467, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21468, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21469, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21470, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21471, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21472, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21473, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21474, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21475, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21476, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21477, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21478, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21479, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21480, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21481, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21482, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21483, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21484, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21485, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21486, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21487, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21488, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21489, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21490, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21491, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21492, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21493, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21494, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21495, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21496, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21497, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21498, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21499, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21500, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21501, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21502, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21503, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21504, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21505, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21506, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21507, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21508, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21509, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21510, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21511, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21512, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21513, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21514, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21515, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21516, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21517, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21518, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21519, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21520, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21521, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21522, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21523, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21524, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21525, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21526, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21527, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21528, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21529, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21530, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21531, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21532, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21533, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21534, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21535, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21536, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21537, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21538, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21539, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21540, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21541, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21542, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21543, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21544, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21545, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21546, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21547, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21548, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21549, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21550, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21551, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 21552, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + } + ] + }, + { + "id": 917, + "name": "sculk_catalyst", + "translation_key": "block.minecraft.sculk_catalyst", + "item_id": 351, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "bloom", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 21554, + "states": [ + { + "id": 21553, + "luminance": 6, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 36 + }, + { + "id": 21554, + "luminance": 6, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ], + "block_entity_type": 36 + } + ] + }, + { + "id": 918, + "name": "sculk_shrieker", + "translation_key": "block.minecraft.sculk_shrieker", + "item_id": 352, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "can_summon", + "values": [ + "true", + "false" + ] + }, + { + "name": "shrieking", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 21562, + "states": [ + { + "id": 21555, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 37 + }, + { + "id": 21556, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 37 + }, + { + "id": 21557, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 37 + }, + { + "id": 21558, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 37 + }, + { + "id": 21559, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 37 + }, + { + "id": 21560, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 37 + }, + { + "id": 21561, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 37 + }, + { + "id": 21562, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ], + "block_entity_type": 37 + } + ] + }, + { + "id": 919, + "name": "oxidized_copper", + "translation_key": "block.minecraft.oxidized_copper", + "item_id": 81, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 21563, + "states": [ + { + "id": 21563, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 920, + "name": "weathered_copper", + "translation_key": "block.minecraft.weathered_copper", + "item_id": 80, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 21564, + "states": [ + { + "id": 21564, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 921, + "name": "exposed_copper", + "translation_key": "block.minecraft.exposed_copper", + "item_id": 79, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 21565, + "states": [ + { + "id": 21565, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 922, + "name": "copper_block", + "translation_key": "block.minecraft.copper_block", + "item_id": 75, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 21566, + "states": [ + { + "id": 21566, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 923, + "name": "copper_ore", + "translation_key": "block.minecraft.copper_ore", + "item_id": 53, + "hardness": 3.0, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 21567, + "states": [ + { + "id": 21567, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 924, + "name": "deepslate_copper_ore", + "translation_key": "block.minecraft.deepslate_copper_ore", + "item_id": 54, + "hardness": 4.5, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 21568, + "states": [ + { + "id": 21568, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 925, + "name": "oxidized_cut_copper", + "translation_key": "block.minecraft.oxidized_cut_copper", + "item_id": 85, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 21569, + "states": [ + { + "id": 21569, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 926, + "name": "weathered_cut_copper", + "translation_key": "block.minecraft.weathered_cut_copper", + "item_id": 84, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 21570, + "states": [ + { + "id": 21570, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 927, + "name": "exposed_cut_copper", + "translation_key": "block.minecraft.exposed_cut_copper", + "item_id": 83, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 21571, + "states": [ + { + "id": 21571, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 928, + "name": "cut_copper", + "translation_key": "block.minecraft.cut_copper", + "item_id": 82, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 21572, + "states": [ + { + "id": 21572, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 929, + "name": "oxidized_cut_copper_stairs", + "translation_key": "block.minecraft.oxidized_cut_copper_stairs", + "item_id": 89, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 21584, + "states": [ + { + "id": 21573, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 21574, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 21575, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 21576, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 21577, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 21578, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 21579, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 21580, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 21581, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 21582, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 21583, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 21584, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 21585, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 21586, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 21587, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 21588, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 21589, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 21590, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 21591, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 21592, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 21593, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 21594, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 21595, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 21596, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 21597, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 21598, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 21599, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 21600, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 21601, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 21602, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 21603, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 21604, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 21605, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 21606, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 21607, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 21608, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 21609, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 21610, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 21611, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 21612, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 21613, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 21614, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 21615, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 21616, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 21617, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 21618, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 21619, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 21620, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 21621, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 21622, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 21623, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 21624, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 21625, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 21626, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 21627, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 21628, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 21629, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 21630, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 21631, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 21632, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 21633, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 21634, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 21635, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 21636, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 21637, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 21638, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 21639, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 21640, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 21641, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 21642, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 21643, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 21644, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 21645, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 21646, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 21647, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 21648, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 21649, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 21650, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 21651, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 21652, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 930, + "name": "weathered_cut_copper_stairs", + "translation_key": "block.minecraft.weathered_cut_copper_stairs", + "item_id": 88, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 21664, + "states": [ + { + "id": 21653, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 21654, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 21655, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 21656, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 21657, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 21658, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 21659, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 21660, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 21661, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 21662, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 21663, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 21664, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 21665, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 21666, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 21667, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 21668, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 21669, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 21670, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 21671, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 21672, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 21673, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 21674, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 21675, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 21676, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 21677, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 21678, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 21679, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 21680, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 21681, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 21682, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 21683, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 21684, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 21685, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 21686, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 21687, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 21688, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 21689, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 21690, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 21691, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 21692, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 21693, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 21694, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 21695, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 21696, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 21697, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 21698, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 21699, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 21700, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 21701, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 21702, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 21703, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 21704, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 21705, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 21706, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 21707, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 21708, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 21709, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 21710, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 21711, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 21712, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 21713, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 21714, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 21715, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 21716, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 21717, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 21718, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 21719, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 21720, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 21721, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 21722, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 21723, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 21724, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 21725, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 21726, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 21727, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 21728, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 21729, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 21730, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 21731, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 21732, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 931, + "name": "exposed_cut_copper_stairs", + "translation_key": "block.minecraft.exposed_cut_copper_stairs", + "item_id": 87, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 21744, + "states": [ + { + "id": 21733, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 21734, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 21735, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 21736, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 21737, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 21738, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 21739, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 21740, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 21741, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 21742, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 21743, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 21744, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 21745, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 21746, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 21747, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 21748, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 21749, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 21750, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 21751, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 21752, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 21753, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 21754, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 21755, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 21756, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 21757, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 21758, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 21759, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 21760, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 21761, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 21762, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 21763, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 21764, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 21765, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 21766, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 21767, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 21768, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 21769, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 21770, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 21771, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 21772, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 21773, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 21774, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 21775, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 21776, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 21777, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 21778, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 21779, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 21780, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 21781, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 21782, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 21783, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 21784, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 21785, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 21786, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 21787, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 21788, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 21789, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 21790, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 21791, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 21792, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 21793, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 21794, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 21795, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 21796, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 21797, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 21798, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 21799, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 21800, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 21801, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 21802, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 21803, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 21804, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 21805, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 21806, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 21807, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 21808, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 21809, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 21810, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 21811, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 21812, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 932, + "name": "cut_copper_stairs", + "translation_key": "block.minecraft.cut_copper_stairs", + "item_id": 86, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 21824, + "states": [ + { + "id": 21813, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 21814, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 21815, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 21816, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 21817, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 21818, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 21819, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 21820, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 21821, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 21822, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 21823, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 21824, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 21825, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 21826, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 21827, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 21828, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 21829, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 21830, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 21831, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 21832, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 21833, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 21834, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 21835, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 21836, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 21837, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 21838, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 21839, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 21840, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 21841, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 21842, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 21843, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 21844, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 21845, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 21846, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 21847, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 21848, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 21849, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 21850, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 21851, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 21852, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 21853, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 21854, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 21855, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 21856, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 21857, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 21858, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 21859, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 21860, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 21861, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 21862, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 21863, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 21864, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 21865, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 21866, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 21867, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 21868, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 21869, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 21870, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 21871, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 21872, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 21873, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 21874, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 21875, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 21876, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 21877, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 21878, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 21879, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 21880, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 21881, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 21882, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 21883, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 21884, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 21885, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 21886, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 21887, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 21888, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 21889, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 21890, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 21891, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 21892, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 933, + "name": "oxidized_cut_copper_slab", + "translation_key": "block.minecraft.oxidized_cut_copper_slab", + "item_id": 93, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 21896, + "states": [ + { + "id": 21893, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 21894, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 21895, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 21896, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 21897, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 21898, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 934, + "name": "weathered_cut_copper_slab", + "translation_key": "block.minecraft.weathered_cut_copper_slab", + "item_id": 92, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 21902, + "states": [ + { + "id": 21899, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 21900, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 21901, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 21902, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 21903, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 21904, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 935, + "name": "exposed_cut_copper_slab", + "translation_key": "block.minecraft.exposed_cut_copper_slab", + "item_id": 91, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 21908, + "states": [ + { + "id": 21905, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 21906, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 21907, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 21908, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 21909, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 21910, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 936, + "name": "cut_copper_slab", + "translation_key": "block.minecraft.cut_copper_slab", + "item_id": 90, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 21914, + "states": [ + { + "id": 21911, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 21912, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 21913, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 21914, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 21915, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 21916, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 937, + "name": "waxed_copper_block", + "translation_key": "block.minecraft.waxed_copper_block", + "item_id": 94, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 21917, + "states": [ + { + "id": 21917, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 938, + "name": "waxed_weathered_copper", + "translation_key": "block.minecraft.waxed_weathered_copper", + "item_id": 96, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 21918, + "states": [ + { + "id": 21918, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 939, + "name": "waxed_exposed_copper", + "translation_key": "block.minecraft.waxed_exposed_copper", + "item_id": 95, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 21919, + "states": [ + { + "id": 21919, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 940, + "name": "waxed_oxidized_copper", + "translation_key": "block.minecraft.waxed_oxidized_copper", + "item_id": 97, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 21920, + "states": [ + { + "id": 21920, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 941, + "name": "waxed_oxidized_cut_copper", + "translation_key": "block.minecraft.waxed_oxidized_cut_copper", + "item_id": 101, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 21921, + "states": [ + { + "id": 21921, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 942, + "name": "waxed_weathered_cut_copper", + "translation_key": "block.minecraft.waxed_weathered_cut_copper", + "item_id": 100, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 21922, + "states": [ + { + "id": 21922, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 943, + "name": "waxed_exposed_cut_copper", + "translation_key": "block.minecraft.waxed_exposed_cut_copper", + "item_id": 99, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 21923, + "states": [ + { + "id": 21923, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 944, + "name": "waxed_cut_copper", + "translation_key": "block.minecraft.waxed_cut_copper", + "item_id": 98, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 21924, + "states": [ + { + "id": 21924, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 945, + "name": "waxed_oxidized_cut_copper_stairs", + "translation_key": "block.minecraft.waxed_oxidized_cut_copper_stairs", + "item_id": 105, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 21936, + "states": [ + { + "id": 21925, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 21926, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 21927, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 21928, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 21929, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 21930, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 21931, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 21932, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 21933, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 21934, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 21935, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 21936, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 21937, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 21938, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 21939, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 21940, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 21941, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 21942, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 21943, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 21944, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 21945, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 21946, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 21947, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 21948, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 21949, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 21950, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 21951, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 21952, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 21953, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 21954, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 21955, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 21956, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 21957, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 21958, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 21959, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 21960, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 21961, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 21962, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 21963, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 21964, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 21965, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 21966, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 21967, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 21968, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 21969, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 21970, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 21971, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 21972, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 21973, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 21974, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 21975, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 21976, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 21977, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 21978, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 21979, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 21980, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 21981, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 21982, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 21983, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 21984, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 21985, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 21986, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 21987, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 21988, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 21989, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 21990, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 21991, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 21992, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 21993, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 21994, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 21995, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 21996, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 21997, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 21998, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 21999, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 22000, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 22001, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 22002, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 22003, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 22004, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 946, + "name": "waxed_weathered_cut_copper_stairs", + "translation_key": "block.minecraft.waxed_weathered_cut_copper_stairs", + "item_id": 104, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 22016, + "states": [ + { + "id": 22005, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 22006, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 22007, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 22008, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 22009, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 22010, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 22011, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 22012, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 22013, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 22014, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 22015, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 22016, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 22017, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 22018, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 22019, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 22020, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 22021, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 22022, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 22023, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 22024, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 22025, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 22026, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 22027, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 22028, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 22029, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 22030, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 22031, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 22032, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 22033, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 22034, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 22035, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 22036, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 22037, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 22038, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 22039, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 22040, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 22041, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 22042, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 22043, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 22044, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 22045, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 22046, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 22047, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 22048, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 22049, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 22050, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 22051, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 22052, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 22053, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 22054, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 22055, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 22056, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 22057, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 22058, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 22059, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 22060, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 22061, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 22062, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 22063, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 22064, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 22065, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 22066, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 22067, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 22068, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 22069, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 22070, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 22071, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 22072, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 22073, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 22074, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 22075, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 22076, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 22077, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 22078, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 22079, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 22080, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 22081, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 22082, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 22083, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 22084, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 947, + "name": "waxed_exposed_cut_copper_stairs", + "translation_key": "block.minecraft.waxed_exposed_cut_copper_stairs", + "item_id": 103, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 22096, + "states": [ + { + "id": 22085, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 22086, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 22087, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 22088, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 22089, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 22090, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 22091, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 22092, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 22093, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 22094, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 22095, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 22096, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 22097, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 22098, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 22099, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 22100, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 22101, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 22102, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 22103, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 22104, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 22105, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 22106, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 22107, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 22108, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 22109, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 22110, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 22111, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 22112, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 22113, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 22114, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 22115, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 22116, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 22117, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 22118, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 22119, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 22120, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 22121, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 22122, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 22123, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 22124, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 22125, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 22126, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 22127, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 22128, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 22129, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 22130, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 22131, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 22132, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 22133, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 22134, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 22135, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 22136, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 22137, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 22138, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 22139, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 22140, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 22141, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 22142, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 22143, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 22144, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 22145, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 22146, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 22147, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 22148, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 22149, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 22150, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 22151, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 22152, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 22153, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 22154, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 22155, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 22156, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 22157, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 22158, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 22159, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 22160, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 22161, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 22162, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 22163, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 22164, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 948, + "name": "waxed_cut_copper_stairs", + "translation_key": "block.minecraft.waxed_cut_copper_stairs", + "item_id": 102, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 22176, + "states": [ + { + "id": 22165, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 22166, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 22167, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 22168, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 22169, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 22170, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 22171, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 22172, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 22173, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 22174, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 22175, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 22176, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 22177, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 22178, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 22179, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 22180, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 22181, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 22182, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 22183, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 22184, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 22185, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 22186, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 22187, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 22188, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 22189, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 22190, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 22191, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 22192, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 22193, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 22194, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 22195, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 22196, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 22197, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 22198, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 22199, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 22200, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 22201, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 22202, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 22203, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 22204, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 22205, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 22206, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 22207, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 22208, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 22209, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 22210, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 22211, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 22212, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 22213, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 22214, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 22215, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 22216, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 22217, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 22218, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 22219, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 22220, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 22221, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 22222, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 22223, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 22224, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 22225, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 22226, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 22227, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 22228, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 22229, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 22230, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 22231, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 22232, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 22233, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 22234, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 22235, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 22236, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 22237, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 22238, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 22239, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 22240, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 22241, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 22242, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 22243, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 22244, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 949, + "name": "waxed_oxidized_cut_copper_slab", + "translation_key": "block.minecraft.waxed_oxidized_cut_copper_slab", + "item_id": 109, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 22248, + "states": [ + { + "id": 22245, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 22246, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 22247, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 22248, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 22249, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 22250, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 950, + "name": "waxed_weathered_cut_copper_slab", + "translation_key": "block.minecraft.waxed_weathered_cut_copper_slab", + "item_id": 108, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 22254, + "states": [ + { + "id": 22251, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 22252, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 22253, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 22254, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 22255, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 22256, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 951, + "name": "waxed_exposed_cut_copper_slab", + "translation_key": "block.minecraft.waxed_exposed_cut_copper_slab", + "item_id": 107, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 22260, + "states": [ + { + "id": 22257, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 22258, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 22259, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 22260, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 22261, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 22262, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 952, + "name": "waxed_cut_copper_slab", + "translation_key": "block.minecraft.waxed_cut_copper_slab", + "item_id": 106, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 22266, + "states": [ + { + "id": 22263, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 22264, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 22265, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 22266, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 22267, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 22268, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 953, + "name": "lightning_rod", + "translation_key": "block.minecraft.lightning_rod", + "item_id": 651, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "east", + "south", + "west", + "up", + "down" + ] + }, + { + "name": "powered", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 22288, + "states": [ + { + "id": 22269, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 203 + ] + }, + { + "id": 22270, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 203 + ] + }, + { + "id": 22271, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 203 + ] + }, + { + "id": 22272, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 203 + ] + }, + { + "id": 22273, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 204 + ] + }, + { + "id": 22274, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 204 + ] + }, + { + "id": 22275, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 204 + ] + }, + { + "id": 22276, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 204 + ] + }, + { + "id": 22277, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 203 + ] + }, + { + "id": 22278, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 203 + ] + }, + { + "id": 22279, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 203 + ] + }, + { + "id": 22280, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 203 + ] + }, + { + "id": 22281, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 204 + ] + }, + { + "id": 22282, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 204 + ] + }, + { + "id": 22283, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 204 + ] + }, + { + "id": 22284, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 204 + ] + }, + { + "id": 22285, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 32 + ] + }, + { + "id": 22286, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 32 + ] + }, + { + "id": 22287, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 32 + ] + }, + { + "id": 22288, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 32 + ] + }, + { + "id": 22289, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 32 + ] + }, + { + "id": 22290, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 32 + ] + }, + { + "id": 22291, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 32 + ] + }, + { + "id": 22292, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 32 + ] + } + ] + }, + { + "id": 954, + "name": "pointed_dripstone", + "translation_key": "block.minecraft.pointed_dripstone", + "item_id": 1211, + "hardness": 1.5, + "blast_resistance": 3.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "thickness", + "values": [ + "tip_merge", + "tip", + "frustum", + "middle", + "base" + ] + }, + { + "name": "vertical_direction", + "values": [ + "up", + "down" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 22298, + "states": [ + { + "id": 22293, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 332 + ] + }, + { + "id": 22294, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 332 + ] + }, + { + "id": 22295, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 332 + ] + }, + { + "id": 22296, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 332 + ] + }, + { + "id": 22297, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 333 + ] + }, + { + "id": 22298, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 333 + ] + }, + { + "id": 22299, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 334 + ] + }, + { + "id": 22300, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 334 + ] + }, + { + "id": 22301, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 335 + ] + }, + { + "id": 22302, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 335 + ] + }, + { + "id": 22303, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 335 + ] + }, + { + "id": 22304, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 335 + ] + }, + { + "id": 22305, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 336 + ] + }, + { + "id": 22306, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 336 + ] + }, + { + "id": 22307, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 336 + ] + }, + { + "id": 22308, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 336 + ] + }, + { + "id": 22309, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 337 + ] + }, + { + "id": 22310, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 337 + ] + }, + { + "id": 22311, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 337 + ] + }, + { + "id": 22312, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 337 + ] + } + ] + }, + { + "id": 955, + "name": "dripstone_block", + "translation_key": "block.minecraft.dripstone_block", + "item_id": 13, + "hardness": 1.5, + "blast_resistance": 1.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 22313, + "states": [ + { + "id": 22313, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 956, + "name": "cave_vines", + "translation_key": "block.minecraft.cave_vines", + "item_id": 1166, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "age", + "values": [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9", + "10", + "11", + "12", + "13", + "14", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24", + "25" + ] + }, + { + "name": "berries", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 22315, + "states": [ + { + "id": 22314, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22315, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22316, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22317, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22318, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22319, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22320, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22321, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22322, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22323, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22324, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22325, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22326, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22327, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22328, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22329, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22330, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22331, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22332, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22333, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22334, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22335, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22336, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22337, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22338, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22339, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22340, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22341, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22342, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22343, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22344, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22345, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22346, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22347, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22348, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22349, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22350, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22351, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22352, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22353, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22354, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22355, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22356, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22357, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22358, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22359, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22360, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22361, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22362, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22363, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22364, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22365, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 957, + "name": "cave_vines_plant", + "translation_key": "block.minecraft.cave_vines_plant", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "berries", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 22367, + "states": [ + { + "id": 22366, + "luminance": 14, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22367, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 958, + "name": "spore_blossom", + "translation_key": "block.minecraft.spore_blossom", + "item_id": 211, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 22368, + "states": [ + { + "id": 22368, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 959, + "name": "azalea", + "translation_key": "block.minecraft.azalea", + "item_id": 175, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 22369, + "states": [ + { + "id": 22369, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 32, + 338, + 339, + 340, + 341 + ] + } + ] + }, + { + "id": 960, + "name": "flowering_azalea", + "translation_key": "block.minecraft.flowering_azalea", + "item_id": 176, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 22370, + "states": [ + { + "id": 22370, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 32, + 338, + 339, + 340, + 341 + ] + } + ] + }, + { + "id": 961, + "name": "moss_carpet", + "translation_key": "block.minecraft.moss_carpet", + "item_id": 223, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 22371, + "states": [ + { + "id": 22371, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 202 + ] + } + ] + }, + { + "id": 962, + "name": "pink_petals", + "translation_key": "block.minecraft.pink_petals", + "item_id": 224, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "flower_amount", + "values": [ + "1", + "2", + "3", + "4" + ] + } + ], + "default_state_id": 22372, + "states": [ + { + "id": 22372, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22373, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22374, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22375, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22376, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22377, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22378, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22379, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22380, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22381, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22382, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22383, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22384, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22385, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22386, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22387, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 963, + "name": "moss_block", + "translation_key": "block.minecraft.moss_block", + "item_id": 225, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 22388, + "states": [ + { + "id": 22388, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 964, + "name": "big_dripleaf", + "translation_key": "block.minecraft.big_dripleaf", + "item_id": 227, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "tilt", + "values": [ + "none", + "unstable", + "partial", + "full" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 22390, + "states": [ + { + "id": 22389, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 342 + ] + }, + { + "id": 22390, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 342 + ] + }, + { + "id": 22391, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 342 + ] + }, + { + "id": 22392, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 342 + ] + }, + { + "id": 22393, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 343 + ] + }, + { + "id": 22394, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 343 + ] + }, + { + "id": 22395, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22396, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22397, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 342 + ] + }, + { + "id": 22398, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 342 + ] + }, + { + "id": 22399, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 342 + ] + }, + { + "id": 22400, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 342 + ] + }, + { + "id": 22401, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 343 + ] + }, + { + "id": 22402, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 343 + ] + }, + { + "id": 22403, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22404, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22405, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 342 + ] + }, + { + "id": 22406, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 342 + ] + }, + { + "id": 22407, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 342 + ] + }, + { + "id": 22408, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 342 + ] + }, + { + "id": 22409, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 343 + ] + }, + { + "id": 22410, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 343 + ] + }, + { + "id": 22411, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22412, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22413, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 342 + ] + }, + { + "id": 22414, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 342 + ] + }, + { + "id": 22415, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 342 + ] + }, + { + "id": 22416, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 342 + ] + }, + { + "id": 22417, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 343 + ] + }, + { + "id": 22418, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 343 + ] + }, + { + "id": 22419, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22420, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 965, + "name": "big_dripleaf_stem", + "translation_key": "block.minecraft.big_dripleaf_stem", + "item_id": 227, + "hardness": 0.1, + "blast_resistance": 0.1, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 22422, + "states": [ + { + "id": 22421, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22422, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22423, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22424, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22425, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22426, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22427, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22428, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 966, + "name": "small_dripleaf", + "translation_key": "block.minecraft.small_dripleaf", + "item_id": 228, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "upper", + "lower" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 22432, + "states": [ + { + "id": 22429, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22430, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22431, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22432, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22433, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22434, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22435, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22436, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22437, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22438, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22439, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22440, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22441, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22442, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22443, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22444, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 967, + "name": "hanging_roots", + "translation_key": "block.minecraft.hanging_roots", + "item_id": 226, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 22446, + "states": [ + { + "id": 22445, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + }, + { + "id": 22446, + "luminance": 0, + "opaque": false, + "replaceable": true, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 968, + "name": "rooted_dirt", + "translation_key": "block.minecraft.rooted_dirt", + "item_id": 18, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 22447, + "states": [ + { + "id": 22447, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 969, + "name": "mud", + "translation_key": "block.minecraft.mud", + "item_id": 19, + "hardness": 0.5, + "blast_resistance": 0.5, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 22448, + "states": [ + { + "id": 22448, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 73 + ] + } + ] + }, + { + "id": 970, + "name": "deepslate", + "translation_key": "block.minecraft.deepslate", + "item_id": 8, + "hardness": 3.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 22450, + "states": [ + { + "id": 22449, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 22450, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 22451, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 971, + "name": "cobbled_deepslate", + "translation_key": "block.minecraft.cobbled_deepslate", + "item_id": 9, + "hardness": 3.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 22452, + "states": [ + { + "id": 22452, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 972, + "name": "cobbled_deepslate_stairs", + "translation_key": "block.minecraft.cobbled_deepslate_stairs", + "item_id": 613, + "hardness": 3.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 22464, + "states": [ + { + "id": 22453, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 22454, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 22455, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 22456, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 22457, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 22458, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 22459, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 22460, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 22461, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 22462, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 22463, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 22464, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 22465, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 22466, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 22467, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 22468, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 22469, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 22470, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 22471, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 22472, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 22473, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 22474, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 22475, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 22476, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 22477, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 22478, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 22479, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 22480, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 22481, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 22482, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 22483, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 22484, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 22485, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 22486, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 22487, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 22488, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 22489, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 22490, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 22491, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 22492, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 22493, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 22494, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 22495, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 22496, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 22497, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 22498, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 22499, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 22500, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 22501, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 22502, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 22503, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 22504, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 22505, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 22506, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 22507, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 22508, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 22509, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 22510, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 22511, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 22512, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 22513, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 22514, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 22515, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 22516, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 22517, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 22518, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 22519, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 22520, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 22521, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 22522, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 22523, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 22524, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 22525, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 22526, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 22527, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 22528, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 22529, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 22530, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 22531, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 22532, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 973, + "name": "cobbled_deepslate_slab", + "translation_key": "block.minecraft.cobbled_deepslate_slab", + "item_id": 630, + "hardness": 3.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 22536, + "states": [ + { + "id": 22533, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 22534, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 22535, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 22536, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 22537, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 22538, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 974, + "name": "cobbled_deepslate_wall", + "translation_key": "block.minecraft.cobbled_deepslate_wall", + "item_id": 393, + "hardness": 3.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "north", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "south", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "none", + "low", + "tall" + ] + } + ], + "default_state_id": 22542, + "states": [ + { + "id": 22539, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 22540, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 22541, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 22542, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 22543, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 22544, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 22545, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 22546, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 22547, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 22548, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 22549, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 22550, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 22551, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 22552, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 22553, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 22554, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 22555, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 22556, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 22557, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 22558, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 22559, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 22560, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 22561, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 22562, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 22563, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 22564, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 22565, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 22566, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 22567, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 22568, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 22569, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 22570, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 22571, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 22572, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 22573, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 22574, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 22575, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 22576, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 22577, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 22578, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 22579, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 22580, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 22581, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 22582, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 22583, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 22584, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 22585, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 22586, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 22587, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 22588, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22589, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22590, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 22591, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22592, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22593, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 22594, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 22595, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 22596, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 22597, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 22598, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 22599, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 22600, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22601, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22602, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 22603, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22604, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22605, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 22606, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 22607, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 22608, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 22609, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 22610, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 22611, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 22612, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 22613, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 22614, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 22615, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 22616, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 22617, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 22618, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 22619, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 22620, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 22621, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 22622, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 22623, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 22624, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22625, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22626, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 22627, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22628, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22629, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 22630, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 22631, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 22632, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 22633, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 22634, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 22635, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 22636, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22637, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22638, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 22639, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22640, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22641, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 22642, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 22643, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 22644, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 22645, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 22646, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 22647, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 22648, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 22649, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 22650, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 22651, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 22652, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 22653, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 22654, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 22655, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 22656, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 22657, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 22658, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 22659, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 22660, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 22661, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 22662, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 22663, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 22664, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 22665, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 22666, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 22667, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 22668, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 22669, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 22670, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 22671, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 22672, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 22673, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 22674, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 22675, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 22676, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 22677, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 22678, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 22679, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 22680, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 22681, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 22682, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 22683, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 22684, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 22685, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 22686, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 22687, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 22688, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 22689, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 22690, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 22691, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 22692, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 22693, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 22694, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 22695, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 22696, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22697, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22698, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 22699, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22700, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22701, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 22702, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22703, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22704, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 22705, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22706, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22707, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 22708, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22709, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22710, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 22711, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22712, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22713, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 22714, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22715, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22716, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 22717, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22718, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22719, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 22720, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 22721, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 22722, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 22723, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 22724, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 22725, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 22726, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 22727, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 22728, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 22729, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 22730, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 22731, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 22732, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22733, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22734, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 22735, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22736, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22737, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 22738, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22739, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22740, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 22741, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22742, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22743, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 22744, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22745, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22746, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 22747, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22748, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22749, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 22750, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22751, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22752, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 22753, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22754, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22755, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 22756, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 22757, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 22758, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 22759, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 22760, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 22761, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 22762, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 22763, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 22764, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 22765, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 22766, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 22767, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 22768, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 22769, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 22770, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 22771, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 22772, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 22773, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 22774, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 22775, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 22776, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 22777, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 22778, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 22779, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 22780, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 22781, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 22782, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 22783, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 22784, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 22785, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 22786, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 22787, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 22788, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 22789, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 22790, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 22791, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 22792, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 22793, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 22794, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 22795, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 22796, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 22797, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 22798, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 22799, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 22800, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 22801, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 22802, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 22803, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 22804, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22805, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22806, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 22807, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22808, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22809, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 22810, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22811, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22812, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 22813, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22814, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22815, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 22816, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22817, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22818, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 22819, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22820, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22821, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 22822, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22823, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22824, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 22825, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22826, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22827, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 22828, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 22829, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 22830, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 22831, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 22832, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 22833, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 22834, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 22835, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 22836, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 22837, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 22838, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 22839, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 22840, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22841, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22842, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 22843, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22844, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22845, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 22846, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22847, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22848, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 22849, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22850, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22851, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 22852, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22853, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22854, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 22855, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22856, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 22857, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 22858, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22859, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22860, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 22861, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 22862, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + } + ] + }, + { + "id": 975, + "name": "polished_deepslate", + "translation_key": "block.minecraft.polished_deepslate", + "item_id": 10, + "hardness": 3.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 22863, + "states": [ + { + "id": 22863, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 976, + "name": "polished_deepslate_stairs", + "translation_key": "block.minecraft.polished_deepslate_stairs", + "item_id": 614, + "hardness": 3.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 22875, + "states": [ + { + "id": 22864, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 22865, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 22866, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 22867, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 22868, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 22869, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 22870, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 22871, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 22872, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 22873, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 22874, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 22875, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 22876, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 22877, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 22878, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 22879, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 22880, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 22881, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 22882, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 22883, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 22884, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 22885, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 22886, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 22887, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 22888, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 22889, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 22890, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 22891, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 22892, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 22893, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 22894, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 22895, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 22896, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 22897, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 22898, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 22899, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 22900, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 22901, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 22902, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 22903, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 22904, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 22905, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 22906, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 22907, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 22908, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 22909, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 22910, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 22911, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 22912, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 22913, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 22914, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 22915, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 22916, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 22917, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 22918, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 22919, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 22920, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 22921, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 22922, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 22923, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 22924, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 22925, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 22926, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 22927, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 22928, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 22929, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 22930, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 22931, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 22932, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 22933, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 22934, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 22935, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 22936, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 22937, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 22938, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 22939, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 22940, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 22941, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 22942, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 22943, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 977, + "name": "polished_deepslate_slab", + "translation_key": "block.minecraft.polished_deepslate_slab", + "item_id": 631, + "hardness": 3.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 22947, + "states": [ + { + "id": 22944, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 22945, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 22946, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 22947, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 22948, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 22949, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 978, + "name": "polished_deepslate_wall", + "translation_key": "block.minecraft.polished_deepslate_wall", + "item_id": 394, + "hardness": 3.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "north", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "south", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "none", + "low", + "tall" + ] + } + ], + "default_state_id": 22953, + "states": [ + { + "id": 22950, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 22951, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 22952, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 22953, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 22954, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 22955, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 22956, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 22957, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 22958, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 22959, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 22960, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 22961, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 22962, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 22963, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 22964, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 22965, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 22966, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 22967, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 22968, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 22969, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 22970, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 22971, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 22972, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 22973, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 22974, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 22975, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 22976, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 22977, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 22978, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 22979, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 22980, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 22981, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 22982, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 22983, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 22984, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 22985, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 22986, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 22987, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 22988, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 22989, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 22990, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 22991, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 22992, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 22993, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 22994, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 22995, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 22996, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 22997, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 22998, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 22999, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23000, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23001, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 23002, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23003, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23004, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 23005, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23006, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23007, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 23008, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23009, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23010, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 23011, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23012, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23013, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 23014, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23015, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23016, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 23017, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23018, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23019, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 23020, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23021, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23022, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 23023, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 23024, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 23025, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 23026, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 23027, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 23028, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 23029, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 23030, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 23031, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 23032, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 23033, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 23034, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 23035, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23036, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23037, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 23038, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23039, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23040, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 23041, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23042, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23043, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 23044, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23045, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23046, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 23047, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23048, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23049, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 23050, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23051, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23052, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 23053, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23054, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23055, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 23056, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23057, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23058, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 23059, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 23060, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 23061, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 23062, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 23063, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 23064, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 23065, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 23066, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 23067, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 23068, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 23069, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 23070, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 23071, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23072, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23073, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 23074, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23075, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23076, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 23077, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23078, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23079, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 23080, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23081, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23082, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 23083, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23084, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23085, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 23086, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23087, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23088, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 23089, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23090, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23091, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 23092, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23093, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23094, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 23095, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23096, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23097, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 23098, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23099, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23100, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 23101, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23102, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23103, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 23104, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23105, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23106, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23107, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23108, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23109, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23110, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23111, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23112, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23113, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23114, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23115, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23116, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23117, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23118, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23119, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23120, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23121, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23122, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23123, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23124, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23125, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23126, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23127, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23128, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23129, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23130, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 23131, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23132, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23133, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 23134, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23135, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23136, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 23137, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23138, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23139, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 23140, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23141, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23142, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23143, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23144, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23145, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23146, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23147, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23148, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23149, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23150, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23151, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23152, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23153, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23154, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23155, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23156, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23157, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23158, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23159, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23160, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23161, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23162, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23163, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23164, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23165, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23166, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 23167, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 23168, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 23169, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 23170, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 23171, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 23172, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 23173, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 23174, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 23175, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 23176, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 23177, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 23178, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 23179, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23180, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23181, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 23182, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23183, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23184, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 23185, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23186, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23187, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 23188, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23189, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23190, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 23191, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23192, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23193, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 23194, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23195, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23196, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 23197, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23198, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23199, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 23200, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23201, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23202, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 23203, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23204, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23205, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 23206, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23207, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23208, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 23209, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23210, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23211, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 23212, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23213, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23214, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23215, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23216, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23217, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23218, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23219, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23220, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23221, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23222, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23223, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23224, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23225, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23226, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23227, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23228, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23229, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23230, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23231, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23232, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23233, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23234, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23235, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23236, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23237, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23238, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 23239, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23240, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23241, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 23242, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23243, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23244, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 23245, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23246, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23247, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 23248, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23249, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23250, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23251, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23252, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23253, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23254, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23255, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23256, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23257, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23258, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23259, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23260, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23261, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23262, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23263, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23264, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23265, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23266, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23267, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23268, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23269, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23270, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23271, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23272, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23273, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + } + ] + }, + { + "id": 979, + "name": "deepslate_tiles", + "translation_key": "block.minecraft.deepslate_tiles", + "item_id": 326, + "hardness": 3.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 23274, + "states": [ + { + "id": 23274, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 980, + "name": "deepslate_tile_stairs", + "translation_key": "block.minecraft.deepslate_tile_stairs", + "item_id": 616, + "hardness": 3.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 23286, + "states": [ + { + "id": 23275, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 23276, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 23277, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 23278, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 23279, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 23280, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 23281, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 23282, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 23283, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 23284, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 23285, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 23286, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 23287, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 23288, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 23289, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 23290, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 23291, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 23292, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 23293, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 23294, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 23295, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 23296, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 23297, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 23298, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 23299, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 23300, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 23301, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 23302, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 23303, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 23304, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 23305, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 23306, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 23307, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 23308, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 23309, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 23310, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 23311, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 23312, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 23313, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 23314, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 23315, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 23316, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 23317, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 23318, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 23319, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 23320, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 23321, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 23322, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 23323, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 23324, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 23325, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 23326, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 23327, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 23328, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 23329, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 23330, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 23331, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 23332, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 23333, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 23334, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 23335, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 23336, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 23337, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 23338, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 23339, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 23340, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 23341, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 23342, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 23343, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 23344, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 23345, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 23346, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 23347, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 23348, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 23349, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 23350, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 23351, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 23352, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 23353, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 23354, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 981, + "name": "deepslate_tile_slab", + "translation_key": "block.minecraft.deepslate_tile_slab", + "item_id": 633, + "hardness": 3.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 23358, + "states": [ + { + "id": 23355, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 23356, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 23357, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 23358, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 23359, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 23360, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 982, + "name": "deepslate_tile_wall", + "translation_key": "block.minecraft.deepslate_tile_wall", + "item_id": 396, + "hardness": 3.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "north", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "south", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "none", + "low", + "tall" + ] + } + ], + "default_state_id": 23364, + "states": [ + { + "id": 23361, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 23362, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 23363, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 23364, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 23365, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 23366, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 23367, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 23368, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 23369, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 23370, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 23371, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 23372, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 23373, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 23374, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 23375, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 23376, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 23377, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 23378, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 23379, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 23380, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 23381, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 23382, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 23383, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 23384, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 23385, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 23386, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 23387, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 23388, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 23389, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 23390, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 23391, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 23392, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 23393, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 23394, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 23395, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 23396, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 23397, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 23398, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 23399, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 23400, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 23401, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 23402, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 23403, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 23404, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 23405, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 23406, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 23407, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 23408, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 23409, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 23410, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23411, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23412, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 23413, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23414, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23415, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 23416, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23417, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23418, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 23419, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23420, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23421, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 23422, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23423, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23424, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 23425, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23426, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23427, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 23428, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23429, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23430, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 23431, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23432, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23433, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 23434, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 23435, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 23436, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 23437, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 23438, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 23439, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 23440, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 23441, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 23442, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 23443, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 23444, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 23445, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 23446, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23447, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23448, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 23449, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23450, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23451, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 23452, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23453, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23454, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 23455, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23456, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23457, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 23458, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23459, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23460, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 23461, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23462, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23463, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 23464, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23465, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23466, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 23467, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23468, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23469, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 23470, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 23471, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 23472, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 23473, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 23474, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 23475, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 23476, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 23477, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 23478, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 23479, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 23480, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 23481, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 23482, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23483, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23484, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 23485, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23486, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23487, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 23488, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23489, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23490, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 23491, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23492, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23493, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 23494, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23495, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23496, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 23497, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23498, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23499, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 23500, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23501, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23502, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 23503, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23504, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23505, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 23506, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23507, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23508, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 23509, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23510, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23511, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 23512, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23513, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23514, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 23515, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23516, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23517, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23518, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23519, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23520, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23521, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23522, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23523, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23524, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23525, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23526, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23527, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23528, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23529, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23530, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23531, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23532, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23533, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23534, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23535, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23536, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23537, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23538, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23539, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23540, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23541, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 23542, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23543, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23544, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 23545, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23546, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23547, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 23548, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23549, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23550, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 23551, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23552, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23553, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23554, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23555, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23556, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23557, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23558, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23559, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23560, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23561, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23562, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23563, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23564, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23565, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23566, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23567, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23568, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23569, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23570, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23571, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23572, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23573, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23574, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23575, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23576, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23577, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 23578, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 23579, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 23580, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 23581, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 23582, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 23583, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 23584, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 23585, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 23586, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 23587, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 23588, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 23589, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 23590, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23591, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23592, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 23593, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23594, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23595, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 23596, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23597, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23598, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 23599, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23600, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23601, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 23602, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23603, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23604, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 23605, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23606, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23607, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 23608, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23609, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23610, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 23611, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23612, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23613, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 23614, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23615, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23616, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 23617, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23618, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23619, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 23620, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23621, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23622, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 23623, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23624, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23625, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23626, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23627, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23628, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23629, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23630, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23631, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23632, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23633, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23634, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23635, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23636, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23637, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23638, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23639, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23640, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23641, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23642, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23643, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23644, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23645, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23646, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23647, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23648, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23649, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 23650, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23651, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23652, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 23653, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23654, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23655, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 23656, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23657, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23658, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 23659, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23660, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23661, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23662, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23663, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23664, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23665, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23666, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23667, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23668, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23669, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23670, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23671, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23672, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23673, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23674, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23675, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23676, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23677, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23678, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23679, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23680, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23681, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23682, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23683, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23684, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + } + ] + }, + { + "id": 983, + "name": "deepslate_bricks", + "translation_key": "block.minecraft.deepslate_bricks", + "item_id": 324, + "hardness": 3.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 23685, + "states": [ + { + "id": 23685, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 984, + "name": "deepslate_brick_stairs", + "translation_key": "block.minecraft.deepslate_brick_stairs", + "item_id": 615, + "hardness": 3.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "half", + "values": [ + "top", + "bottom" + ] + }, + { + "name": "shape", + "values": [ + "straight", + "inner_left", + "inner_right", + "outer_left", + "outer_right" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 23697, + "states": [ + { + "id": 23686, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 23687, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 42 + ] + }, + { + "id": 23688, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 23689, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 23690, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 23691, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 23692, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 23693, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 23694, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 23695, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 23696, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 23697, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52 + ] + }, + { + "id": 23698, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 23699, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 23700, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 23701, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 23702, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 23703, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 23704, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 23705, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 23706, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 23707, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 52 + ] + }, + { + "id": 23708, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 23709, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 23710, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 23711, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 23712, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 23713, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 23714, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 23715, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 23716, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 23717, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42 + ] + }, + { + "id": 23718, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 23719, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 23720, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 23721, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 23722, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 23723, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 23724, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 23725, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 23726, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 23727, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 56 + ] + }, + { + "id": 23728, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 23729, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 46, + 49 + ] + }, + { + "id": 23730, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 23731, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 43, + 44, + 45 + ] + }, + { + "id": 23732, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 23733, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 55, + 52, + 45 + ] + }, + { + "id": 23734, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 23735, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 48, + 42, + 49 + ] + }, + { + "id": 23736, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 23737, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50 + ] + }, + { + "id": 23738, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 23739, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 45 + ] + }, + { + "id": 23740, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 23741, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 50, + 49 + ] + }, + { + "id": 23742, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 23743, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 47 + ] + }, + { + "id": 23744, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 23745, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 53 + ] + }, + { + "id": 23746, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 23747, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 57, + 50 + ] + }, + { + "id": 23748, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 23749, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 41, + 46, + 47 + ] + }, + { + "id": 23750, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 23751, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 54, + 44, + 53 + ] + }, + { + "id": 23752, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 23753, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 44, + 50, + 45 + ] + }, + { + "id": 23754, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 23755, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 46, + 50, + 49 + ] + }, + { + "id": 23756, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 23757, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 56 + ] + }, + { + "id": 23758, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 23759, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 52, + 45 + ] + }, + { + "id": 23760, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 23761, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 42, + 49 + ] + }, + { + "id": 23762, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 23763, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 49 + ] + }, + { + "id": 23764, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + }, + { + "id": 23765, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51, + 45 + ] + } + ] + }, + { + "id": 985, + "name": "deepslate_brick_slab", + "translation_key": "block.minecraft.deepslate_brick_slab", + "item_id": 632, + "hardness": 3.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "type", + "values": [ + "top", + "bottom", + "double" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 23769, + "states": [ + { + "id": 23766, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 23767, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 201 + ] + }, + { + "id": 23768, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 23769, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 51 + ] + }, + { + "id": 23770, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 23771, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 986, + "name": "deepslate_brick_wall", + "translation_key": "block.minecraft.deepslate_brick_wall", + "item_id": 395, + "hardness": 3.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "east", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "north", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "south", + "values": [ + "none", + "low", + "tall" + ] + }, + { + "name": "up", + "values": [ + "true", + "false" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + }, + { + "name": "west", + "values": [ + "none", + "low", + "tall" + ] + } + ], + "default_state_id": 23775, + "states": [ + { + "id": 23772, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 23773, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 23774, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 23775, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140 + ] + }, + { + "id": 23776, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 23777, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143 + ] + }, + { + "id": 23778, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 23779, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 23780, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 23781, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [] + }, + { + "id": 23782, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 23783, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144 + ] + }, + { + "id": 23784, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 23785, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 23786, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 23787, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 23788, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 23789, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 23790, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 23791, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 23792, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 23793, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 23794, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 23795, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 23796, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 23797, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 23798, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 23799, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145 + ] + }, + { + "id": 23800, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 23801, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 145 + ] + }, + { + "id": 23802, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 23803, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 23804, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 23805, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146 + ] + }, + { + "id": 23806, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 23807, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 147 + ] + }, + { + "id": 23808, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 23809, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 23810, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 23811, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 23812, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 23813, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 23814, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 23815, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 23816, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 23817, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 23818, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 23819, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 23820, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 23821, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23822, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23823, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 23824, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23825, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23826, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 23827, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23828, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23829, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 23830, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23831, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23832, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 23833, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23834, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23835, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 23836, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23837, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23838, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 23839, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23840, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23841, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 23842, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23843, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23844, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 23845, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 23846, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 23847, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148 + ] + }, + { + "id": 23848, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 23849, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148 + ] + }, + { + "id": 23850, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 23851, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 23852, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 23853, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149 + ] + }, + { + "id": 23854, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 23855, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150 + ] + }, + { + "id": 23856, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 23857, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23858, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23859, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 23860, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23861, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23862, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 23863, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23864, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23865, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 23866, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23867, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23868, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 23869, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23870, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23871, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145 + ] + }, + { + "id": 23872, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23873, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 141, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23874, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 23875, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23876, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23877, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151 + ] + }, + { + "id": 23878, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23879, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 144, + 150, + 147 + ] + }, + { + "id": 23880, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 23881, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 23882, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 23883, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 23884, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 23885, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 23886, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 23887, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 23888, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 23889, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 23890, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 23891, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 23892, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 23893, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23894, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23895, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 23896, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23897, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23898, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 23899, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23900, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23901, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 23902, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23903, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23904, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 23905, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23906, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23907, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 23908, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23909, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 23910, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 23911, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23912, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23913, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 23914, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23915, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 23916, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 23917, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23918, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23919, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 23920, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23921, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23922, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 23923, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23924, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23925, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 23926, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23927, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23928, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23929, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23930, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23931, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23932, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23933, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23934, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23935, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23936, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23937, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23938, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23939, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23940, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23941, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23942, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23943, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23944, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23945, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23946, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23947, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23948, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23949, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23950, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23951, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23952, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 23953, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23954, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23955, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 23956, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23957, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 23958, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 23959, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23960, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23961, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 23962, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23963, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 23964, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23965, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23966, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23967, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23968, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23969, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23970, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23971, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23972, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23973, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23974, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23975, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23976, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23977, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23978, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23979, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 23980, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23981, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 23982, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23983, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23984, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23985, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 23986, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23987, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 23988, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 23989, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 23990, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 23991, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 152 + ] + }, + { + "id": 23992, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 23993, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143 + ] + }, + { + "id": 23994, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 23995, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 23996, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 23997, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 154 + ] + }, + { + "id": 23998, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 23999, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153 + ] + }, + { + "id": 24000, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 24001, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 24002, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 24003, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 24004, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 24005, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 24006, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 24007, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 24008, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 24009, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 24010, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 24011, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 24012, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 24013, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 24014, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 24015, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 145, + 152 + ] + }, + { + "id": 24016, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 24017, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 145 + ] + }, + { + "id": 24018, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 24019, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 24020, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 24021, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 146, + 155 + ] + }, + { + "id": 24022, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 24023, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 147 + ] + }, + { + "id": 24024, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 24025, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 24026, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 24027, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 24028, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 24029, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 24030, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 24031, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 24032, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 24033, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 24034, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 24035, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 24036, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 24037, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 24038, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 24039, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 24040, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 24041, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 24042, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 24043, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 24044, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 24045, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 24046, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 24047, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 24048, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 24049, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 24050, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 24051, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 24052, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 24053, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 24054, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 24055, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 24056, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 24057, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 24058, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 24059, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 24060, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 24061, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 24062, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 24063, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 152 + ] + }, + { + "id": 24064, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 24065, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148 + ] + }, + { + "id": 24066, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 24067, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 24068, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 24069, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 149, + 155 + ] + }, + { + "id": 24070, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 24071, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150 + ] + }, + { + "id": 24072, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 24073, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 24074, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 24075, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 24076, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 24077, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 24078, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 24079, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 24080, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 24081, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 24082, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 24083, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 24084, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 24085, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 24086, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 24087, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 140, + 148, + 145, + 152 + ] + }, + { + "id": 24088, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 24089, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 142, + 143, + 148, + 145 + ] + }, + { + "id": 24090, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 24091, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 24092, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 24093, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 151, + 155 + ] + }, + { + "id": 24094, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + }, + { + "id": 24095, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 153, + 150, + 147 + ] + } + ] + }, + { + "id": 987, + "name": "chiseled_deepslate", + "translation_key": "block.minecraft.chiseled_deepslate", + "item_id": 328, + "hardness": 3.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 24096, + "states": [ + { + "id": 24096, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 988, + "name": "cracked_deepslate_bricks", + "translation_key": "block.minecraft.cracked_deepslate_bricks", + "item_id": 325, + "hardness": 3.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 24097, + "states": [ + { + "id": 24097, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 989, + "name": "cracked_deepslate_tiles", + "translation_key": "block.minecraft.cracked_deepslate_tiles", + "item_id": 327, + "hardness": 3.5, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 24098, + "states": [ + { + "id": 24098, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 990, + "name": "infested_deepslate", + "translation_key": "block.minecraft.infested_deepslate", + "item_id": 317, + "hardness": 1.5, + "blast_resistance": 0.75, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 24100, + "states": [ + { + "id": 24099, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 24100, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 24101, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 991, + "name": "smooth_basalt", + "translation_key": "block.minecraft.smooth_basalt", + "item_id": 308, + "hardness": 1.25, + "blast_resistance": 4.2, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 24102, + "states": [ + { + "id": 24102, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 992, + "name": "raw_iron_block", + "translation_key": "block.minecraft.raw_iron_block", + "item_id": 69, + "hardness": 5.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 24103, + "states": [ + { + "id": 24103, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 993, + "name": "raw_copper_block", + "translation_key": "block.minecraft.raw_copper_block", + "item_id": 70, + "hardness": 5.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 24104, + "states": [ + { + "id": 24104, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 994, + "name": "raw_gold_block", + "translation_key": "block.minecraft.raw_gold_block", + "item_id": 71, + "hardness": 5.0, + "blast_resistance": 6.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 24105, + "states": [ + { + "id": 24105, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 995, + "name": "potted_azalea_bush", + "translation_key": "block.minecraft.potted_azalea_bush", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 24106, + "states": [ + { + "id": 24106, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 996, + "name": "potted_flowering_azalea_bush", + "translation_key": "block.minecraft.potted_flowering_azalea_bush", + "item_id": 0, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 24107, + "states": [ + { + "id": 24107, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [ + 156 + ] + } + ] + }, + { + "id": 997, + "name": "ochre_froglight", + "translation_key": "block.minecraft.ochre_froglight", + "item_id": 1212, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 24109, + "states": [ + { + "id": 24108, + "luminance": 15, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 24109, + "luminance": 15, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 24110, + "luminance": 15, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 998, + "name": "verdant_froglight", + "translation_key": "block.minecraft.verdant_froglight", + "item_id": 1213, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 24112, + "states": [ + { + "id": 24111, + "luminance": 15, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 24112, + "luminance": 15, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 24113, + "luminance": 15, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 999, + "name": "pearlescent_froglight", + "translation_key": "block.minecraft.pearlescent_froglight", + "item_id": 1214, + "hardness": 0.3, + "blast_resistance": 0.3, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "axis", + "values": [ + "x", + "y", + "z" + ] + } + ], + "default_state_id": 24115, + "states": [ + { + "id": 24114, + "luminance": 15, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 24115, + "luminance": 15, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + }, + { + "id": 24116, + "luminance": 15, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 1000, + "name": "frogspawn", + "translation_key": "block.minecraft.frogspawn", + "item_id": 1215, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 24117, + "states": [ + { + "id": 24117, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": false, + "collision_shapes": [] + } + ] + }, + { + "id": 1001, + "name": "reinforced_deepslate", + "translation_key": "block.minecraft.reinforced_deepslate", + "item_id": 329, + "hardness": 55.0, + "blast_resistance": 1200.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [], + "default_state_id": 24118, + "states": [ + { + "id": 24118, + "luminance": 0, + "opaque": true, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 0 + ] + } + ] + }, + { + "id": 1002, + "name": "decorated_pot", + "translation_key": "block.minecraft.decorated_pot", + "item_id": 266, + "hardness": 0.0, + "blast_resistance": 0.0, + "slipperiness": 0.6, + "speed_factor": 1.0, + "jump_factor": 1.0, + "properties": [ + { + "name": "cracked", + "values": [ + "true", + "false" + ] + }, + { + "name": "facing", + "values": [ + "north", + "south", + "west", + "east" + ] + }, + { + "name": "waterlogged", + "values": [ + "true", + "false" + ] + } + ], + "default_state_id": 24128, + "states": [ + { + "id": 24119, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 127 + ], + "block_entity_type": 40 + }, + { + "id": 24120, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 127 + ], + "block_entity_type": 40 + }, + { + "id": 24121, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 127 + ], + "block_entity_type": 40 + }, + { + "id": 24122, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 127 + ], + "block_entity_type": 40 + }, + { + "id": 24123, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 127 + ], + "block_entity_type": 40 + }, + { + "id": 24124, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 127 + ], + "block_entity_type": 40 + }, + { + "id": 24125, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 127 + ], + "block_entity_type": 40 + }, + { + "id": 24126, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 127 + ], + "block_entity_type": 40 + }, + { + "id": 24127, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 127 + ], + "block_entity_type": 40 + }, + { + "id": 24128, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 127 + ], + "block_entity_type": 40 + }, + { + "id": 24129, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 127 + ], + "block_entity_type": 40 + }, + { + "id": 24130, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 127 + ], + "block_entity_type": 40 + }, + { + "id": 24131, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 127 + ], + "block_entity_type": 40 + }, + { + "id": 24132, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 127 + ], + "block_entity_type": 40 + }, + { + "id": 24133, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 127 + ], + "block_entity_type": 40 + }, + { + "id": 24134, + "luminance": 0, + "opaque": false, + "replaceable": false, + "blocks_motion": true, + "collision_shapes": [ + 127 + ], + "block_entity_type": 40 + } + ] + } + ] +} \ No newline at end of file diff --git a/vendor/valence/crates/valence_generated/extracted/effects.json b/vendor/valence/crates/valence_generated/extracted/effects.json new file mode 100644 index 00000000..5d955573 --- /dev/null +++ b/vendor/valence/crates/valence_generated/extracted/effects.json @@ -0,0 +1,338 @@ +[ + { + "id": 1, + "name": "speed", + "translation_key": "effect.minecraft.speed", + "color": 3402751, + "instant": false, + "category": "Beneficial", + "attribute_modifiers": [ + { + "attribute": 3, + "operation": 2, + "value": 0.20000000298023224, + "uuid": "91aeaa56-376b-4498-935b-2f7f68070635" + } + ] + }, + { + "id": 2, + "name": "slowness", + "translation_key": "effect.minecraft.slowness", + "color": 9154528, + "instant": false, + "category": "Harmful", + "attribute_modifiers": [ + { + "attribute": 3, + "operation": 2, + "value": -0.15000000596046448, + "uuid": "7107de5e-7ce8-4030-940e-514c1f160890" + } + ] + }, + { + "id": 3, + "name": "haste", + "translation_key": "effect.minecraft.haste", + "color": 14270531, + "instant": false, + "category": "Beneficial", + "attribute_modifiers": [ + { + "attribute": 7, + "operation": 2, + "value": 0.10000000149011612, + "uuid": "af8b6e3f-3328-4c0a-aa36-5ba2bb9dbef3" + } + ] + }, + { + "id": 4, + "name": "mining_fatigue", + "translation_key": "effect.minecraft.mining_fatigue", + "color": 4866583, + "instant": false, + "category": "Harmful", + "attribute_modifiers": [ + { + "attribute": 7, + "operation": 2, + "value": -0.10000000149011612, + "uuid": "55fced67-e92a-486e-9800-b47f202c4386" + } + ] + }, + { + "id": 5, + "name": "strength", + "translation_key": "effect.minecraft.strength", + "color": 16762624, + "instant": false, + "category": "Beneficial", + "attribute_modifiers": [ + { + "attribute": 5, + "operation": 0, + "value": 0.0, + "uuid": "648d7064-6a60-4f59-8abe-c2c23a6dd7a9" + } + ] + }, + { + "id": 6, + "name": "instant_health", + "translation_key": "effect.minecraft.instant_health", + "color": 16262179, + "instant": true, + "category": "Beneficial" + }, + { + "id": 7, + "name": "instant_damage", + "translation_key": "effect.minecraft.instant_damage", + "color": 11101546, + "instant": true, + "category": "Harmful" + }, + { + "id": 8, + "name": "jump_boost", + "translation_key": "effect.minecraft.jump_boost", + "color": 16646020, + "instant": false, + "category": "Beneficial" + }, + { + "id": 9, + "name": "nausea", + "translation_key": "effect.minecraft.nausea", + "color": 5578058, + "instant": false, + "category": "Harmful" + }, + { + "id": 10, + "name": "regeneration", + "translation_key": "effect.minecraft.regeneration", + "color": 13458603, + "instant": false, + "category": "Beneficial" + }, + { + "id": 11, + "name": "resistance", + "translation_key": "effect.minecraft.resistance", + "color": 9520880, + "instant": false, + "category": "Beneficial" + }, + { + "id": 12, + "name": "fire_resistance", + "translation_key": "effect.minecraft.fire_resistance", + "color": 16750848, + "instant": false, + "category": "Beneficial" + }, + { + "id": 13, + "name": "water_breathing", + "translation_key": "effect.minecraft.water_breathing", + "color": 10017472, + "instant": false, + "category": "Beneficial" + }, + { + "id": 14, + "name": "invisibility", + "translation_key": "effect.minecraft.invisibility", + "color": 16185078, + "instant": false, + "category": "Beneficial" + }, + { + "id": 15, + "name": "blindness", + "translation_key": "effect.minecraft.blindness", + "color": 2039587, + "instant": false, + "category": "Harmful" + }, + { + "id": 16, + "name": "night_vision", + "translation_key": "effect.minecraft.night_vision", + "color": 12779366, + "instant": false, + "category": "Beneficial" + }, + { + "id": 17, + "name": "hunger", + "translation_key": "effect.minecraft.hunger", + "color": 5797459, + "instant": false, + "category": "Harmful" + }, + { + "id": 18, + "name": "weakness", + "translation_key": "effect.minecraft.weakness", + "color": 4738376, + "instant": false, + "category": "Harmful", + "attribute_modifiers": [ + { + "attribute": 5, + "operation": 0, + "value": 0.0, + "uuid": "22653b89-116e-49dc-9b6b-9971489b5be5" + } + ] + }, + { + "id": 19, + "name": "poison", + "translation_key": "effect.minecraft.poison", + "color": 8889187, + "instant": false, + "category": "Harmful" + }, + { + "id": 20, + "name": "wither", + "translation_key": "effect.minecraft.wither", + "color": 7561558, + "instant": false, + "category": "Harmful" + }, + { + "id": 21, + "name": "health_boost", + "translation_key": "effect.minecraft.health_boost", + "color": 16284963, + "instant": false, + "category": "Beneficial", + "attribute_modifiers": [ + { + "attribute": 0, + "operation": 0, + "value": 4.0, + "uuid": "5d6f0ba2-1186-46ac-b896-c61c5cee99cc" + } + ] + }, + { + "id": 22, + "name": "absorption", + "translation_key": "effect.minecraft.absorption", + "color": 2445989, + "instant": false, + "category": "Beneficial" + }, + { + "id": 23, + "name": "saturation", + "translation_key": "effect.minecraft.saturation", + "color": 16262179, + "instant": true, + "category": "Beneficial" + }, + { + "id": 24, + "name": "glowing", + "translation_key": "effect.minecraft.glowing", + "color": 9740385, + "instant": false, + "category": "Neutral" + }, + { + "id": 25, + "name": "levitation", + "translation_key": "effect.minecraft.levitation", + "color": 13565951, + "instant": false, + "category": "Harmful" + }, + { + "id": 26, + "name": "luck", + "translation_key": "effect.minecraft.luck", + "color": 5882118, + "instant": false, + "category": "Beneficial", + "attribute_modifiers": [ + { + "attribute": 10, + "operation": 0, + "value": 1.0, + "uuid": "03c3c89d-7037-4b42-869f-b146bcb64d2e" + } + ] + }, + { + "id": 27, + "name": "unluck", + "translation_key": "effect.minecraft.unluck", + "color": 12624973, + "instant": false, + "category": "Harmful", + "attribute_modifiers": [ + { + "attribute": 10, + "operation": 0, + "value": -1.0, + "uuid": "cc5af142-2bd2-4215-b636-2605aed11727" + } + ] + }, + { + "id": 28, + "name": "slow_falling", + "translation_key": "effect.minecraft.slow_falling", + "color": 15978425, + "instant": false, + "category": "Beneficial" + }, + { + "id": 29, + "name": "conduit_power", + "translation_key": "effect.minecraft.conduit_power", + "color": 1950417, + "instant": false, + "category": "Beneficial" + }, + { + "id": 30, + "name": "dolphins_grace", + "translation_key": "effect.minecraft.dolphins_grace", + "color": 8954814, + "instant": false, + "category": "Beneficial" + }, + { + "id": 31, + "name": "bad_omen", + "translation_key": "effect.minecraft.bad_omen", + "color": 745784, + "instant": false, + "category": "Neutral" + }, + { + "id": 32, + "name": "hero_of_the_village", + "translation_key": "effect.minecraft.hero_of_the_village", + "color": 4521796, + "instant": false, + "category": "Beneficial" + }, + { + "id": 33, + "name": "darkness", + "translation_key": "effect.minecraft.darkness", + "color": 2696993, + "instant": false, + "category": "Harmful" + } +] \ No newline at end of file diff --git a/vendor/valence/crates/valence_generated/extracted/items.json b/vendor/valence/crates/valence_generated/extracted/items.json new file mode 100644 index 00000000..caca6930 --- /dev/null +++ b/vendor/valence/crates/valence_generated/extracted/items.json @@ -0,0 +1,11701 @@ +[ + { + "id": 0, + "name": "air", + "translation_key": "block.minecraft.air", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1, + "name": "stone", + "translation_key": "block.minecraft.stone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 2, + "name": "granite", + "translation_key": "block.minecraft.granite", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 3, + "name": "polished_granite", + "translation_key": "block.minecraft.polished_granite", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 4, + "name": "diorite", + "translation_key": "block.minecraft.diorite", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 5, + "name": "polished_diorite", + "translation_key": "block.minecraft.polished_diorite", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 6, + "name": "andesite", + "translation_key": "block.minecraft.andesite", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 7, + "name": "polished_andesite", + "translation_key": "block.minecraft.polished_andesite", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 8, + "name": "deepslate", + "translation_key": "block.minecraft.deepslate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 9, + "name": "cobbled_deepslate", + "translation_key": "block.minecraft.cobbled_deepslate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 10, + "name": "polished_deepslate", + "translation_key": "block.minecraft.polished_deepslate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 11, + "name": "calcite", + "translation_key": "block.minecraft.calcite", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 12, + "name": "tuff", + "translation_key": "block.minecraft.tuff", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 13, + "name": "dripstone_block", + "translation_key": "block.minecraft.dripstone_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 14, + "name": "grass_block", + "translation_key": "block.minecraft.grass_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 15, + "name": "dirt", + "translation_key": "block.minecraft.dirt", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 16, + "name": "coarse_dirt", + "translation_key": "block.minecraft.coarse_dirt", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 17, + "name": "podzol", + "translation_key": "block.minecraft.podzol", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 18, + "name": "rooted_dirt", + "translation_key": "block.minecraft.rooted_dirt", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 19, + "name": "mud", + "translation_key": "block.minecraft.mud", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 20, + "name": "crimson_nylium", + "translation_key": "block.minecraft.crimson_nylium", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 21, + "name": "warped_nylium", + "translation_key": "block.minecraft.warped_nylium", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 22, + "name": "cobblestone", + "translation_key": "block.minecraft.cobblestone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 23, + "name": "oak_planks", + "translation_key": "block.minecraft.oak_planks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 24, + "name": "spruce_planks", + "translation_key": "block.minecraft.spruce_planks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 25, + "name": "birch_planks", + "translation_key": "block.minecraft.birch_planks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 26, + "name": "jungle_planks", + "translation_key": "block.minecraft.jungle_planks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 27, + "name": "acacia_planks", + "translation_key": "block.minecraft.acacia_planks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 28, + "name": "cherry_planks", + "translation_key": "block.minecraft.cherry_planks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 29, + "name": "dark_oak_planks", + "translation_key": "block.minecraft.dark_oak_planks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 30, + "name": "mangrove_planks", + "translation_key": "block.minecraft.mangrove_planks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 31, + "name": "bamboo_planks", + "translation_key": "block.minecraft.bamboo_planks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 32, + "name": "crimson_planks", + "translation_key": "block.minecraft.crimson_planks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 33, + "name": "warped_planks", + "translation_key": "block.minecraft.warped_planks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 34, + "name": "bamboo_mosaic", + "translation_key": "block.minecraft.bamboo_mosaic", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 35, + "name": "oak_sapling", + "translation_key": "block.minecraft.oak_sapling", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 36, + "name": "spruce_sapling", + "translation_key": "block.minecraft.spruce_sapling", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 37, + "name": "birch_sapling", + "translation_key": "block.minecraft.birch_sapling", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 38, + "name": "jungle_sapling", + "translation_key": "block.minecraft.jungle_sapling", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 39, + "name": "acacia_sapling", + "translation_key": "block.minecraft.acacia_sapling", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 40, + "name": "cherry_sapling", + "translation_key": "block.minecraft.cherry_sapling", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 41, + "name": "dark_oak_sapling", + "translation_key": "block.minecraft.dark_oak_sapling", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 42, + "name": "mangrove_propagule", + "translation_key": "block.minecraft.mangrove_propagule", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 43, + "name": "bedrock", + "translation_key": "block.minecraft.bedrock", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 44, + "name": "sand", + "translation_key": "block.minecraft.sand", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 45, + "name": "suspicious_sand", + "translation_key": "block.minecraft.suspicious_sand", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 46, + "name": "suspicious_gravel", + "translation_key": "block.minecraft.suspicious_gravel", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 47, + "name": "red_sand", + "translation_key": "block.minecraft.red_sand", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 48, + "name": "gravel", + "translation_key": "block.minecraft.gravel", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 49, + "name": "coal_ore", + "translation_key": "block.minecraft.coal_ore", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 50, + "name": "deepslate_coal_ore", + "translation_key": "block.minecraft.deepslate_coal_ore", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 51, + "name": "iron_ore", + "translation_key": "block.minecraft.iron_ore", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 52, + "name": "deepslate_iron_ore", + "translation_key": "block.minecraft.deepslate_iron_ore", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 53, + "name": "copper_ore", + "translation_key": "block.minecraft.copper_ore", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 54, + "name": "deepslate_copper_ore", + "translation_key": "block.minecraft.deepslate_copper_ore", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 55, + "name": "gold_ore", + "translation_key": "block.minecraft.gold_ore", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 56, + "name": "deepslate_gold_ore", + "translation_key": "block.minecraft.deepslate_gold_ore", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 57, + "name": "redstone_ore", + "translation_key": "block.minecraft.redstone_ore", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 58, + "name": "deepslate_redstone_ore", + "translation_key": "block.minecraft.deepslate_redstone_ore", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 59, + "name": "emerald_ore", + "translation_key": "block.minecraft.emerald_ore", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 60, + "name": "deepslate_emerald_ore", + "translation_key": "block.minecraft.deepslate_emerald_ore", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 61, + "name": "lapis_ore", + "translation_key": "block.minecraft.lapis_ore", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 62, + "name": "deepslate_lapis_ore", + "translation_key": "block.minecraft.deepslate_lapis_ore", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 63, + "name": "diamond_ore", + "translation_key": "block.minecraft.diamond_ore", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 64, + "name": "deepslate_diamond_ore", + "translation_key": "block.minecraft.deepslate_diamond_ore", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 65, + "name": "nether_gold_ore", + "translation_key": "block.minecraft.nether_gold_ore", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 66, + "name": "nether_quartz_ore", + "translation_key": "block.minecraft.nether_quartz_ore", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 67, + "name": "ancient_debris", + "translation_key": "block.minecraft.ancient_debris", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": true + }, + { + "id": 68, + "name": "coal_block", + "translation_key": "block.minecraft.coal_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 69, + "name": "raw_iron_block", + "translation_key": "block.minecraft.raw_iron_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 70, + "name": "raw_copper_block", + "translation_key": "block.minecraft.raw_copper_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 71, + "name": "raw_gold_block", + "translation_key": "block.minecraft.raw_gold_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 72, + "name": "amethyst_block", + "translation_key": "block.minecraft.amethyst_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 73, + "name": "budding_amethyst", + "translation_key": "block.minecraft.budding_amethyst", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 74, + "name": "iron_block", + "translation_key": "block.minecraft.iron_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 75, + "name": "copper_block", + "translation_key": "block.minecraft.copper_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 76, + "name": "gold_block", + "translation_key": "block.minecraft.gold_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 77, + "name": "diamond_block", + "translation_key": "block.minecraft.diamond_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 78, + "name": "netherite_block", + "translation_key": "block.minecraft.netherite_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": true + }, + { + "id": 79, + "name": "exposed_copper", + "translation_key": "block.minecraft.exposed_copper", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 80, + "name": "weathered_copper", + "translation_key": "block.minecraft.weathered_copper", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 81, + "name": "oxidized_copper", + "translation_key": "block.minecraft.oxidized_copper", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 82, + "name": "cut_copper", + "translation_key": "block.minecraft.cut_copper", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 83, + "name": "exposed_cut_copper", + "translation_key": "block.minecraft.exposed_cut_copper", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 84, + "name": "weathered_cut_copper", + "translation_key": "block.minecraft.weathered_cut_copper", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 85, + "name": "oxidized_cut_copper", + "translation_key": "block.minecraft.oxidized_cut_copper", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 86, + "name": "cut_copper_stairs", + "translation_key": "block.minecraft.cut_copper_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 87, + "name": "exposed_cut_copper_stairs", + "translation_key": "block.minecraft.exposed_cut_copper_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 88, + "name": "weathered_cut_copper_stairs", + "translation_key": "block.minecraft.weathered_cut_copper_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 89, + "name": "oxidized_cut_copper_stairs", + "translation_key": "block.minecraft.oxidized_cut_copper_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 90, + "name": "cut_copper_slab", + "translation_key": "block.minecraft.cut_copper_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 91, + "name": "exposed_cut_copper_slab", + "translation_key": "block.minecraft.exposed_cut_copper_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 92, + "name": "weathered_cut_copper_slab", + "translation_key": "block.minecraft.weathered_cut_copper_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 93, + "name": "oxidized_cut_copper_slab", + "translation_key": "block.minecraft.oxidized_cut_copper_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 94, + "name": "waxed_copper_block", + "translation_key": "block.minecraft.waxed_copper_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 95, + "name": "waxed_exposed_copper", + "translation_key": "block.minecraft.waxed_exposed_copper", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 96, + "name": "waxed_weathered_copper", + "translation_key": "block.minecraft.waxed_weathered_copper", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 97, + "name": "waxed_oxidized_copper", + "translation_key": "block.minecraft.waxed_oxidized_copper", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 98, + "name": "waxed_cut_copper", + "translation_key": "block.minecraft.waxed_cut_copper", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 99, + "name": "waxed_exposed_cut_copper", + "translation_key": "block.minecraft.waxed_exposed_cut_copper", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 100, + "name": "waxed_weathered_cut_copper", + "translation_key": "block.minecraft.waxed_weathered_cut_copper", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 101, + "name": "waxed_oxidized_cut_copper", + "translation_key": "block.minecraft.waxed_oxidized_cut_copper", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 102, + "name": "waxed_cut_copper_stairs", + "translation_key": "block.minecraft.waxed_cut_copper_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 103, + "name": "waxed_exposed_cut_copper_stairs", + "translation_key": "block.minecraft.waxed_exposed_cut_copper_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 104, + "name": "waxed_weathered_cut_copper_stairs", + "translation_key": "block.minecraft.waxed_weathered_cut_copper_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 105, + "name": "waxed_oxidized_cut_copper_stairs", + "translation_key": "block.minecraft.waxed_oxidized_cut_copper_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 106, + "name": "waxed_cut_copper_slab", + "translation_key": "block.minecraft.waxed_cut_copper_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 107, + "name": "waxed_exposed_cut_copper_slab", + "translation_key": "block.minecraft.waxed_exposed_cut_copper_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 108, + "name": "waxed_weathered_cut_copper_slab", + "translation_key": "block.minecraft.waxed_weathered_cut_copper_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 109, + "name": "waxed_oxidized_cut_copper_slab", + "translation_key": "block.minecraft.waxed_oxidized_cut_copper_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 110, + "name": "oak_log", + "translation_key": "block.minecraft.oak_log", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 111, + "name": "spruce_log", + "translation_key": "block.minecraft.spruce_log", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 112, + "name": "birch_log", + "translation_key": "block.minecraft.birch_log", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 113, + "name": "jungle_log", + "translation_key": "block.minecraft.jungle_log", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 114, + "name": "acacia_log", + "translation_key": "block.minecraft.acacia_log", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 115, + "name": "cherry_log", + "translation_key": "block.minecraft.cherry_log", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 116, + "name": "dark_oak_log", + "translation_key": "block.minecraft.dark_oak_log", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 117, + "name": "mangrove_log", + "translation_key": "block.minecraft.mangrove_log", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 118, + "name": "mangrove_roots", + "translation_key": "block.minecraft.mangrove_roots", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 119, + "name": "muddy_mangrove_roots", + "translation_key": "block.minecraft.muddy_mangrove_roots", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 120, + "name": "crimson_stem", + "translation_key": "block.minecraft.crimson_stem", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 121, + "name": "warped_stem", + "translation_key": "block.minecraft.warped_stem", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 122, + "name": "bamboo_block", + "translation_key": "block.minecraft.bamboo_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 123, + "name": "stripped_oak_log", + "translation_key": "block.minecraft.stripped_oak_log", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 124, + "name": "stripped_spruce_log", + "translation_key": "block.minecraft.stripped_spruce_log", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 125, + "name": "stripped_birch_log", + "translation_key": "block.minecraft.stripped_birch_log", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 126, + "name": "stripped_jungle_log", + "translation_key": "block.minecraft.stripped_jungle_log", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 127, + "name": "stripped_acacia_log", + "translation_key": "block.minecraft.stripped_acacia_log", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 128, + "name": "stripped_cherry_log", + "translation_key": "block.minecraft.stripped_cherry_log", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 129, + "name": "stripped_dark_oak_log", + "translation_key": "block.minecraft.stripped_dark_oak_log", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 130, + "name": "stripped_mangrove_log", + "translation_key": "block.minecraft.stripped_mangrove_log", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 131, + "name": "stripped_crimson_stem", + "translation_key": "block.minecraft.stripped_crimson_stem", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 132, + "name": "stripped_warped_stem", + "translation_key": "block.minecraft.stripped_warped_stem", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 133, + "name": "stripped_oak_wood", + "translation_key": "block.minecraft.stripped_oak_wood", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 134, + "name": "stripped_spruce_wood", + "translation_key": "block.minecraft.stripped_spruce_wood", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 135, + "name": "stripped_birch_wood", + "translation_key": "block.minecraft.stripped_birch_wood", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 136, + "name": "stripped_jungle_wood", + "translation_key": "block.minecraft.stripped_jungle_wood", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 137, + "name": "stripped_acacia_wood", + "translation_key": "block.minecraft.stripped_acacia_wood", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 138, + "name": "stripped_cherry_wood", + "translation_key": "block.minecraft.stripped_cherry_wood", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 139, + "name": "stripped_dark_oak_wood", + "translation_key": "block.minecraft.stripped_dark_oak_wood", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 140, + "name": "stripped_mangrove_wood", + "translation_key": "block.minecraft.stripped_mangrove_wood", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 141, + "name": "stripped_crimson_hyphae", + "translation_key": "block.minecraft.stripped_crimson_hyphae", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 142, + "name": "stripped_warped_hyphae", + "translation_key": "block.minecraft.stripped_warped_hyphae", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 143, + "name": "stripped_bamboo_block", + "translation_key": "block.minecraft.stripped_bamboo_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 144, + "name": "oak_wood", + "translation_key": "block.minecraft.oak_wood", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 145, + "name": "spruce_wood", + "translation_key": "block.minecraft.spruce_wood", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 146, + "name": "birch_wood", + "translation_key": "block.minecraft.birch_wood", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 147, + "name": "jungle_wood", + "translation_key": "block.minecraft.jungle_wood", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 148, + "name": "acacia_wood", + "translation_key": "block.minecraft.acacia_wood", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 149, + "name": "cherry_wood", + "translation_key": "block.minecraft.cherry_wood", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 150, + "name": "dark_oak_wood", + "translation_key": "block.minecraft.dark_oak_wood", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 151, + "name": "mangrove_wood", + "translation_key": "block.minecraft.mangrove_wood", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 152, + "name": "crimson_hyphae", + "translation_key": "block.minecraft.crimson_hyphae", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 153, + "name": "warped_hyphae", + "translation_key": "block.minecraft.warped_hyphae", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 154, + "name": "oak_leaves", + "translation_key": "block.minecraft.oak_leaves", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 155, + "name": "spruce_leaves", + "translation_key": "block.minecraft.spruce_leaves", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 156, + "name": "birch_leaves", + "translation_key": "block.minecraft.birch_leaves", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 157, + "name": "jungle_leaves", + "translation_key": "block.minecraft.jungle_leaves", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 158, + "name": "acacia_leaves", + "translation_key": "block.minecraft.acacia_leaves", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 159, + "name": "cherry_leaves", + "translation_key": "block.minecraft.cherry_leaves", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 160, + "name": "dark_oak_leaves", + "translation_key": "block.minecraft.dark_oak_leaves", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 161, + "name": "mangrove_leaves", + "translation_key": "block.minecraft.mangrove_leaves", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 162, + "name": "azalea_leaves", + "translation_key": "block.minecraft.azalea_leaves", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 163, + "name": "flowering_azalea_leaves", + "translation_key": "block.minecraft.flowering_azalea_leaves", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 164, + "name": "sponge", + "translation_key": "block.minecraft.sponge", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 165, + "name": "wet_sponge", + "translation_key": "block.minecraft.wet_sponge", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 166, + "name": "glass", + "translation_key": "block.minecraft.glass", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 167, + "name": "tinted_glass", + "translation_key": "block.minecraft.tinted_glass", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 168, + "name": "lapis_block", + "translation_key": "block.minecraft.lapis_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 169, + "name": "sandstone", + "translation_key": "block.minecraft.sandstone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 170, + "name": "chiseled_sandstone", + "translation_key": "block.minecraft.chiseled_sandstone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 171, + "name": "cut_sandstone", + "translation_key": "block.minecraft.cut_sandstone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 172, + "name": "cobweb", + "translation_key": "block.minecraft.cobweb", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 173, + "name": "grass", + "translation_key": "block.minecraft.grass", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 174, + "name": "fern", + "translation_key": "block.minecraft.fern", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 175, + "name": "azalea", + "translation_key": "block.minecraft.azalea", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 176, + "name": "flowering_azalea", + "translation_key": "block.minecraft.flowering_azalea", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 177, + "name": "dead_bush", + "translation_key": "block.minecraft.dead_bush", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 178, + "name": "seagrass", + "translation_key": "block.minecraft.seagrass", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 179, + "name": "sea_pickle", + "translation_key": "block.minecraft.sea_pickle", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 180, + "name": "white_wool", + "translation_key": "block.minecraft.white_wool", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 181, + "name": "orange_wool", + "translation_key": "block.minecraft.orange_wool", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 182, + "name": "magenta_wool", + "translation_key": "block.minecraft.magenta_wool", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 183, + "name": "light_blue_wool", + "translation_key": "block.minecraft.light_blue_wool", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 184, + "name": "yellow_wool", + "translation_key": "block.minecraft.yellow_wool", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 185, + "name": "lime_wool", + "translation_key": "block.minecraft.lime_wool", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 186, + "name": "pink_wool", + "translation_key": "block.minecraft.pink_wool", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 187, + "name": "gray_wool", + "translation_key": "block.minecraft.gray_wool", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 188, + "name": "light_gray_wool", + "translation_key": "block.minecraft.light_gray_wool", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 189, + "name": "cyan_wool", + "translation_key": "block.minecraft.cyan_wool", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 190, + "name": "purple_wool", + "translation_key": "block.minecraft.purple_wool", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 191, + "name": "blue_wool", + "translation_key": "block.minecraft.blue_wool", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 192, + "name": "brown_wool", + "translation_key": "block.minecraft.brown_wool", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 193, + "name": "green_wool", + "translation_key": "block.minecraft.green_wool", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 194, + "name": "red_wool", + "translation_key": "block.minecraft.red_wool", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 195, + "name": "black_wool", + "translation_key": "block.minecraft.black_wool", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 196, + "name": "dandelion", + "translation_key": "block.minecraft.dandelion", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 197, + "name": "poppy", + "translation_key": "block.minecraft.poppy", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 198, + "name": "blue_orchid", + "translation_key": "block.minecraft.blue_orchid", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 199, + "name": "allium", + "translation_key": "block.minecraft.allium", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 200, + "name": "azure_bluet", + "translation_key": "block.minecraft.azure_bluet", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 201, + "name": "red_tulip", + "translation_key": "block.minecraft.red_tulip", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 202, + "name": "orange_tulip", + "translation_key": "block.minecraft.orange_tulip", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 203, + "name": "white_tulip", + "translation_key": "block.minecraft.white_tulip", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 204, + "name": "pink_tulip", + "translation_key": "block.minecraft.pink_tulip", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 205, + "name": "oxeye_daisy", + "translation_key": "block.minecraft.oxeye_daisy", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 206, + "name": "cornflower", + "translation_key": "block.minecraft.cornflower", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 207, + "name": "lily_of_the_valley", + "translation_key": "block.minecraft.lily_of_the_valley", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 208, + "name": "wither_rose", + "translation_key": "block.minecraft.wither_rose", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 209, + "name": "torchflower", + "translation_key": "block.minecraft.torchflower", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 210, + "name": "pitcher_plant", + "translation_key": "block.minecraft.pitcher_plant", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 211, + "name": "spore_blossom", + "translation_key": "block.minecraft.spore_blossom", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 212, + "name": "brown_mushroom", + "translation_key": "block.minecraft.brown_mushroom", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 213, + "name": "red_mushroom", + "translation_key": "block.minecraft.red_mushroom", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 214, + "name": "crimson_fungus", + "translation_key": "block.minecraft.crimson_fungus", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 215, + "name": "warped_fungus", + "translation_key": "block.minecraft.warped_fungus", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 216, + "name": "crimson_roots", + "translation_key": "block.minecraft.crimson_roots", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 217, + "name": "warped_roots", + "translation_key": "block.minecraft.warped_roots", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 218, + "name": "nether_sprouts", + "translation_key": "block.minecraft.nether_sprouts", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 219, + "name": "weeping_vines", + "translation_key": "block.minecraft.weeping_vines", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 220, + "name": "twisting_vines", + "translation_key": "block.minecraft.twisting_vines", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 221, + "name": "sugar_cane", + "translation_key": "block.minecraft.sugar_cane", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 222, + "name": "kelp", + "translation_key": "block.minecraft.kelp", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 223, + "name": "moss_carpet", + "translation_key": "block.minecraft.moss_carpet", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 224, + "name": "pink_petals", + "translation_key": "block.minecraft.pink_petals", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 225, + "name": "moss_block", + "translation_key": "block.minecraft.moss_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 226, + "name": "hanging_roots", + "translation_key": "block.minecraft.hanging_roots", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 227, + "name": "big_dripleaf", + "translation_key": "block.minecraft.big_dripleaf", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 228, + "name": "small_dripleaf", + "translation_key": "block.minecraft.small_dripleaf", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 229, + "name": "bamboo", + "translation_key": "block.minecraft.bamboo", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 230, + "name": "oak_slab", + "translation_key": "block.minecraft.oak_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 231, + "name": "spruce_slab", + "translation_key": "block.minecraft.spruce_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 232, + "name": "birch_slab", + "translation_key": "block.minecraft.birch_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 233, + "name": "jungle_slab", + "translation_key": "block.minecraft.jungle_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 234, + "name": "acacia_slab", + "translation_key": "block.minecraft.acacia_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 235, + "name": "cherry_slab", + "translation_key": "block.minecraft.cherry_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 236, + "name": "dark_oak_slab", + "translation_key": "block.minecraft.dark_oak_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 237, + "name": "mangrove_slab", + "translation_key": "block.minecraft.mangrove_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 238, + "name": "bamboo_slab", + "translation_key": "block.minecraft.bamboo_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 239, + "name": "bamboo_mosaic_slab", + "translation_key": "block.minecraft.bamboo_mosaic_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 240, + "name": "crimson_slab", + "translation_key": "block.minecraft.crimson_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 241, + "name": "warped_slab", + "translation_key": "block.minecraft.warped_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 242, + "name": "stone_slab", + "translation_key": "block.minecraft.stone_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 243, + "name": "smooth_stone_slab", + "translation_key": "block.minecraft.smooth_stone_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 244, + "name": "sandstone_slab", + "translation_key": "block.minecraft.sandstone_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 245, + "name": "cut_sandstone_slab", + "translation_key": "block.minecraft.cut_sandstone_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 246, + "name": "petrified_oak_slab", + "translation_key": "block.minecraft.petrified_oak_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 247, + "name": "cobblestone_slab", + "translation_key": "block.minecraft.cobblestone_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 248, + "name": "brick_slab", + "translation_key": "block.minecraft.brick_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 249, + "name": "stone_brick_slab", + "translation_key": "block.minecraft.stone_brick_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 250, + "name": "mud_brick_slab", + "translation_key": "block.minecraft.mud_brick_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 251, + "name": "nether_brick_slab", + "translation_key": "block.minecraft.nether_brick_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 252, + "name": "quartz_slab", + "translation_key": "block.minecraft.quartz_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 253, + "name": "red_sandstone_slab", + "translation_key": "block.minecraft.red_sandstone_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 254, + "name": "cut_red_sandstone_slab", + "translation_key": "block.minecraft.cut_red_sandstone_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 255, + "name": "purpur_slab", + "translation_key": "block.minecraft.purpur_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 256, + "name": "prismarine_slab", + "translation_key": "block.minecraft.prismarine_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 257, + "name": "prismarine_brick_slab", + "translation_key": "block.minecraft.prismarine_brick_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 258, + "name": "dark_prismarine_slab", + "translation_key": "block.minecraft.dark_prismarine_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 259, + "name": "smooth_quartz", + "translation_key": "block.minecraft.smooth_quartz", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 260, + "name": "smooth_red_sandstone", + "translation_key": "block.minecraft.smooth_red_sandstone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 261, + "name": "smooth_sandstone", + "translation_key": "block.minecraft.smooth_sandstone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 262, + "name": "smooth_stone", + "translation_key": "block.minecraft.smooth_stone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 263, + "name": "bricks", + "translation_key": "block.minecraft.bricks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 264, + "name": "bookshelf", + "translation_key": "block.minecraft.bookshelf", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 265, + "name": "chiseled_bookshelf", + "translation_key": "block.minecraft.chiseled_bookshelf", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 266, + "name": "decorated_pot", + "translation_key": "block.minecraft.decorated_pot", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 267, + "name": "mossy_cobblestone", + "translation_key": "block.minecraft.mossy_cobblestone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 268, + "name": "obsidian", + "translation_key": "block.minecraft.obsidian", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 269, + "name": "torch", + "translation_key": "block.minecraft.torch", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 270, + "name": "end_rod", + "translation_key": "block.minecraft.end_rod", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 271, + "name": "chorus_plant", + "translation_key": "block.minecraft.chorus_plant", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 272, + "name": "chorus_flower", + "translation_key": "block.minecraft.chorus_flower", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 273, + "name": "purpur_block", + "translation_key": "block.minecraft.purpur_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 274, + "name": "purpur_pillar", + "translation_key": "block.minecraft.purpur_pillar", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 275, + "name": "purpur_stairs", + "translation_key": "block.minecraft.purpur_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 276, + "name": "spawner", + "translation_key": "block.minecraft.spawner", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 277, + "name": "chest", + "translation_key": "block.minecraft.chest", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 278, + "name": "crafting_table", + "translation_key": "block.minecraft.crafting_table", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 279, + "name": "farmland", + "translation_key": "block.minecraft.farmland", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 280, + "name": "furnace", + "translation_key": "block.minecraft.furnace", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 281, + "name": "ladder", + "translation_key": "block.minecraft.ladder", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 282, + "name": "cobblestone_stairs", + "translation_key": "block.minecraft.cobblestone_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 283, + "name": "snow", + "translation_key": "block.minecraft.snow", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 284, + "name": "ice", + "translation_key": "block.minecraft.ice", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 285, + "name": "snow_block", + "translation_key": "block.minecraft.snow_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 286, + "name": "cactus", + "translation_key": "block.minecraft.cactus", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 287, + "name": "clay", + "translation_key": "block.minecraft.clay", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 288, + "name": "jukebox", + "translation_key": "block.minecraft.jukebox", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 289, + "name": "oak_fence", + "translation_key": "block.minecraft.oak_fence", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 290, + "name": "spruce_fence", + "translation_key": "block.minecraft.spruce_fence", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 291, + "name": "birch_fence", + "translation_key": "block.minecraft.birch_fence", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 292, + "name": "jungle_fence", + "translation_key": "block.minecraft.jungle_fence", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 293, + "name": "acacia_fence", + "translation_key": "block.minecraft.acacia_fence", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 294, + "name": "cherry_fence", + "translation_key": "block.minecraft.cherry_fence", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 295, + "name": "dark_oak_fence", + "translation_key": "block.minecraft.dark_oak_fence", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 296, + "name": "mangrove_fence", + "translation_key": "block.minecraft.mangrove_fence", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 297, + "name": "bamboo_fence", + "translation_key": "block.minecraft.bamboo_fence", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 298, + "name": "crimson_fence", + "translation_key": "block.minecraft.crimson_fence", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 299, + "name": "warped_fence", + "translation_key": "block.minecraft.warped_fence", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 300, + "name": "pumpkin", + "translation_key": "block.minecraft.pumpkin", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 301, + "name": "carved_pumpkin", + "translation_key": "block.minecraft.carved_pumpkin", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 302, + "name": "jack_o_lantern", + "translation_key": "block.minecraft.jack_o_lantern", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 303, + "name": "netherrack", + "translation_key": "block.minecraft.netherrack", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 304, + "name": "soul_sand", + "translation_key": "block.minecraft.soul_sand", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 305, + "name": "soul_soil", + "translation_key": "block.minecraft.soul_soil", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 306, + "name": "basalt", + "translation_key": "block.minecraft.basalt", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 307, + "name": "polished_basalt", + "translation_key": "block.minecraft.polished_basalt", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 308, + "name": "smooth_basalt", + "translation_key": "block.minecraft.smooth_basalt", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 309, + "name": "soul_torch", + "translation_key": "block.minecraft.soul_torch", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 310, + "name": "glowstone", + "translation_key": "block.minecraft.glowstone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 311, + "name": "infested_stone", + "translation_key": "block.minecraft.infested_stone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 312, + "name": "infested_cobblestone", + "translation_key": "block.minecraft.infested_cobblestone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 313, + "name": "infested_stone_bricks", + "translation_key": "block.minecraft.infested_stone_bricks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 314, + "name": "infested_mossy_stone_bricks", + "translation_key": "block.minecraft.infested_mossy_stone_bricks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 315, + "name": "infested_cracked_stone_bricks", + "translation_key": "block.minecraft.infested_cracked_stone_bricks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 316, + "name": "infested_chiseled_stone_bricks", + "translation_key": "block.minecraft.infested_chiseled_stone_bricks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 317, + "name": "infested_deepslate", + "translation_key": "block.minecraft.infested_deepslate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 318, + "name": "stone_bricks", + "translation_key": "block.minecraft.stone_bricks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 319, + "name": "mossy_stone_bricks", + "translation_key": "block.minecraft.mossy_stone_bricks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 320, + "name": "cracked_stone_bricks", + "translation_key": "block.minecraft.cracked_stone_bricks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 321, + "name": "chiseled_stone_bricks", + "translation_key": "block.minecraft.chiseled_stone_bricks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 322, + "name": "packed_mud", + "translation_key": "block.minecraft.packed_mud", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 323, + "name": "mud_bricks", + "translation_key": "block.minecraft.mud_bricks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 324, + "name": "deepslate_bricks", + "translation_key": "block.minecraft.deepslate_bricks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 325, + "name": "cracked_deepslate_bricks", + "translation_key": "block.minecraft.cracked_deepslate_bricks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 326, + "name": "deepslate_tiles", + "translation_key": "block.minecraft.deepslate_tiles", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 327, + "name": "cracked_deepslate_tiles", + "translation_key": "block.minecraft.cracked_deepslate_tiles", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 328, + "name": "chiseled_deepslate", + "translation_key": "block.minecraft.chiseled_deepslate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 329, + "name": "reinforced_deepslate", + "translation_key": "block.minecraft.reinforced_deepslate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 330, + "name": "brown_mushroom_block", + "translation_key": "block.minecraft.brown_mushroom_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 331, + "name": "red_mushroom_block", + "translation_key": "block.minecraft.red_mushroom_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 332, + "name": "mushroom_stem", + "translation_key": "block.minecraft.mushroom_stem", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 333, + "name": "iron_bars", + "translation_key": "block.minecraft.iron_bars", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 334, + "name": "chain", + "translation_key": "block.minecraft.chain", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 335, + "name": "glass_pane", + "translation_key": "block.minecraft.glass_pane", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 336, + "name": "melon", + "translation_key": "block.minecraft.melon", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 337, + "name": "vine", + "translation_key": "block.minecraft.vine", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 338, + "name": "glow_lichen", + "translation_key": "block.minecraft.glow_lichen", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 339, + "name": "brick_stairs", + "translation_key": "block.minecraft.brick_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 340, + "name": "stone_brick_stairs", + "translation_key": "block.minecraft.stone_brick_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 341, + "name": "mud_brick_stairs", + "translation_key": "block.minecraft.mud_brick_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 342, + "name": "mycelium", + "translation_key": "block.minecraft.mycelium", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 343, + "name": "lily_pad", + "translation_key": "block.minecraft.lily_pad", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 344, + "name": "nether_bricks", + "translation_key": "block.minecraft.nether_bricks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 345, + "name": "cracked_nether_bricks", + "translation_key": "block.minecraft.cracked_nether_bricks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 346, + "name": "chiseled_nether_bricks", + "translation_key": "block.minecraft.chiseled_nether_bricks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 347, + "name": "nether_brick_fence", + "translation_key": "block.minecraft.nether_brick_fence", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 348, + "name": "nether_brick_stairs", + "translation_key": "block.minecraft.nether_brick_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 349, + "name": "sculk", + "translation_key": "block.minecraft.sculk", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 350, + "name": "sculk_vein", + "translation_key": "block.minecraft.sculk_vein", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 351, + "name": "sculk_catalyst", + "translation_key": "block.minecraft.sculk_catalyst", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 352, + "name": "sculk_shrieker", + "translation_key": "block.minecraft.sculk_shrieker", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 353, + "name": "enchanting_table", + "translation_key": "block.minecraft.enchanting_table", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 354, + "name": "end_portal_frame", + "translation_key": "block.minecraft.end_portal_frame", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 355, + "name": "end_stone", + "translation_key": "block.minecraft.end_stone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 356, + "name": "end_stone_bricks", + "translation_key": "block.minecraft.end_stone_bricks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 357, + "name": "dragon_egg", + "translation_key": "block.minecraft.dragon_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 358, + "name": "sandstone_stairs", + "translation_key": "block.minecraft.sandstone_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 359, + "name": "ender_chest", + "translation_key": "block.minecraft.ender_chest", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 360, + "name": "emerald_block", + "translation_key": "block.minecraft.emerald_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 361, + "name": "oak_stairs", + "translation_key": "block.minecraft.oak_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 362, + "name": "spruce_stairs", + "translation_key": "block.minecraft.spruce_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 363, + "name": "birch_stairs", + "translation_key": "block.minecraft.birch_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 364, + "name": "jungle_stairs", + "translation_key": "block.minecraft.jungle_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 365, + "name": "acacia_stairs", + "translation_key": "block.minecraft.acacia_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 366, + "name": "cherry_stairs", + "translation_key": "block.minecraft.cherry_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 367, + "name": "dark_oak_stairs", + "translation_key": "block.minecraft.dark_oak_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 368, + "name": "mangrove_stairs", + "translation_key": "block.minecraft.mangrove_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 369, + "name": "bamboo_stairs", + "translation_key": "block.minecraft.bamboo_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 370, + "name": "bamboo_mosaic_stairs", + "translation_key": "block.minecraft.bamboo_mosaic_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 371, + "name": "crimson_stairs", + "translation_key": "block.minecraft.crimson_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 372, + "name": "warped_stairs", + "translation_key": "block.minecraft.warped_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 373, + "name": "command_block", + "translation_key": "block.minecraft.command_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 374, + "name": "beacon", + "translation_key": "block.minecraft.beacon", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 375, + "name": "cobblestone_wall", + "translation_key": "block.minecraft.cobblestone_wall", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 376, + "name": "mossy_cobblestone_wall", + "translation_key": "block.minecraft.mossy_cobblestone_wall", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 377, + "name": "brick_wall", + "translation_key": "block.minecraft.brick_wall", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 378, + "name": "prismarine_wall", + "translation_key": "block.minecraft.prismarine_wall", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 379, + "name": "red_sandstone_wall", + "translation_key": "block.minecraft.red_sandstone_wall", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 380, + "name": "mossy_stone_brick_wall", + "translation_key": "block.minecraft.mossy_stone_brick_wall", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 381, + "name": "granite_wall", + "translation_key": "block.minecraft.granite_wall", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 382, + "name": "stone_brick_wall", + "translation_key": "block.minecraft.stone_brick_wall", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 383, + "name": "mud_brick_wall", + "translation_key": "block.minecraft.mud_brick_wall", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 384, + "name": "nether_brick_wall", + "translation_key": "block.minecraft.nether_brick_wall", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 385, + "name": "andesite_wall", + "translation_key": "block.minecraft.andesite_wall", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 386, + "name": "red_nether_brick_wall", + "translation_key": "block.minecraft.red_nether_brick_wall", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 387, + "name": "sandstone_wall", + "translation_key": "block.minecraft.sandstone_wall", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 388, + "name": "end_stone_brick_wall", + "translation_key": "block.minecraft.end_stone_brick_wall", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 389, + "name": "diorite_wall", + "translation_key": "block.minecraft.diorite_wall", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 390, + "name": "blackstone_wall", + "translation_key": "block.minecraft.blackstone_wall", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 391, + "name": "polished_blackstone_wall", + "translation_key": "block.minecraft.polished_blackstone_wall", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 392, + "name": "polished_blackstone_brick_wall", + "translation_key": "block.minecraft.polished_blackstone_brick_wall", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 393, + "name": "cobbled_deepslate_wall", + "translation_key": "block.minecraft.cobbled_deepslate_wall", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 394, + "name": "polished_deepslate_wall", + "translation_key": "block.minecraft.polished_deepslate_wall", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 395, + "name": "deepslate_brick_wall", + "translation_key": "block.minecraft.deepslate_brick_wall", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 396, + "name": "deepslate_tile_wall", + "translation_key": "block.minecraft.deepslate_tile_wall", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 397, + "name": "anvil", + "translation_key": "block.minecraft.anvil", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 398, + "name": "chipped_anvil", + "translation_key": "block.minecraft.chipped_anvil", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 399, + "name": "damaged_anvil", + "translation_key": "block.minecraft.damaged_anvil", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 400, + "name": "chiseled_quartz_block", + "translation_key": "block.minecraft.chiseled_quartz_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 401, + "name": "quartz_block", + "translation_key": "block.minecraft.quartz_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 402, + "name": "quartz_bricks", + "translation_key": "block.minecraft.quartz_bricks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 403, + "name": "quartz_pillar", + "translation_key": "block.minecraft.quartz_pillar", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 404, + "name": "quartz_stairs", + "translation_key": "block.minecraft.quartz_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 405, + "name": "white_terracotta", + "translation_key": "block.minecraft.white_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 406, + "name": "orange_terracotta", + "translation_key": "block.minecraft.orange_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 407, + "name": "magenta_terracotta", + "translation_key": "block.minecraft.magenta_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 408, + "name": "light_blue_terracotta", + "translation_key": "block.minecraft.light_blue_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 409, + "name": "yellow_terracotta", + "translation_key": "block.minecraft.yellow_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 410, + "name": "lime_terracotta", + "translation_key": "block.minecraft.lime_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 411, + "name": "pink_terracotta", + "translation_key": "block.minecraft.pink_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 412, + "name": "gray_terracotta", + "translation_key": "block.minecraft.gray_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 413, + "name": "light_gray_terracotta", + "translation_key": "block.minecraft.light_gray_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 414, + "name": "cyan_terracotta", + "translation_key": "block.minecraft.cyan_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 415, + "name": "purple_terracotta", + "translation_key": "block.minecraft.purple_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 416, + "name": "blue_terracotta", + "translation_key": "block.minecraft.blue_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 417, + "name": "brown_terracotta", + "translation_key": "block.minecraft.brown_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 418, + "name": "green_terracotta", + "translation_key": "block.minecraft.green_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 419, + "name": "red_terracotta", + "translation_key": "block.minecraft.red_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 420, + "name": "black_terracotta", + "translation_key": "block.minecraft.black_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 421, + "name": "barrier", + "translation_key": "block.minecraft.barrier", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 422, + "name": "light", + "translation_key": "block.minecraft.light", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 423, + "name": "hay_block", + "translation_key": "block.minecraft.hay_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 424, + "name": "white_carpet", + "translation_key": "block.minecraft.white_carpet", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 425, + "name": "orange_carpet", + "translation_key": "block.minecraft.orange_carpet", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 426, + "name": "magenta_carpet", + "translation_key": "block.minecraft.magenta_carpet", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 427, + "name": "light_blue_carpet", + "translation_key": "block.minecraft.light_blue_carpet", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 428, + "name": "yellow_carpet", + "translation_key": "block.minecraft.yellow_carpet", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 429, + "name": "lime_carpet", + "translation_key": "block.minecraft.lime_carpet", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 430, + "name": "pink_carpet", + "translation_key": "block.minecraft.pink_carpet", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 431, + "name": "gray_carpet", + "translation_key": "block.minecraft.gray_carpet", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 432, + "name": "light_gray_carpet", + "translation_key": "block.minecraft.light_gray_carpet", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 433, + "name": "cyan_carpet", + "translation_key": "block.minecraft.cyan_carpet", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 434, + "name": "purple_carpet", + "translation_key": "block.minecraft.purple_carpet", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 435, + "name": "blue_carpet", + "translation_key": "block.minecraft.blue_carpet", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 436, + "name": "brown_carpet", + "translation_key": "block.minecraft.brown_carpet", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 437, + "name": "green_carpet", + "translation_key": "block.minecraft.green_carpet", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 438, + "name": "red_carpet", + "translation_key": "block.minecraft.red_carpet", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 439, + "name": "black_carpet", + "translation_key": "block.minecraft.black_carpet", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 440, + "name": "terracotta", + "translation_key": "block.minecraft.terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 441, + "name": "packed_ice", + "translation_key": "block.minecraft.packed_ice", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 442, + "name": "dirt_path", + "translation_key": "block.minecraft.dirt_path", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 443, + "name": "sunflower", + "translation_key": "block.minecraft.sunflower", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 444, + "name": "lilac", + "translation_key": "block.minecraft.lilac", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 445, + "name": "rose_bush", + "translation_key": "block.minecraft.rose_bush", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 446, + "name": "peony", + "translation_key": "block.minecraft.peony", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 447, + "name": "tall_grass", + "translation_key": "block.minecraft.tall_grass", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 448, + "name": "large_fern", + "translation_key": "block.minecraft.large_fern", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 449, + "name": "white_stained_glass", + "translation_key": "block.minecraft.white_stained_glass", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 450, + "name": "orange_stained_glass", + "translation_key": "block.minecraft.orange_stained_glass", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 451, + "name": "magenta_stained_glass", + "translation_key": "block.minecraft.magenta_stained_glass", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 452, + "name": "light_blue_stained_glass", + "translation_key": "block.minecraft.light_blue_stained_glass", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 453, + "name": "yellow_stained_glass", + "translation_key": "block.minecraft.yellow_stained_glass", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 454, + "name": "lime_stained_glass", + "translation_key": "block.minecraft.lime_stained_glass", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 455, + "name": "pink_stained_glass", + "translation_key": "block.minecraft.pink_stained_glass", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 456, + "name": "gray_stained_glass", + "translation_key": "block.minecraft.gray_stained_glass", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 457, + "name": "light_gray_stained_glass", + "translation_key": "block.minecraft.light_gray_stained_glass", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 458, + "name": "cyan_stained_glass", + "translation_key": "block.minecraft.cyan_stained_glass", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 459, + "name": "purple_stained_glass", + "translation_key": "block.minecraft.purple_stained_glass", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 460, + "name": "blue_stained_glass", + "translation_key": "block.minecraft.blue_stained_glass", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 461, + "name": "brown_stained_glass", + "translation_key": "block.minecraft.brown_stained_glass", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 462, + "name": "green_stained_glass", + "translation_key": "block.minecraft.green_stained_glass", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 463, + "name": "red_stained_glass", + "translation_key": "block.minecraft.red_stained_glass", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 464, + "name": "black_stained_glass", + "translation_key": "block.minecraft.black_stained_glass", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 465, + "name": "white_stained_glass_pane", + "translation_key": "block.minecraft.white_stained_glass_pane", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 466, + "name": "orange_stained_glass_pane", + "translation_key": "block.minecraft.orange_stained_glass_pane", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 467, + "name": "magenta_stained_glass_pane", + "translation_key": "block.minecraft.magenta_stained_glass_pane", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 468, + "name": "light_blue_stained_glass_pane", + "translation_key": "block.minecraft.light_blue_stained_glass_pane", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 469, + "name": "yellow_stained_glass_pane", + "translation_key": "block.minecraft.yellow_stained_glass_pane", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 470, + "name": "lime_stained_glass_pane", + "translation_key": "block.minecraft.lime_stained_glass_pane", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 471, + "name": "pink_stained_glass_pane", + "translation_key": "block.minecraft.pink_stained_glass_pane", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 472, + "name": "gray_stained_glass_pane", + "translation_key": "block.minecraft.gray_stained_glass_pane", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 473, + "name": "light_gray_stained_glass_pane", + "translation_key": "block.minecraft.light_gray_stained_glass_pane", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 474, + "name": "cyan_stained_glass_pane", + "translation_key": "block.minecraft.cyan_stained_glass_pane", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 475, + "name": "purple_stained_glass_pane", + "translation_key": "block.minecraft.purple_stained_glass_pane", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 476, + "name": "blue_stained_glass_pane", + "translation_key": "block.minecraft.blue_stained_glass_pane", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 477, + "name": "brown_stained_glass_pane", + "translation_key": "block.minecraft.brown_stained_glass_pane", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 478, + "name": "green_stained_glass_pane", + "translation_key": "block.minecraft.green_stained_glass_pane", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 479, + "name": "red_stained_glass_pane", + "translation_key": "block.minecraft.red_stained_glass_pane", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 480, + "name": "black_stained_glass_pane", + "translation_key": "block.minecraft.black_stained_glass_pane", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 481, + "name": "prismarine", + "translation_key": "block.minecraft.prismarine", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 482, + "name": "prismarine_bricks", + "translation_key": "block.minecraft.prismarine_bricks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 483, + "name": "dark_prismarine", + "translation_key": "block.minecraft.dark_prismarine", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 484, + "name": "prismarine_stairs", + "translation_key": "block.minecraft.prismarine_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 485, + "name": "prismarine_brick_stairs", + "translation_key": "block.minecraft.prismarine_brick_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 486, + "name": "dark_prismarine_stairs", + "translation_key": "block.minecraft.dark_prismarine_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 487, + "name": "sea_lantern", + "translation_key": "block.minecraft.sea_lantern", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 488, + "name": "red_sandstone", + "translation_key": "block.minecraft.red_sandstone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 489, + "name": "chiseled_red_sandstone", + "translation_key": "block.minecraft.chiseled_red_sandstone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 490, + "name": "cut_red_sandstone", + "translation_key": "block.minecraft.cut_red_sandstone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 491, + "name": "red_sandstone_stairs", + "translation_key": "block.minecraft.red_sandstone_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 492, + "name": "repeating_command_block", + "translation_key": "block.minecraft.repeating_command_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 493, + "name": "chain_command_block", + "translation_key": "block.minecraft.chain_command_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 494, + "name": "magma_block", + "translation_key": "block.minecraft.magma_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 495, + "name": "nether_wart_block", + "translation_key": "block.minecraft.nether_wart_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 496, + "name": "warped_wart_block", + "translation_key": "block.minecraft.warped_wart_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 497, + "name": "red_nether_bricks", + "translation_key": "block.minecraft.red_nether_bricks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 498, + "name": "bone_block", + "translation_key": "block.minecraft.bone_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 499, + "name": "structure_void", + "translation_key": "block.minecraft.structure_void", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 500, + "name": "shulker_box", + "translation_key": "block.minecraft.shulker_box", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 501, + "name": "white_shulker_box", + "translation_key": "block.minecraft.white_shulker_box", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 502, + "name": "orange_shulker_box", + "translation_key": "block.minecraft.orange_shulker_box", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 503, + "name": "magenta_shulker_box", + "translation_key": "block.minecraft.magenta_shulker_box", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 504, + "name": "light_blue_shulker_box", + "translation_key": "block.minecraft.light_blue_shulker_box", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 505, + "name": "yellow_shulker_box", + "translation_key": "block.minecraft.yellow_shulker_box", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 506, + "name": "lime_shulker_box", + "translation_key": "block.minecraft.lime_shulker_box", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 507, + "name": "pink_shulker_box", + "translation_key": "block.minecraft.pink_shulker_box", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 508, + "name": "gray_shulker_box", + "translation_key": "block.minecraft.gray_shulker_box", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 509, + "name": "light_gray_shulker_box", + "translation_key": "block.minecraft.light_gray_shulker_box", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 510, + "name": "cyan_shulker_box", + "translation_key": "block.minecraft.cyan_shulker_box", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 511, + "name": "purple_shulker_box", + "translation_key": "block.minecraft.purple_shulker_box", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 512, + "name": "blue_shulker_box", + "translation_key": "block.minecraft.blue_shulker_box", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 513, + "name": "brown_shulker_box", + "translation_key": "block.minecraft.brown_shulker_box", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 514, + "name": "green_shulker_box", + "translation_key": "block.minecraft.green_shulker_box", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 515, + "name": "red_shulker_box", + "translation_key": "block.minecraft.red_shulker_box", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 516, + "name": "black_shulker_box", + "translation_key": "block.minecraft.black_shulker_box", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 517, + "name": "white_glazed_terracotta", + "translation_key": "block.minecraft.white_glazed_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 518, + "name": "orange_glazed_terracotta", + "translation_key": "block.minecraft.orange_glazed_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 519, + "name": "magenta_glazed_terracotta", + "translation_key": "block.minecraft.magenta_glazed_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 520, + "name": "light_blue_glazed_terracotta", + "translation_key": "block.minecraft.light_blue_glazed_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 521, + "name": "yellow_glazed_terracotta", + "translation_key": "block.minecraft.yellow_glazed_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 522, + "name": "lime_glazed_terracotta", + "translation_key": "block.minecraft.lime_glazed_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 523, + "name": "pink_glazed_terracotta", + "translation_key": "block.minecraft.pink_glazed_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 524, + "name": "gray_glazed_terracotta", + "translation_key": "block.minecraft.gray_glazed_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 525, + "name": "light_gray_glazed_terracotta", + "translation_key": "block.minecraft.light_gray_glazed_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 526, + "name": "cyan_glazed_terracotta", + "translation_key": "block.minecraft.cyan_glazed_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 527, + "name": "purple_glazed_terracotta", + "translation_key": "block.minecraft.purple_glazed_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 528, + "name": "blue_glazed_terracotta", + "translation_key": "block.minecraft.blue_glazed_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 529, + "name": "brown_glazed_terracotta", + "translation_key": "block.minecraft.brown_glazed_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 530, + "name": "green_glazed_terracotta", + "translation_key": "block.minecraft.green_glazed_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 531, + "name": "red_glazed_terracotta", + "translation_key": "block.minecraft.red_glazed_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 532, + "name": "black_glazed_terracotta", + "translation_key": "block.minecraft.black_glazed_terracotta", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 533, + "name": "white_concrete", + "translation_key": "block.minecraft.white_concrete", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 534, + "name": "orange_concrete", + "translation_key": "block.minecraft.orange_concrete", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 535, + "name": "magenta_concrete", + "translation_key": "block.minecraft.magenta_concrete", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 536, + "name": "light_blue_concrete", + "translation_key": "block.minecraft.light_blue_concrete", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 537, + "name": "yellow_concrete", + "translation_key": "block.minecraft.yellow_concrete", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 538, + "name": "lime_concrete", + "translation_key": "block.minecraft.lime_concrete", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 539, + "name": "pink_concrete", + "translation_key": "block.minecraft.pink_concrete", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 540, + "name": "gray_concrete", + "translation_key": "block.minecraft.gray_concrete", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 541, + "name": "light_gray_concrete", + "translation_key": "block.minecraft.light_gray_concrete", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 542, + "name": "cyan_concrete", + "translation_key": "block.minecraft.cyan_concrete", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 543, + "name": "purple_concrete", + "translation_key": "block.minecraft.purple_concrete", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 544, + "name": "blue_concrete", + "translation_key": "block.minecraft.blue_concrete", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 545, + "name": "brown_concrete", + "translation_key": "block.minecraft.brown_concrete", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 546, + "name": "green_concrete", + "translation_key": "block.minecraft.green_concrete", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 547, + "name": "red_concrete", + "translation_key": "block.minecraft.red_concrete", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 548, + "name": "black_concrete", + "translation_key": "block.minecraft.black_concrete", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 549, + "name": "white_concrete_powder", + "translation_key": "block.minecraft.white_concrete_powder", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 550, + "name": "orange_concrete_powder", + "translation_key": "block.minecraft.orange_concrete_powder", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 551, + "name": "magenta_concrete_powder", + "translation_key": "block.minecraft.magenta_concrete_powder", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 552, + "name": "light_blue_concrete_powder", + "translation_key": "block.minecraft.light_blue_concrete_powder", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 553, + "name": "yellow_concrete_powder", + "translation_key": "block.minecraft.yellow_concrete_powder", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 554, + "name": "lime_concrete_powder", + "translation_key": "block.minecraft.lime_concrete_powder", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 555, + "name": "pink_concrete_powder", + "translation_key": "block.minecraft.pink_concrete_powder", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 556, + "name": "gray_concrete_powder", + "translation_key": "block.minecraft.gray_concrete_powder", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 557, + "name": "light_gray_concrete_powder", + "translation_key": "block.minecraft.light_gray_concrete_powder", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 558, + "name": "cyan_concrete_powder", + "translation_key": "block.minecraft.cyan_concrete_powder", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 559, + "name": "purple_concrete_powder", + "translation_key": "block.minecraft.purple_concrete_powder", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 560, + "name": "blue_concrete_powder", + "translation_key": "block.minecraft.blue_concrete_powder", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 561, + "name": "brown_concrete_powder", + "translation_key": "block.minecraft.brown_concrete_powder", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 562, + "name": "green_concrete_powder", + "translation_key": "block.minecraft.green_concrete_powder", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 563, + "name": "red_concrete_powder", + "translation_key": "block.minecraft.red_concrete_powder", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 564, + "name": "black_concrete_powder", + "translation_key": "block.minecraft.black_concrete_powder", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 565, + "name": "turtle_egg", + "translation_key": "block.minecraft.turtle_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 566, + "name": "sniffer_egg", + "translation_key": "block.minecraft.sniffer_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 567, + "name": "dead_tube_coral_block", + "translation_key": "block.minecraft.dead_tube_coral_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 568, + "name": "dead_brain_coral_block", + "translation_key": "block.minecraft.dead_brain_coral_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 569, + "name": "dead_bubble_coral_block", + "translation_key": "block.minecraft.dead_bubble_coral_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 570, + "name": "dead_fire_coral_block", + "translation_key": "block.minecraft.dead_fire_coral_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 571, + "name": "dead_horn_coral_block", + "translation_key": "block.minecraft.dead_horn_coral_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 572, + "name": "tube_coral_block", + "translation_key": "block.minecraft.tube_coral_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 573, + "name": "brain_coral_block", + "translation_key": "block.minecraft.brain_coral_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 574, + "name": "bubble_coral_block", + "translation_key": "block.minecraft.bubble_coral_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 575, + "name": "fire_coral_block", + "translation_key": "block.minecraft.fire_coral_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 576, + "name": "horn_coral_block", + "translation_key": "block.minecraft.horn_coral_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 577, + "name": "tube_coral", + "translation_key": "block.minecraft.tube_coral", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 578, + "name": "brain_coral", + "translation_key": "block.minecraft.brain_coral", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 579, + "name": "bubble_coral", + "translation_key": "block.minecraft.bubble_coral", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 580, + "name": "fire_coral", + "translation_key": "block.minecraft.fire_coral", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 581, + "name": "horn_coral", + "translation_key": "block.minecraft.horn_coral", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 582, + "name": "dead_brain_coral", + "translation_key": "block.minecraft.dead_brain_coral", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 583, + "name": "dead_bubble_coral", + "translation_key": "block.minecraft.dead_bubble_coral", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 584, + "name": "dead_fire_coral", + "translation_key": "block.minecraft.dead_fire_coral", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 585, + "name": "dead_horn_coral", + "translation_key": "block.minecraft.dead_horn_coral", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 586, + "name": "dead_tube_coral", + "translation_key": "block.minecraft.dead_tube_coral", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 587, + "name": "tube_coral_fan", + "translation_key": "block.minecraft.tube_coral_fan", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 588, + "name": "brain_coral_fan", + "translation_key": "block.minecraft.brain_coral_fan", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 589, + "name": "bubble_coral_fan", + "translation_key": "block.minecraft.bubble_coral_fan", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 590, + "name": "fire_coral_fan", + "translation_key": "block.minecraft.fire_coral_fan", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 591, + "name": "horn_coral_fan", + "translation_key": "block.minecraft.horn_coral_fan", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 592, + "name": "dead_tube_coral_fan", + "translation_key": "block.minecraft.dead_tube_coral_fan", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 593, + "name": "dead_brain_coral_fan", + "translation_key": "block.minecraft.dead_brain_coral_fan", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 594, + "name": "dead_bubble_coral_fan", + "translation_key": "block.minecraft.dead_bubble_coral_fan", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 595, + "name": "dead_fire_coral_fan", + "translation_key": "block.minecraft.dead_fire_coral_fan", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 596, + "name": "dead_horn_coral_fan", + "translation_key": "block.minecraft.dead_horn_coral_fan", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 597, + "name": "blue_ice", + "translation_key": "block.minecraft.blue_ice", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 598, + "name": "conduit", + "translation_key": "block.minecraft.conduit", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 599, + "name": "polished_granite_stairs", + "translation_key": "block.minecraft.polished_granite_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 600, + "name": "smooth_red_sandstone_stairs", + "translation_key": "block.minecraft.smooth_red_sandstone_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 601, + "name": "mossy_stone_brick_stairs", + "translation_key": "block.minecraft.mossy_stone_brick_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 602, + "name": "polished_diorite_stairs", + "translation_key": "block.minecraft.polished_diorite_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 603, + "name": "mossy_cobblestone_stairs", + "translation_key": "block.minecraft.mossy_cobblestone_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 604, + "name": "end_stone_brick_stairs", + "translation_key": "block.minecraft.end_stone_brick_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 605, + "name": "stone_stairs", + "translation_key": "block.minecraft.stone_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 606, + "name": "smooth_sandstone_stairs", + "translation_key": "block.minecraft.smooth_sandstone_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 607, + "name": "smooth_quartz_stairs", + "translation_key": "block.minecraft.smooth_quartz_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 608, + "name": "granite_stairs", + "translation_key": "block.minecraft.granite_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 609, + "name": "andesite_stairs", + "translation_key": "block.minecraft.andesite_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 610, + "name": "red_nether_brick_stairs", + "translation_key": "block.minecraft.red_nether_brick_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 611, + "name": "polished_andesite_stairs", + "translation_key": "block.minecraft.polished_andesite_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 612, + "name": "diorite_stairs", + "translation_key": "block.minecraft.diorite_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 613, + "name": "cobbled_deepslate_stairs", + "translation_key": "block.minecraft.cobbled_deepslate_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 614, + "name": "polished_deepslate_stairs", + "translation_key": "block.minecraft.polished_deepslate_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 615, + "name": "deepslate_brick_stairs", + "translation_key": "block.minecraft.deepslate_brick_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 616, + "name": "deepslate_tile_stairs", + "translation_key": "block.minecraft.deepslate_tile_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 617, + "name": "polished_granite_slab", + "translation_key": "block.minecraft.polished_granite_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 618, + "name": "smooth_red_sandstone_slab", + "translation_key": "block.minecraft.smooth_red_sandstone_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 619, + "name": "mossy_stone_brick_slab", + "translation_key": "block.minecraft.mossy_stone_brick_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 620, + "name": "polished_diorite_slab", + "translation_key": "block.minecraft.polished_diorite_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 621, + "name": "mossy_cobblestone_slab", + "translation_key": "block.minecraft.mossy_cobblestone_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 622, + "name": "end_stone_brick_slab", + "translation_key": "block.minecraft.end_stone_brick_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 623, + "name": "smooth_sandstone_slab", + "translation_key": "block.minecraft.smooth_sandstone_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 624, + "name": "smooth_quartz_slab", + "translation_key": "block.minecraft.smooth_quartz_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 625, + "name": "granite_slab", + "translation_key": "block.minecraft.granite_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 626, + "name": "andesite_slab", + "translation_key": "block.minecraft.andesite_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 627, + "name": "red_nether_brick_slab", + "translation_key": "block.minecraft.red_nether_brick_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 628, + "name": "polished_andesite_slab", + "translation_key": "block.minecraft.polished_andesite_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 629, + "name": "diorite_slab", + "translation_key": "block.minecraft.diorite_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 630, + "name": "cobbled_deepslate_slab", + "translation_key": "block.minecraft.cobbled_deepslate_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 631, + "name": "polished_deepslate_slab", + "translation_key": "block.minecraft.polished_deepslate_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 632, + "name": "deepslate_brick_slab", + "translation_key": "block.minecraft.deepslate_brick_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 633, + "name": "deepslate_tile_slab", + "translation_key": "block.minecraft.deepslate_tile_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 634, + "name": "scaffolding", + "translation_key": "block.minecraft.scaffolding", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 635, + "name": "redstone", + "translation_key": "item.minecraft.redstone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 636, + "name": "redstone_torch", + "translation_key": "block.minecraft.redstone_torch", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 637, + "name": "redstone_block", + "translation_key": "block.minecraft.redstone_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 638, + "name": "repeater", + "translation_key": "block.minecraft.repeater", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 639, + "name": "comparator", + "translation_key": "block.minecraft.comparator", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 640, + "name": "piston", + "translation_key": "block.minecraft.piston", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 641, + "name": "sticky_piston", + "translation_key": "block.minecraft.sticky_piston", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 642, + "name": "slime_block", + "translation_key": "block.minecraft.slime_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 643, + "name": "honey_block", + "translation_key": "block.minecraft.honey_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 644, + "name": "observer", + "translation_key": "block.minecraft.observer", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 645, + "name": "hopper", + "translation_key": "block.minecraft.hopper", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 646, + "name": "dispenser", + "translation_key": "block.minecraft.dispenser", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 647, + "name": "dropper", + "translation_key": "block.minecraft.dropper", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 648, + "name": "lectern", + "translation_key": "block.minecraft.lectern", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 649, + "name": "target", + "translation_key": "block.minecraft.target", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 650, + "name": "lever", + "translation_key": "block.minecraft.lever", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 651, + "name": "lightning_rod", + "translation_key": "block.minecraft.lightning_rod", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 652, + "name": "daylight_detector", + "translation_key": "block.minecraft.daylight_detector", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 653, + "name": "sculk_sensor", + "translation_key": "block.minecraft.sculk_sensor", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 654, + "name": "calibrated_sculk_sensor", + "translation_key": "block.minecraft.calibrated_sculk_sensor", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 655, + "name": "tripwire_hook", + "translation_key": "block.minecraft.tripwire_hook", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 656, + "name": "trapped_chest", + "translation_key": "block.minecraft.trapped_chest", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 657, + "name": "tnt", + "translation_key": "block.minecraft.tnt", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 658, + "name": "redstone_lamp", + "translation_key": "block.minecraft.redstone_lamp", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 659, + "name": "note_block", + "translation_key": "block.minecraft.note_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 660, + "name": "stone_button", + "translation_key": "block.minecraft.stone_button", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 661, + "name": "polished_blackstone_button", + "translation_key": "block.minecraft.polished_blackstone_button", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 662, + "name": "oak_button", + "translation_key": "block.minecraft.oak_button", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 663, + "name": "spruce_button", + "translation_key": "block.minecraft.spruce_button", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 664, + "name": "birch_button", + "translation_key": "block.minecraft.birch_button", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 665, + "name": "jungle_button", + "translation_key": "block.minecraft.jungle_button", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 666, + "name": "acacia_button", + "translation_key": "block.minecraft.acacia_button", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 667, + "name": "cherry_button", + "translation_key": "block.minecraft.cherry_button", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 668, + "name": "dark_oak_button", + "translation_key": "block.minecraft.dark_oak_button", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 669, + "name": "mangrove_button", + "translation_key": "block.minecraft.mangrove_button", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 670, + "name": "bamboo_button", + "translation_key": "block.minecraft.bamboo_button", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 671, + "name": "crimson_button", + "translation_key": "block.minecraft.crimson_button", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 672, + "name": "warped_button", + "translation_key": "block.minecraft.warped_button", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 673, + "name": "stone_pressure_plate", + "translation_key": "block.minecraft.stone_pressure_plate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 674, + "name": "polished_blackstone_pressure_plate", + "translation_key": "block.minecraft.polished_blackstone_pressure_plate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 675, + "name": "light_weighted_pressure_plate", + "translation_key": "block.minecraft.light_weighted_pressure_plate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 676, + "name": "heavy_weighted_pressure_plate", + "translation_key": "block.minecraft.heavy_weighted_pressure_plate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 677, + "name": "oak_pressure_plate", + "translation_key": "block.minecraft.oak_pressure_plate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 678, + "name": "spruce_pressure_plate", + "translation_key": "block.minecraft.spruce_pressure_plate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 679, + "name": "birch_pressure_plate", + "translation_key": "block.minecraft.birch_pressure_plate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 680, + "name": "jungle_pressure_plate", + "translation_key": "block.minecraft.jungle_pressure_plate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 681, + "name": "acacia_pressure_plate", + "translation_key": "block.minecraft.acacia_pressure_plate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 682, + "name": "cherry_pressure_plate", + "translation_key": "block.minecraft.cherry_pressure_plate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 683, + "name": "dark_oak_pressure_plate", + "translation_key": "block.minecraft.dark_oak_pressure_plate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 684, + "name": "mangrove_pressure_plate", + "translation_key": "block.minecraft.mangrove_pressure_plate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 685, + "name": "bamboo_pressure_plate", + "translation_key": "block.minecraft.bamboo_pressure_plate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 686, + "name": "crimson_pressure_plate", + "translation_key": "block.minecraft.crimson_pressure_plate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 687, + "name": "warped_pressure_plate", + "translation_key": "block.minecraft.warped_pressure_plate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 688, + "name": "iron_door", + "translation_key": "block.minecraft.iron_door", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 689, + "name": "oak_door", + "translation_key": "block.minecraft.oak_door", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 690, + "name": "spruce_door", + "translation_key": "block.minecraft.spruce_door", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 691, + "name": "birch_door", + "translation_key": "block.minecraft.birch_door", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 692, + "name": "jungle_door", + "translation_key": "block.minecraft.jungle_door", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 693, + "name": "acacia_door", + "translation_key": "block.minecraft.acacia_door", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 694, + "name": "cherry_door", + "translation_key": "block.minecraft.cherry_door", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 695, + "name": "dark_oak_door", + "translation_key": "block.minecraft.dark_oak_door", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 696, + "name": "mangrove_door", + "translation_key": "block.minecraft.mangrove_door", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 697, + "name": "bamboo_door", + "translation_key": "block.minecraft.bamboo_door", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 698, + "name": "crimson_door", + "translation_key": "block.minecraft.crimson_door", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 699, + "name": "warped_door", + "translation_key": "block.minecraft.warped_door", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 700, + "name": "iron_trapdoor", + "translation_key": "block.minecraft.iron_trapdoor", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 701, + "name": "oak_trapdoor", + "translation_key": "block.minecraft.oak_trapdoor", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 702, + "name": "spruce_trapdoor", + "translation_key": "block.minecraft.spruce_trapdoor", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 703, + "name": "birch_trapdoor", + "translation_key": "block.minecraft.birch_trapdoor", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 704, + "name": "jungle_trapdoor", + "translation_key": "block.minecraft.jungle_trapdoor", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 705, + "name": "acacia_trapdoor", + "translation_key": "block.minecraft.acacia_trapdoor", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 706, + "name": "cherry_trapdoor", + "translation_key": "block.minecraft.cherry_trapdoor", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 707, + "name": "dark_oak_trapdoor", + "translation_key": "block.minecraft.dark_oak_trapdoor", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 708, + "name": "mangrove_trapdoor", + "translation_key": "block.minecraft.mangrove_trapdoor", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 709, + "name": "bamboo_trapdoor", + "translation_key": "block.minecraft.bamboo_trapdoor", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 710, + "name": "crimson_trapdoor", + "translation_key": "block.minecraft.crimson_trapdoor", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 711, + "name": "warped_trapdoor", + "translation_key": "block.minecraft.warped_trapdoor", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 712, + "name": "oak_fence_gate", + "translation_key": "block.minecraft.oak_fence_gate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 713, + "name": "spruce_fence_gate", + "translation_key": "block.minecraft.spruce_fence_gate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 714, + "name": "birch_fence_gate", + "translation_key": "block.minecraft.birch_fence_gate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 715, + "name": "jungle_fence_gate", + "translation_key": "block.minecraft.jungle_fence_gate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 716, + "name": "acacia_fence_gate", + "translation_key": "block.minecraft.acacia_fence_gate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 717, + "name": "cherry_fence_gate", + "translation_key": "block.minecraft.cherry_fence_gate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 718, + "name": "dark_oak_fence_gate", + "translation_key": "block.minecraft.dark_oak_fence_gate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 719, + "name": "mangrove_fence_gate", + "translation_key": "block.minecraft.mangrove_fence_gate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 720, + "name": "bamboo_fence_gate", + "translation_key": "block.minecraft.bamboo_fence_gate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 721, + "name": "crimson_fence_gate", + "translation_key": "block.minecraft.crimson_fence_gate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 722, + "name": "warped_fence_gate", + "translation_key": "block.minecraft.warped_fence_gate", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 723, + "name": "powered_rail", + "translation_key": "block.minecraft.powered_rail", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 724, + "name": "detector_rail", + "translation_key": "block.minecraft.detector_rail", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 725, + "name": "rail", + "translation_key": "block.minecraft.rail", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 726, + "name": "activator_rail", + "translation_key": "block.minecraft.activator_rail", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 727, + "name": "saddle", + "translation_key": "item.minecraft.saddle", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 728, + "name": "minecart", + "translation_key": "item.minecraft.minecart", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 729, + "name": "chest_minecart", + "translation_key": "item.minecraft.chest_minecart", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 730, + "name": "furnace_minecart", + "translation_key": "item.minecraft.furnace_minecart", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 731, + "name": "tnt_minecart", + "translation_key": "item.minecraft.tnt_minecart", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 732, + "name": "hopper_minecart", + "translation_key": "item.minecraft.hopper_minecart", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 733, + "name": "carrot_on_a_stick", + "translation_key": "item.minecraft.carrot_on_a_stick", + "max_stack": 1, + "max_durability": 25, + "enchantability": 0, + "fireproof": false + }, + { + "id": 734, + "name": "warped_fungus_on_a_stick", + "translation_key": "item.minecraft.warped_fungus_on_a_stick", + "max_stack": 1, + "max_durability": 100, + "enchantability": 0, + "fireproof": false + }, + { + "id": 735, + "name": "elytra", + "translation_key": "item.minecraft.elytra", + "max_stack": 1, + "max_durability": 432, + "enchantability": 0, + "fireproof": false + }, + { + "id": 736, + "name": "oak_boat", + "translation_key": "item.minecraft.oak_boat", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 737, + "name": "oak_chest_boat", + "translation_key": "item.minecraft.oak_chest_boat", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 738, + "name": "spruce_boat", + "translation_key": "item.minecraft.spruce_boat", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 739, + "name": "spruce_chest_boat", + "translation_key": "item.minecraft.spruce_chest_boat", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 740, + "name": "birch_boat", + "translation_key": "item.minecraft.birch_boat", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 741, + "name": "birch_chest_boat", + "translation_key": "item.minecraft.birch_chest_boat", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 742, + "name": "jungle_boat", + "translation_key": "item.minecraft.jungle_boat", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 743, + "name": "jungle_chest_boat", + "translation_key": "item.minecraft.jungle_chest_boat", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 744, + "name": "acacia_boat", + "translation_key": "item.minecraft.acacia_boat", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 745, + "name": "acacia_chest_boat", + "translation_key": "item.minecraft.acacia_chest_boat", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 746, + "name": "cherry_boat", + "translation_key": "item.minecraft.cherry_boat", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 747, + "name": "cherry_chest_boat", + "translation_key": "item.minecraft.cherry_chest_boat", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 748, + "name": "dark_oak_boat", + "translation_key": "item.minecraft.dark_oak_boat", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 749, + "name": "dark_oak_chest_boat", + "translation_key": "item.minecraft.dark_oak_chest_boat", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 750, + "name": "mangrove_boat", + "translation_key": "item.minecraft.mangrove_boat", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 751, + "name": "mangrove_chest_boat", + "translation_key": "item.minecraft.mangrove_chest_boat", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 752, + "name": "bamboo_raft", + "translation_key": "item.minecraft.bamboo_raft", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 753, + "name": "bamboo_chest_raft", + "translation_key": "item.minecraft.bamboo_chest_raft", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 754, + "name": "structure_block", + "translation_key": "block.minecraft.structure_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 755, + "name": "jigsaw", + "translation_key": "block.minecraft.jigsaw", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 756, + "name": "turtle_helmet", + "translation_key": "item.minecraft.turtle_helmet", + "max_stack": 1, + "max_durability": 275, + "enchantability": 9, + "fireproof": false, + "equippable": "helmet" + }, + { + "id": 757, + "name": "scute", + "translation_key": "item.minecraft.scute", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 758, + "name": "flint_and_steel", + "translation_key": "item.minecraft.flint_and_steel", + "max_stack": 1, + "max_durability": 64, + "enchantability": 0, + "fireproof": false + }, + { + "id": 759, + "name": "apple", + "translation_key": "item.minecraft.apple", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 4, + "saturation": 0.3, + "always_edible": false, + "meat": false, + "snack": false, + "effects": [] + } + }, + { + "id": 760, + "name": "bow", + "translation_key": "item.minecraft.bow", + "max_stack": 1, + "max_durability": 384, + "enchantability": 1, + "fireproof": false + }, + { + "id": 761, + "name": "arrow", + "translation_key": "item.minecraft.arrow", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 762, + "name": "coal", + "translation_key": "item.minecraft.coal", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 763, + "name": "charcoal", + "translation_key": "item.minecraft.charcoal", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 764, + "name": "diamond", + "translation_key": "item.minecraft.diamond", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 765, + "name": "emerald", + "translation_key": "item.minecraft.emerald", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 766, + "name": "lapis_lazuli", + "translation_key": "item.minecraft.lapis_lazuli", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 767, + "name": "quartz", + "translation_key": "item.minecraft.quartz", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 768, + "name": "amethyst_shard", + "translation_key": "item.minecraft.amethyst_shard", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 769, + "name": "raw_iron", + "translation_key": "item.minecraft.raw_iron", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 770, + "name": "iron_ingot", + "translation_key": "item.minecraft.iron_ingot", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 771, + "name": "raw_copper", + "translation_key": "item.minecraft.raw_copper", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 772, + "name": "copper_ingot", + "translation_key": "item.minecraft.copper_ingot", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 773, + "name": "raw_gold", + "translation_key": "item.minecraft.raw_gold", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 774, + "name": "gold_ingot", + "translation_key": "item.minecraft.gold_ingot", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 775, + "name": "netherite_ingot", + "translation_key": "item.minecraft.netherite_ingot", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": true + }, + { + "id": 776, + "name": "netherite_scrap", + "translation_key": "item.minecraft.netherite_scrap", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": true + }, + { + "id": 777, + "name": "wooden_sword", + "translation_key": "item.minecraft.wooden_sword", + "max_stack": 1, + "max_durability": 59, + "enchantability": 15, + "fireproof": false + }, + { + "id": 778, + "name": "wooden_shovel", + "translation_key": "item.minecraft.wooden_shovel", + "max_stack": 1, + "max_durability": 59, + "enchantability": 15, + "fireproof": false + }, + { + "id": 779, + "name": "wooden_pickaxe", + "translation_key": "item.minecraft.wooden_pickaxe", + "max_stack": 1, + "max_durability": 59, + "enchantability": 15, + "fireproof": false + }, + { + "id": 780, + "name": "wooden_axe", + "translation_key": "item.minecraft.wooden_axe", + "max_stack": 1, + "max_durability": 59, + "enchantability": 15, + "fireproof": false + }, + { + "id": 781, + "name": "wooden_hoe", + "translation_key": "item.minecraft.wooden_hoe", + "max_stack": 1, + "max_durability": 59, + "enchantability": 15, + "fireproof": false + }, + { + "id": 782, + "name": "stone_sword", + "translation_key": "item.minecraft.stone_sword", + "max_stack": 1, + "max_durability": 131, + "enchantability": 5, + "fireproof": false + }, + { + "id": 783, + "name": "stone_shovel", + "translation_key": "item.minecraft.stone_shovel", + "max_stack": 1, + "max_durability": 131, + "enchantability": 5, + "fireproof": false + }, + { + "id": 784, + "name": "stone_pickaxe", + "translation_key": "item.minecraft.stone_pickaxe", + "max_stack": 1, + "max_durability": 131, + "enchantability": 5, + "fireproof": false + }, + { + "id": 785, + "name": "stone_axe", + "translation_key": "item.minecraft.stone_axe", + "max_stack": 1, + "max_durability": 131, + "enchantability": 5, + "fireproof": false + }, + { + "id": 786, + "name": "stone_hoe", + "translation_key": "item.minecraft.stone_hoe", + "max_stack": 1, + "max_durability": 131, + "enchantability": 5, + "fireproof": false + }, + { + "id": 787, + "name": "golden_sword", + "translation_key": "item.minecraft.golden_sword", + "max_stack": 1, + "max_durability": 32, + "enchantability": 22, + "fireproof": false + }, + { + "id": 788, + "name": "golden_shovel", + "translation_key": "item.minecraft.golden_shovel", + "max_stack": 1, + "max_durability": 32, + "enchantability": 22, + "fireproof": false + }, + { + "id": 789, + "name": "golden_pickaxe", + "translation_key": "item.minecraft.golden_pickaxe", + "max_stack": 1, + "max_durability": 32, + "enchantability": 22, + "fireproof": false + }, + { + "id": 790, + "name": "golden_axe", + "translation_key": "item.minecraft.golden_axe", + "max_stack": 1, + "max_durability": 32, + "enchantability": 22, + "fireproof": false + }, + { + "id": 791, + "name": "golden_hoe", + "translation_key": "item.minecraft.golden_hoe", + "max_stack": 1, + "max_durability": 32, + "enchantability": 22, + "fireproof": false + }, + { + "id": 792, + "name": "iron_sword", + "translation_key": "item.minecraft.iron_sword", + "max_stack": 1, + "max_durability": 250, + "enchantability": 14, + "fireproof": false + }, + { + "id": 793, + "name": "iron_shovel", + "translation_key": "item.minecraft.iron_shovel", + "max_stack": 1, + "max_durability": 250, + "enchantability": 14, + "fireproof": false + }, + { + "id": 794, + "name": "iron_pickaxe", + "translation_key": "item.minecraft.iron_pickaxe", + "max_stack": 1, + "max_durability": 250, + "enchantability": 14, + "fireproof": false + }, + { + "id": 795, + "name": "iron_axe", + "translation_key": "item.minecraft.iron_axe", + "max_stack": 1, + "max_durability": 250, + "enchantability": 14, + "fireproof": false + }, + { + "id": 796, + "name": "iron_hoe", + "translation_key": "item.minecraft.iron_hoe", + "max_stack": 1, + "max_durability": 250, + "enchantability": 14, + "fireproof": false + }, + { + "id": 797, + "name": "diamond_sword", + "translation_key": "item.minecraft.diamond_sword", + "max_stack": 1, + "max_durability": 1561, + "enchantability": 10, + "fireproof": false + }, + { + "id": 798, + "name": "diamond_shovel", + "translation_key": "item.minecraft.diamond_shovel", + "max_stack": 1, + "max_durability": 1561, + "enchantability": 10, + "fireproof": false + }, + { + "id": 799, + "name": "diamond_pickaxe", + "translation_key": "item.minecraft.diamond_pickaxe", + "max_stack": 1, + "max_durability": 1561, + "enchantability": 10, + "fireproof": false + }, + { + "id": 800, + "name": "diamond_axe", + "translation_key": "item.minecraft.diamond_axe", + "max_stack": 1, + "max_durability": 1561, + "enchantability": 10, + "fireproof": false + }, + { + "id": 801, + "name": "diamond_hoe", + "translation_key": "item.minecraft.diamond_hoe", + "max_stack": 1, + "max_durability": 1561, + "enchantability": 10, + "fireproof": false + }, + { + "id": 802, + "name": "netherite_sword", + "translation_key": "item.minecraft.netherite_sword", + "max_stack": 1, + "max_durability": 2031, + "enchantability": 15, + "fireproof": true + }, + { + "id": 803, + "name": "netherite_shovel", + "translation_key": "item.minecraft.netherite_shovel", + "max_stack": 1, + "max_durability": 2031, + "enchantability": 15, + "fireproof": true + }, + { + "id": 804, + "name": "netherite_pickaxe", + "translation_key": "item.minecraft.netherite_pickaxe", + "max_stack": 1, + "max_durability": 2031, + "enchantability": 15, + "fireproof": true + }, + { + "id": 805, + "name": "netherite_axe", + "translation_key": "item.minecraft.netherite_axe", + "max_stack": 1, + "max_durability": 2031, + "enchantability": 15, + "fireproof": true + }, + { + "id": 806, + "name": "netherite_hoe", + "translation_key": "item.minecraft.netherite_hoe", + "max_stack": 1, + "max_durability": 2031, + "enchantability": 15, + "fireproof": true + }, + { + "id": 807, + "name": "stick", + "translation_key": "item.minecraft.stick", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 808, + "name": "bowl", + "translation_key": "item.minecraft.bowl", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 809, + "name": "mushroom_stew", + "translation_key": "item.minecraft.mushroom_stew", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 6, + "saturation": 0.6, + "always_edible": false, + "meat": false, + "snack": false, + "effects": [] + } + }, + { + "id": 810, + "name": "string", + "translation_key": "item.minecraft.string", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 811, + "name": "feather", + "translation_key": "item.minecraft.feather", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 812, + "name": "gunpowder", + "translation_key": "item.minecraft.gunpowder", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 813, + "name": "wheat_seeds", + "translation_key": "item.minecraft.wheat_seeds", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 814, + "name": "wheat", + "translation_key": "item.minecraft.wheat", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 815, + "name": "bread", + "translation_key": "item.minecraft.bread", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 5, + "saturation": 0.6, + "always_edible": false, + "meat": false, + "snack": false, + "effects": [] + } + }, + { + "id": 816, + "name": "leather_helmet", + "translation_key": "item.minecraft.leather_helmet", + "max_stack": 1, + "max_durability": 55, + "enchantability": 15, + "fireproof": false, + "equippable": "helmet" + }, + { + "id": 817, + "name": "leather_chestplate", + "translation_key": "item.minecraft.leather_chestplate", + "max_stack": 1, + "max_durability": 80, + "enchantability": 15, + "fireproof": false, + "equippable": "chestplate" + }, + { + "id": 818, + "name": "leather_leggings", + "translation_key": "item.minecraft.leather_leggings", + "max_stack": 1, + "max_durability": 75, + "enchantability": 15, + "fireproof": false, + "equippable": "leggings" + }, + { + "id": 819, + "name": "leather_boots", + "translation_key": "item.minecraft.leather_boots", + "max_stack": 1, + "max_durability": 65, + "enchantability": 15, + "fireproof": false, + "equippable": "boots" + }, + { + "id": 820, + "name": "chainmail_helmet", + "translation_key": "item.minecraft.chainmail_helmet", + "max_stack": 1, + "max_durability": 165, + "enchantability": 12, + "fireproof": false, + "equippable": "helmet" + }, + { + "id": 821, + "name": "chainmail_chestplate", + "translation_key": "item.minecraft.chainmail_chestplate", + "max_stack": 1, + "max_durability": 240, + "enchantability": 12, + "fireproof": false, + "equippable": "chestplate" + }, + { + "id": 822, + "name": "chainmail_leggings", + "translation_key": "item.minecraft.chainmail_leggings", + "max_stack": 1, + "max_durability": 225, + "enchantability": 12, + "fireproof": false, + "equippable": "leggings" + }, + { + "id": 823, + "name": "chainmail_boots", + "translation_key": "item.minecraft.chainmail_boots", + "max_stack": 1, + "max_durability": 195, + "enchantability": 12, + "fireproof": false, + "equippable": "boots" + }, + { + "id": 824, + "name": "iron_helmet", + "translation_key": "item.minecraft.iron_helmet", + "max_stack": 1, + "max_durability": 165, + "enchantability": 9, + "fireproof": false, + "equippable": "helmet" + }, + { + "id": 825, + "name": "iron_chestplate", + "translation_key": "item.minecraft.iron_chestplate", + "max_stack": 1, + "max_durability": 240, + "enchantability": 9, + "fireproof": false, + "equippable": "chestplate" + }, + { + "id": 826, + "name": "iron_leggings", + "translation_key": "item.minecraft.iron_leggings", + "max_stack": 1, + "max_durability": 225, + "enchantability": 9, + "fireproof": false, + "equippable": "leggings" + }, + { + "id": 827, + "name": "iron_boots", + "translation_key": "item.minecraft.iron_boots", + "max_stack": 1, + "max_durability": 195, + "enchantability": 9, + "fireproof": false, + "equippable": "boots" + }, + { + "id": 828, + "name": "diamond_helmet", + "translation_key": "item.minecraft.diamond_helmet", + "max_stack": 1, + "max_durability": 363, + "enchantability": 10, + "fireproof": false, + "equippable": "helmet" + }, + { + "id": 829, + "name": "diamond_chestplate", + "translation_key": "item.minecraft.diamond_chestplate", + "max_stack": 1, + "max_durability": 528, + "enchantability": 10, + "fireproof": false, + "equippable": "chestplate" + }, + { + "id": 830, + "name": "diamond_leggings", + "translation_key": "item.minecraft.diamond_leggings", + "max_stack": 1, + "max_durability": 495, + "enchantability": 10, + "fireproof": false, + "equippable": "leggings" + }, + { + "id": 831, + "name": "diamond_boots", + "translation_key": "item.minecraft.diamond_boots", + "max_stack": 1, + "max_durability": 429, + "enchantability": 10, + "fireproof": false, + "equippable": "boots" + }, + { + "id": 832, + "name": "golden_helmet", + "translation_key": "item.minecraft.golden_helmet", + "max_stack": 1, + "max_durability": 77, + "enchantability": 25, + "fireproof": false, + "equippable": "helmet" + }, + { + "id": 833, + "name": "golden_chestplate", + "translation_key": "item.minecraft.golden_chestplate", + "max_stack": 1, + "max_durability": 112, + "enchantability": 25, + "fireproof": false, + "equippable": "chestplate" + }, + { + "id": 834, + "name": "golden_leggings", + "translation_key": "item.minecraft.golden_leggings", + "max_stack": 1, + "max_durability": 105, + "enchantability": 25, + "fireproof": false, + "equippable": "leggings" + }, + { + "id": 835, + "name": "golden_boots", + "translation_key": "item.minecraft.golden_boots", + "max_stack": 1, + "max_durability": 91, + "enchantability": 25, + "fireproof": false, + "equippable": "boots" + }, + { + "id": 836, + "name": "netherite_helmet", + "translation_key": "item.minecraft.netherite_helmet", + "max_stack": 1, + "max_durability": 407, + "enchantability": 15, + "fireproof": true, + "equippable": "helmet" + }, + { + "id": 837, + "name": "netherite_chestplate", + "translation_key": "item.minecraft.netherite_chestplate", + "max_stack": 1, + "max_durability": 592, + "enchantability": 15, + "fireproof": true, + "equippable": "chestplate" + }, + { + "id": 838, + "name": "netherite_leggings", + "translation_key": "item.minecraft.netherite_leggings", + "max_stack": 1, + "max_durability": 555, + "enchantability": 15, + "fireproof": true, + "equippable": "leggings" + }, + { + "id": 839, + "name": "netherite_boots", + "translation_key": "item.minecraft.netherite_boots", + "max_stack": 1, + "max_durability": 481, + "enchantability": 15, + "fireproof": true, + "equippable": "boots" + }, + { + "id": 840, + "name": "flint", + "translation_key": "item.minecraft.flint", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 841, + "name": "porkchop", + "translation_key": "item.minecraft.porkchop", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 3, + "saturation": 0.3, + "always_edible": false, + "meat": true, + "snack": false, + "effects": [] + } + }, + { + "id": 842, + "name": "cooked_porkchop", + "translation_key": "item.minecraft.cooked_porkchop", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 8, + "saturation": 0.8, + "always_edible": false, + "meat": true, + "snack": false, + "effects": [] + } + }, + { + "id": 843, + "name": "painting", + "translation_key": "item.minecraft.painting", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 844, + "name": "golden_apple", + "translation_key": "item.minecraft.golden_apple", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 4, + "saturation": 1.2, + "always_edible": true, + "meat": false, + "snack": false, + "effects": [ + { + "chance": 1.0, + "translation_key": "effect.minecraft.regeneration" + }, + { + "chance": 1.0, + "translation_key": "effect.minecraft.absorption" + } + ] + } + }, + { + "id": 845, + "name": "enchanted_golden_apple", + "translation_key": "item.minecraft.enchanted_golden_apple", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 4, + "saturation": 1.2, + "always_edible": true, + "meat": false, + "snack": false, + "effects": [ + { + "chance": 1.0, + "translation_key": "effect.minecraft.regeneration" + }, + { + "chance": 1.0, + "translation_key": "effect.minecraft.resistance" + }, + { + "chance": 1.0, + "translation_key": "effect.minecraft.fire_resistance" + }, + { + "chance": 1.0, + "translation_key": "effect.minecraft.absorption" + } + ] + } + }, + { + "id": 846, + "name": "oak_sign", + "translation_key": "block.minecraft.oak_sign", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 847, + "name": "spruce_sign", + "translation_key": "block.minecraft.spruce_sign", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 848, + "name": "birch_sign", + "translation_key": "block.minecraft.birch_sign", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 849, + "name": "jungle_sign", + "translation_key": "block.minecraft.jungle_sign", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 850, + "name": "acacia_sign", + "translation_key": "block.minecraft.acacia_sign", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 851, + "name": "cherry_sign", + "translation_key": "block.minecraft.cherry_sign", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 852, + "name": "dark_oak_sign", + "translation_key": "block.minecraft.dark_oak_sign", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 853, + "name": "mangrove_sign", + "translation_key": "block.minecraft.mangrove_sign", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 854, + "name": "bamboo_sign", + "translation_key": "block.minecraft.bamboo_sign", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 855, + "name": "crimson_sign", + "translation_key": "block.minecraft.crimson_sign", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 856, + "name": "warped_sign", + "translation_key": "block.minecraft.warped_sign", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 857, + "name": "oak_hanging_sign", + "translation_key": "block.minecraft.oak_hanging_sign", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 858, + "name": "spruce_hanging_sign", + "translation_key": "block.minecraft.spruce_hanging_sign", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 859, + "name": "birch_hanging_sign", + "translation_key": "block.minecraft.birch_hanging_sign", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 860, + "name": "jungle_hanging_sign", + "translation_key": "block.minecraft.jungle_hanging_sign", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 861, + "name": "acacia_hanging_sign", + "translation_key": "block.minecraft.acacia_hanging_sign", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 862, + "name": "cherry_hanging_sign", + "translation_key": "block.minecraft.cherry_hanging_sign", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 863, + "name": "dark_oak_hanging_sign", + "translation_key": "block.minecraft.dark_oak_hanging_sign", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 864, + "name": "mangrove_hanging_sign", + "translation_key": "block.minecraft.mangrove_hanging_sign", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 865, + "name": "bamboo_hanging_sign", + "translation_key": "block.minecraft.bamboo_hanging_sign", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 866, + "name": "crimson_hanging_sign", + "translation_key": "block.minecraft.crimson_hanging_sign", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 867, + "name": "warped_hanging_sign", + "translation_key": "block.minecraft.warped_hanging_sign", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 868, + "name": "bucket", + "translation_key": "item.minecraft.bucket", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 869, + "name": "water_bucket", + "translation_key": "item.minecraft.water_bucket", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 870, + "name": "lava_bucket", + "translation_key": "item.minecraft.lava_bucket", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 871, + "name": "powder_snow_bucket", + "translation_key": "item.minecraft.powder_snow_bucket", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 872, + "name": "snowball", + "translation_key": "item.minecraft.snowball", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 873, + "name": "leather", + "translation_key": "item.minecraft.leather", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 874, + "name": "milk_bucket", + "translation_key": "item.minecraft.milk_bucket", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 875, + "name": "pufferfish_bucket", + "translation_key": "item.minecraft.pufferfish_bucket", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 876, + "name": "salmon_bucket", + "translation_key": "item.minecraft.salmon_bucket", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 877, + "name": "cod_bucket", + "translation_key": "item.minecraft.cod_bucket", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 878, + "name": "tropical_fish_bucket", + "translation_key": "item.minecraft.tropical_fish_bucket", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 879, + "name": "axolotl_bucket", + "translation_key": "item.minecraft.axolotl_bucket", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 880, + "name": "tadpole_bucket", + "translation_key": "item.minecraft.tadpole_bucket", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 881, + "name": "brick", + "translation_key": "item.minecraft.brick", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 882, + "name": "clay_ball", + "translation_key": "item.minecraft.clay_ball", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 883, + "name": "dried_kelp_block", + "translation_key": "block.minecraft.dried_kelp_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 884, + "name": "paper", + "translation_key": "item.minecraft.paper", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 885, + "name": "book", + "translation_key": "item.minecraft.book", + "max_stack": 64, + "max_durability": 0, + "enchantability": 1, + "fireproof": false + }, + { + "id": 886, + "name": "slime_ball", + "translation_key": "item.minecraft.slime_ball", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 887, + "name": "egg", + "translation_key": "item.minecraft.egg", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 888, + "name": "compass", + "translation_key": "item.minecraft.compass", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 889, + "name": "recovery_compass", + "translation_key": "item.minecraft.recovery_compass", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 890, + "name": "bundle", + "translation_key": "item.minecraft.bundle", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 891, + "name": "fishing_rod", + "translation_key": "item.minecraft.fishing_rod", + "max_stack": 1, + "max_durability": 64, + "enchantability": 1, + "fireproof": false + }, + { + "id": 892, + "name": "clock", + "translation_key": "item.minecraft.clock", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 893, + "name": "spyglass", + "translation_key": "item.minecraft.spyglass", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 894, + "name": "glowstone_dust", + "translation_key": "item.minecraft.glowstone_dust", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 895, + "name": "cod", + "translation_key": "item.minecraft.cod", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 2, + "saturation": 0.1, + "always_edible": false, + "meat": false, + "snack": false, + "effects": [] + } + }, + { + "id": 896, + "name": "salmon", + "translation_key": "item.minecraft.salmon", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 2, + "saturation": 0.1, + "always_edible": false, + "meat": false, + "snack": false, + "effects": [] + } + }, + { + "id": 897, + "name": "tropical_fish", + "translation_key": "item.minecraft.tropical_fish", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 1, + "saturation": 0.1, + "always_edible": false, + "meat": false, + "snack": false, + "effects": [] + } + }, + { + "id": 898, + "name": "pufferfish", + "translation_key": "item.minecraft.pufferfish", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 1, + "saturation": 0.1, + "always_edible": false, + "meat": false, + "snack": false, + "effects": [ + { + "chance": 1.0, + "translation_key": "effect.minecraft.poison" + }, + { + "chance": 1.0, + "translation_key": "effect.minecraft.hunger" + }, + { + "chance": 1.0, + "translation_key": "effect.minecraft.nausea" + } + ] + } + }, + { + "id": 899, + "name": "cooked_cod", + "translation_key": "item.minecraft.cooked_cod", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 5, + "saturation": 0.6, + "always_edible": false, + "meat": false, + "snack": false, + "effects": [] + } + }, + { + "id": 900, + "name": "cooked_salmon", + "translation_key": "item.minecraft.cooked_salmon", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 6, + "saturation": 0.8, + "always_edible": false, + "meat": false, + "snack": false, + "effects": [] + } + }, + { + "id": 901, + "name": "ink_sac", + "translation_key": "item.minecraft.ink_sac", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 902, + "name": "glow_ink_sac", + "translation_key": "item.minecraft.glow_ink_sac", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 903, + "name": "cocoa_beans", + "translation_key": "item.minecraft.cocoa_beans", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 904, + "name": "white_dye", + "translation_key": "item.minecraft.white_dye", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 905, + "name": "orange_dye", + "translation_key": "item.minecraft.orange_dye", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 906, + "name": "magenta_dye", + "translation_key": "item.minecraft.magenta_dye", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 907, + "name": "light_blue_dye", + "translation_key": "item.minecraft.light_blue_dye", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 908, + "name": "yellow_dye", + "translation_key": "item.minecraft.yellow_dye", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 909, + "name": "lime_dye", + "translation_key": "item.minecraft.lime_dye", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 910, + "name": "pink_dye", + "translation_key": "item.minecraft.pink_dye", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 911, + "name": "gray_dye", + "translation_key": "item.minecraft.gray_dye", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 912, + "name": "light_gray_dye", + "translation_key": "item.minecraft.light_gray_dye", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 913, + "name": "cyan_dye", + "translation_key": "item.minecraft.cyan_dye", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 914, + "name": "purple_dye", + "translation_key": "item.minecraft.purple_dye", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 915, + "name": "blue_dye", + "translation_key": "item.minecraft.blue_dye", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 916, + "name": "brown_dye", + "translation_key": "item.minecraft.brown_dye", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 917, + "name": "green_dye", + "translation_key": "item.minecraft.green_dye", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 918, + "name": "red_dye", + "translation_key": "item.minecraft.red_dye", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 919, + "name": "black_dye", + "translation_key": "item.minecraft.black_dye", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 920, + "name": "bone_meal", + "translation_key": "item.minecraft.bone_meal", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 921, + "name": "bone", + "translation_key": "item.minecraft.bone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 922, + "name": "sugar", + "translation_key": "item.minecraft.sugar", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 923, + "name": "cake", + "translation_key": "block.minecraft.cake", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 924, + "name": "white_bed", + "translation_key": "block.minecraft.white_bed", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 925, + "name": "orange_bed", + "translation_key": "block.minecraft.orange_bed", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 926, + "name": "magenta_bed", + "translation_key": "block.minecraft.magenta_bed", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 927, + "name": "light_blue_bed", + "translation_key": "block.minecraft.light_blue_bed", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 928, + "name": "yellow_bed", + "translation_key": "block.minecraft.yellow_bed", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 929, + "name": "lime_bed", + "translation_key": "block.minecraft.lime_bed", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 930, + "name": "pink_bed", + "translation_key": "block.minecraft.pink_bed", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 931, + "name": "gray_bed", + "translation_key": "block.minecraft.gray_bed", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 932, + "name": "light_gray_bed", + "translation_key": "block.minecraft.light_gray_bed", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 933, + "name": "cyan_bed", + "translation_key": "block.minecraft.cyan_bed", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 934, + "name": "purple_bed", + "translation_key": "block.minecraft.purple_bed", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 935, + "name": "blue_bed", + "translation_key": "block.minecraft.blue_bed", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 936, + "name": "brown_bed", + "translation_key": "block.minecraft.brown_bed", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 937, + "name": "green_bed", + "translation_key": "block.minecraft.green_bed", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 938, + "name": "red_bed", + "translation_key": "block.minecraft.red_bed", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 939, + "name": "black_bed", + "translation_key": "block.minecraft.black_bed", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 940, + "name": "cookie", + "translation_key": "item.minecraft.cookie", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 2, + "saturation": 0.1, + "always_edible": false, + "meat": false, + "snack": false, + "effects": [] + } + }, + { + "id": 941, + "name": "filled_map", + "translation_key": "item.minecraft.filled_map", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 942, + "name": "shears", + "translation_key": "item.minecraft.shears", + "max_stack": 1, + "max_durability": 238, + "enchantability": 0, + "fireproof": false + }, + { + "id": 943, + "name": "melon_slice", + "translation_key": "item.minecraft.melon_slice", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 2, + "saturation": 0.3, + "always_edible": false, + "meat": false, + "snack": false, + "effects": [] + } + }, + { + "id": 944, + "name": "dried_kelp", + "translation_key": "item.minecraft.dried_kelp", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 1, + "saturation": 0.3, + "always_edible": false, + "meat": false, + "snack": true, + "effects": [] + } + }, + { + "id": 945, + "name": "pumpkin_seeds", + "translation_key": "item.minecraft.pumpkin_seeds", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 946, + "name": "melon_seeds", + "translation_key": "item.minecraft.melon_seeds", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 947, + "name": "beef", + "translation_key": "item.minecraft.beef", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 3, + "saturation": 0.3, + "always_edible": false, + "meat": true, + "snack": false, + "effects": [] + } + }, + { + "id": 948, + "name": "cooked_beef", + "translation_key": "item.minecraft.cooked_beef", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 8, + "saturation": 0.8, + "always_edible": false, + "meat": true, + "snack": false, + "effects": [] + } + }, + { + "id": 949, + "name": "chicken", + "translation_key": "item.minecraft.chicken", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 2, + "saturation": 0.3, + "always_edible": false, + "meat": true, + "snack": false, + "effects": [ + { + "chance": 0.3, + "translation_key": "effect.minecraft.hunger" + } + ] + } + }, + { + "id": 950, + "name": "cooked_chicken", + "translation_key": "item.minecraft.cooked_chicken", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 6, + "saturation": 0.6, + "always_edible": false, + "meat": true, + "snack": false, + "effects": [] + } + }, + { + "id": 951, + "name": "rotten_flesh", + "translation_key": "item.minecraft.rotten_flesh", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 4, + "saturation": 0.1, + "always_edible": false, + "meat": true, + "snack": false, + "effects": [ + { + "chance": 0.8, + "translation_key": "effect.minecraft.hunger" + } + ] + } + }, + { + "id": 952, + "name": "ender_pearl", + "translation_key": "item.minecraft.ender_pearl", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 953, + "name": "blaze_rod", + "translation_key": "item.minecraft.blaze_rod", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 954, + "name": "ghast_tear", + "translation_key": "item.minecraft.ghast_tear", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 955, + "name": "gold_nugget", + "translation_key": "item.minecraft.gold_nugget", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 956, + "name": "nether_wart", + "translation_key": "item.minecraft.nether_wart", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 957, + "name": "potion", + "translation_key": "item.minecraft.potion", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 958, + "name": "glass_bottle", + "translation_key": "item.minecraft.glass_bottle", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 959, + "name": "spider_eye", + "translation_key": "item.minecraft.spider_eye", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 2, + "saturation": 0.8, + "always_edible": false, + "meat": false, + "snack": false, + "effects": [ + { + "chance": 1.0, + "translation_key": "effect.minecraft.poison" + } + ] + } + }, + { + "id": 960, + "name": "fermented_spider_eye", + "translation_key": "item.minecraft.fermented_spider_eye", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 961, + "name": "blaze_powder", + "translation_key": "item.minecraft.blaze_powder", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 962, + "name": "magma_cream", + "translation_key": "item.minecraft.magma_cream", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 963, + "name": "brewing_stand", + "translation_key": "block.minecraft.brewing_stand", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 964, + "name": "cauldron", + "translation_key": "block.minecraft.cauldron", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 965, + "name": "ender_eye", + "translation_key": "item.minecraft.ender_eye", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 966, + "name": "glistering_melon_slice", + "translation_key": "item.minecraft.glistering_melon_slice", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 967, + "name": "allay_spawn_egg", + "translation_key": "item.minecraft.allay_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 968, + "name": "axolotl_spawn_egg", + "translation_key": "item.minecraft.axolotl_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 969, + "name": "bat_spawn_egg", + "translation_key": "item.minecraft.bat_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 970, + "name": "bee_spawn_egg", + "translation_key": "item.minecraft.bee_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 971, + "name": "blaze_spawn_egg", + "translation_key": "item.minecraft.blaze_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 972, + "name": "cat_spawn_egg", + "translation_key": "item.minecraft.cat_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 973, + "name": "camel_spawn_egg", + "translation_key": "item.minecraft.camel_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 974, + "name": "cave_spider_spawn_egg", + "translation_key": "item.minecraft.cave_spider_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 975, + "name": "chicken_spawn_egg", + "translation_key": "item.minecraft.chicken_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 976, + "name": "cod_spawn_egg", + "translation_key": "item.minecraft.cod_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 977, + "name": "cow_spawn_egg", + "translation_key": "item.minecraft.cow_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 978, + "name": "creeper_spawn_egg", + "translation_key": "item.minecraft.creeper_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 979, + "name": "dolphin_spawn_egg", + "translation_key": "item.minecraft.dolphin_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 980, + "name": "donkey_spawn_egg", + "translation_key": "item.minecraft.donkey_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 981, + "name": "drowned_spawn_egg", + "translation_key": "item.minecraft.drowned_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 982, + "name": "elder_guardian_spawn_egg", + "translation_key": "item.minecraft.elder_guardian_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 983, + "name": "ender_dragon_spawn_egg", + "translation_key": "item.minecraft.ender_dragon_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 984, + "name": "enderman_spawn_egg", + "translation_key": "item.minecraft.enderman_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 985, + "name": "endermite_spawn_egg", + "translation_key": "item.minecraft.endermite_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 986, + "name": "evoker_spawn_egg", + "translation_key": "item.minecraft.evoker_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 987, + "name": "fox_spawn_egg", + "translation_key": "item.minecraft.fox_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 988, + "name": "frog_spawn_egg", + "translation_key": "item.minecraft.frog_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 989, + "name": "ghast_spawn_egg", + "translation_key": "item.minecraft.ghast_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 990, + "name": "glow_squid_spawn_egg", + "translation_key": "item.minecraft.glow_squid_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 991, + "name": "goat_spawn_egg", + "translation_key": "item.minecraft.goat_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 992, + "name": "guardian_spawn_egg", + "translation_key": "item.minecraft.guardian_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 993, + "name": "hoglin_spawn_egg", + "translation_key": "item.minecraft.hoglin_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 994, + "name": "horse_spawn_egg", + "translation_key": "item.minecraft.horse_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 995, + "name": "husk_spawn_egg", + "translation_key": "item.minecraft.husk_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 996, + "name": "iron_golem_spawn_egg", + "translation_key": "item.minecraft.iron_golem_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 997, + "name": "llama_spawn_egg", + "translation_key": "item.minecraft.llama_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 998, + "name": "magma_cube_spawn_egg", + "translation_key": "item.minecraft.magma_cube_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 999, + "name": "mooshroom_spawn_egg", + "translation_key": "item.minecraft.mooshroom_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1000, + "name": "mule_spawn_egg", + "translation_key": "item.minecraft.mule_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1001, + "name": "ocelot_spawn_egg", + "translation_key": "item.minecraft.ocelot_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1002, + "name": "panda_spawn_egg", + "translation_key": "item.minecraft.panda_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1003, + "name": "parrot_spawn_egg", + "translation_key": "item.minecraft.parrot_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1004, + "name": "phantom_spawn_egg", + "translation_key": "item.minecraft.phantom_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1005, + "name": "pig_spawn_egg", + "translation_key": "item.minecraft.pig_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1006, + "name": "piglin_spawn_egg", + "translation_key": "item.minecraft.piglin_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1007, + "name": "piglin_brute_spawn_egg", + "translation_key": "item.minecraft.piglin_brute_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1008, + "name": "pillager_spawn_egg", + "translation_key": "item.minecraft.pillager_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1009, + "name": "polar_bear_spawn_egg", + "translation_key": "item.minecraft.polar_bear_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1010, + "name": "pufferfish_spawn_egg", + "translation_key": "item.minecraft.pufferfish_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1011, + "name": "rabbit_spawn_egg", + "translation_key": "item.minecraft.rabbit_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1012, + "name": "ravager_spawn_egg", + "translation_key": "item.minecraft.ravager_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1013, + "name": "salmon_spawn_egg", + "translation_key": "item.minecraft.salmon_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1014, + "name": "sheep_spawn_egg", + "translation_key": "item.minecraft.sheep_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1015, + "name": "shulker_spawn_egg", + "translation_key": "item.minecraft.shulker_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1016, + "name": "silverfish_spawn_egg", + "translation_key": "item.minecraft.silverfish_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1017, + "name": "skeleton_spawn_egg", + "translation_key": "item.minecraft.skeleton_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1018, + "name": "skeleton_horse_spawn_egg", + "translation_key": "item.minecraft.skeleton_horse_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1019, + "name": "slime_spawn_egg", + "translation_key": "item.minecraft.slime_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1020, + "name": "sniffer_spawn_egg", + "translation_key": "item.minecraft.sniffer_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1021, + "name": "snow_golem_spawn_egg", + "translation_key": "item.minecraft.snow_golem_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1022, + "name": "spider_spawn_egg", + "translation_key": "item.minecraft.spider_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1023, + "name": "squid_spawn_egg", + "translation_key": "item.minecraft.squid_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1024, + "name": "stray_spawn_egg", + "translation_key": "item.minecraft.stray_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1025, + "name": "strider_spawn_egg", + "translation_key": "item.minecraft.strider_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1026, + "name": "tadpole_spawn_egg", + "translation_key": "item.minecraft.tadpole_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1027, + "name": "trader_llama_spawn_egg", + "translation_key": "item.minecraft.trader_llama_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1028, + "name": "tropical_fish_spawn_egg", + "translation_key": "item.minecraft.tropical_fish_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1029, + "name": "turtle_spawn_egg", + "translation_key": "item.minecraft.turtle_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1030, + "name": "vex_spawn_egg", + "translation_key": "item.minecraft.vex_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1031, + "name": "villager_spawn_egg", + "translation_key": "item.minecraft.villager_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1032, + "name": "vindicator_spawn_egg", + "translation_key": "item.minecraft.vindicator_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1033, + "name": "wandering_trader_spawn_egg", + "translation_key": "item.minecraft.wandering_trader_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1034, + "name": "warden_spawn_egg", + "translation_key": "item.minecraft.warden_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1035, + "name": "witch_spawn_egg", + "translation_key": "item.minecraft.witch_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1036, + "name": "wither_spawn_egg", + "translation_key": "item.minecraft.wither_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1037, + "name": "wither_skeleton_spawn_egg", + "translation_key": "item.minecraft.wither_skeleton_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1038, + "name": "wolf_spawn_egg", + "translation_key": "item.minecraft.wolf_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1039, + "name": "zoglin_spawn_egg", + "translation_key": "item.minecraft.zoglin_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1040, + "name": "zombie_spawn_egg", + "translation_key": "item.minecraft.zombie_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1041, + "name": "zombie_horse_spawn_egg", + "translation_key": "item.minecraft.zombie_horse_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1042, + "name": "zombie_villager_spawn_egg", + "translation_key": "item.minecraft.zombie_villager_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1043, + "name": "zombified_piglin_spawn_egg", + "translation_key": "item.minecraft.zombified_piglin_spawn_egg", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1044, + "name": "experience_bottle", + "translation_key": "item.minecraft.experience_bottle", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1045, + "name": "fire_charge", + "translation_key": "item.minecraft.fire_charge", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1046, + "name": "writable_book", + "translation_key": "item.minecraft.writable_book", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1047, + "name": "written_book", + "translation_key": "item.minecraft.written_book", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1048, + "name": "item_frame", + "translation_key": "item.minecraft.item_frame", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1049, + "name": "glow_item_frame", + "translation_key": "item.minecraft.glow_item_frame", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1050, + "name": "flower_pot", + "translation_key": "block.minecraft.flower_pot", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1051, + "name": "carrot", + "translation_key": "item.minecraft.carrot", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 3, + "saturation": 0.6, + "always_edible": false, + "meat": false, + "snack": false, + "effects": [] + } + }, + { + "id": 1052, + "name": "potato", + "translation_key": "item.minecraft.potato", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 1, + "saturation": 0.3, + "always_edible": false, + "meat": false, + "snack": false, + "effects": [] + } + }, + { + "id": 1053, + "name": "baked_potato", + "translation_key": "item.minecraft.baked_potato", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 5, + "saturation": 0.6, + "always_edible": false, + "meat": false, + "snack": false, + "effects": [] + } + }, + { + "id": 1054, + "name": "poisonous_potato", + "translation_key": "item.minecraft.poisonous_potato", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 2, + "saturation": 0.3, + "always_edible": false, + "meat": false, + "snack": false, + "effects": [ + { + "chance": 0.6, + "translation_key": "effect.minecraft.poison" + } + ] + } + }, + { + "id": 1055, + "name": "map", + "translation_key": "item.minecraft.map", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1056, + "name": "golden_carrot", + "translation_key": "item.minecraft.golden_carrot", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 6, + "saturation": 1.2, + "always_edible": false, + "meat": false, + "snack": false, + "effects": [] + } + }, + { + "id": 1057, + "name": "skeleton_skull", + "translation_key": "block.minecraft.skeleton_skull", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1058, + "name": "wither_skeleton_skull", + "translation_key": "block.minecraft.wither_skeleton_skull", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1059, + "name": "player_head", + "translation_key": "block.minecraft.player_head", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1060, + "name": "zombie_head", + "translation_key": "block.minecraft.zombie_head", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1061, + "name": "creeper_head", + "translation_key": "block.minecraft.creeper_head", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1062, + "name": "dragon_head", + "translation_key": "block.minecraft.dragon_head", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1063, + "name": "piglin_head", + "translation_key": "block.minecraft.piglin_head", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1064, + "name": "nether_star", + "translation_key": "item.minecraft.nether_star", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1065, + "name": "pumpkin_pie", + "translation_key": "item.minecraft.pumpkin_pie", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 8, + "saturation": 0.3, + "always_edible": false, + "meat": false, + "snack": false, + "effects": [] + } + }, + { + "id": 1066, + "name": "firework_rocket", + "translation_key": "item.minecraft.firework_rocket", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1067, + "name": "firework_star", + "translation_key": "item.minecraft.firework_star", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1068, + "name": "enchanted_book", + "translation_key": "item.minecraft.enchanted_book", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1069, + "name": "nether_brick", + "translation_key": "item.minecraft.nether_brick", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1070, + "name": "prismarine_shard", + "translation_key": "item.minecraft.prismarine_shard", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1071, + "name": "prismarine_crystals", + "translation_key": "item.minecraft.prismarine_crystals", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1072, + "name": "rabbit", + "translation_key": "item.minecraft.rabbit", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 3, + "saturation": 0.3, + "always_edible": false, + "meat": true, + "snack": false, + "effects": [] + } + }, + { + "id": 1073, + "name": "cooked_rabbit", + "translation_key": "item.minecraft.cooked_rabbit", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 5, + "saturation": 0.6, + "always_edible": false, + "meat": true, + "snack": false, + "effects": [] + } + }, + { + "id": 1074, + "name": "rabbit_stew", + "translation_key": "item.minecraft.rabbit_stew", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 10, + "saturation": 0.6, + "always_edible": false, + "meat": false, + "snack": false, + "effects": [] + } + }, + { + "id": 1075, + "name": "rabbit_foot", + "translation_key": "item.minecraft.rabbit_foot", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1076, + "name": "rabbit_hide", + "translation_key": "item.minecraft.rabbit_hide", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1077, + "name": "armor_stand", + "translation_key": "item.minecraft.armor_stand", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1078, + "name": "iron_horse_armor", + "translation_key": "item.minecraft.iron_horse_armor", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1079, + "name": "golden_horse_armor", + "translation_key": "item.minecraft.golden_horse_armor", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1080, + "name": "diamond_horse_armor", + "translation_key": "item.minecraft.diamond_horse_armor", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1081, + "name": "leather_horse_armor", + "translation_key": "item.minecraft.leather_horse_armor", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1082, + "name": "lead", + "translation_key": "item.minecraft.lead", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1083, + "name": "name_tag", + "translation_key": "item.minecraft.name_tag", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1084, + "name": "command_block_minecart", + "translation_key": "item.minecraft.command_block_minecart", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1085, + "name": "mutton", + "translation_key": "item.minecraft.mutton", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 2, + "saturation": 0.3, + "always_edible": false, + "meat": true, + "snack": false, + "effects": [] + } + }, + { + "id": 1086, + "name": "cooked_mutton", + "translation_key": "item.minecraft.cooked_mutton", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 6, + "saturation": 0.8, + "always_edible": false, + "meat": true, + "snack": false, + "effects": [] + } + }, + { + "id": 1087, + "name": "white_banner", + "translation_key": "block.minecraft.white_banner", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1088, + "name": "orange_banner", + "translation_key": "block.minecraft.orange_banner", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1089, + "name": "magenta_banner", + "translation_key": "block.minecraft.magenta_banner", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1090, + "name": "light_blue_banner", + "translation_key": "block.minecraft.light_blue_banner", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1091, + "name": "yellow_banner", + "translation_key": "block.minecraft.yellow_banner", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1092, + "name": "lime_banner", + "translation_key": "block.minecraft.lime_banner", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1093, + "name": "pink_banner", + "translation_key": "block.minecraft.pink_banner", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1094, + "name": "gray_banner", + "translation_key": "block.minecraft.gray_banner", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1095, + "name": "light_gray_banner", + "translation_key": "block.minecraft.light_gray_banner", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1096, + "name": "cyan_banner", + "translation_key": "block.minecraft.cyan_banner", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1097, + "name": "purple_banner", + "translation_key": "block.minecraft.purple_banner", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1098, + "name": "blue_banner", + "translation_key": "block.minecraft.blue_banner", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1099, + "name": "brown_banner", + "translation_key": "block.minecraft.brown_banner", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1100, + "name": "green_banner", + "translation_key": "block.minecraft.green_banner", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1101, + "name": "red_banner", + "translation_key": "block.minecraft.red_banner", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1102, + "name": "black_banner", + "translation_key": "block.minecraft.black_banner", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1103, + "name": "end_crystal", + "translation_key": "item.minecraft.end_crystal", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1104, + "name": "chorus_fruit", + "translation_key": "item.minecraft.chorus_fruit", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 4, + "saturation": 0.3, + "always_edible": true, + "meat": false, + "snack": false, + "effects": [] + } + }, + { + "id": 1105, + "name": "popped_chorus_fruit", + "translation_key": "item.minecraft.popped_chorus_fruit", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1106, + "name": "torchflower_seeds", + "translation_key": "item.minecraft.torchflower_seeds", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1107, + "name": "pitcher_pod", + "translation_key": "item.minecraft.pitcher_pod", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1108, + "name": "beetroot", + "translation_key": "item.minecraft.beetroot", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 1, + "saturation": 0.6, + "always_edible": false, + "meat": false, + "snack": false, + "effects": [] + } + }, + { + "id": 1109, + "name": "beetroot_seeds", + "translation_key": "item.minecraft.beetroot_seeds", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1110, + "name": "beetroot_soup", + "translation_key": "item.minecraft.beetroot_soup", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 6, + "saturation": 0.6, + "always_edible": false, + "meat": false, + "snack": false, + "effects": [] + } + }, + { + "id": 1111, + "name": "dragon_breath", + "translation_key": "item.minecraft.dragon_breath", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1112, + "name": "splash_potion", + "translation_key": "item.minecraft.splash_potion", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1113, + "name": "spectral_arrow", + "translation_key": "item.minecraft.spectral_arrow", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1114, + "name": "tipped_arrow", + "translation_key": "item.minecraft.tipped_arrow", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1115, + "name": "lingering_potion", + "translation_key": "item.minecraft.lingering_potion", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1116, + "name": "shield", + "translation_key": "item.minecraft.shield", + "max_stack": 1, + "max_durability": 336, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1117, + "name": "totem_of_undying", + "translation_key": "item.minecraft.totem_of_undying", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1118, + "name": "shulker_shell", + "translation_key": "item.minecraft.shulker_shell", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1119, + "name": "iron_nugget", + "translation_key": "item.minecraft.iron_nugget", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1120, + "name": "knowledge_book", + "translation_key": "item.minecraft.knowledge_book", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1121, + "name": "debug_stick", + "translation_key": "item.minecraft.debug_stick", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1122, + "name": "music_disc_13", + "translation_key": "item.minecraft.music_disc_13", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1123, + "name": "music_disc_cat", + "translation_key": "item.minecraft.music_disc_cat", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1124, + "name": "music_disc_blocks", + "translation_key": "item.minecraft.music_disc_blocks", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1125, + "name": "music_disc_chirp", + "translation_key": "item.minecraft.music_disc_chirp", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1126, + "name": "music_disc_far", + "translation_key": "item.minecraft.music_disc_far", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1127, + "name": "music_disc_mall", + "translation_key": "item.minecraft.music_disc_mall", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1128, + "name": "music_disc_mellohi", + "translation_key": "item.minecraft.music_disc_mellohi", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1129, + "name": "music_disc_stal", + "translation_key": "item.minecraft.music_disc_stal", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1130, + "name": "music_disc_strad", + "translation_key": "item.minecraft.music_disc_strad", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1131, + "name": "music_disc_ward", + "translation_key": "item.minecraft.music_disc_ward", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1132, + "name": "music_disc_11", + "translation_key": "item.minecraft.music_disc_11", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1133, + "name": "music_disc_wait", + "translation_key": "item.minecraft.music_disc_wait", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1134, + "name": "music_disc_otherside", + "translation_key": "item.minecraft.music_disc_otherside", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1135, + "name": "music_disc_relic", + "translation_key": "item.minecraft.music_disc_relic", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1136, + "name": "music_disc_5", + "translation_key": "item.minecraft.music_disc_5", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1137, + "name": "music_disc_pigstep", + "translation_key": "item.minecraft.music_disc_pigstep", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1138, + "name": "disc_fragment_5", + "translation_key": "item.minecraft.disc_fragment_5", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1139, + "name": "trident", + "translation_key": "item.minecraft.trident", + "max_stack": 1, + "max_durability": 250, + "enchantability": 1, + "fireproof": false + }, + { + "id": 1140, + "name": "phantom_membrane", + "translation_key": "item.minecraft.phantom_membrane", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1141, + "name": "nautilus_shell", + "translation_key": "item.minecraft.nautilus_shell", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1142, + "name": "heart_of_the_sea", + "translation_key": "item.minecraft.heart_of_the_sea", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1143, + "name": "crossbow", + "translation_key": "item.minecraft.crossbow", + "max_stack": 1, + "max_durability": 465, + "enchantability": 1, + "fireproof": false + }, + { + "id": 1144, + "name": "suspicious_stew", + "translation_key": "item.minecraft.suspicious_stew", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 6, + "saturation": 0.6, + "always_edible": true, + "meat": false, + "snack": false, + "effects": [] + } + }, + { + "id": 1145, + "name": "loom", + "translation_key": "block.minecraft.loom", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1146, + "name": "flower_banner_pattern", + "translation_key": "item.minecraft.flower_banner_pattern", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1147, + "name": "creeper_banner_pattern", + "translation_key": "item.minecraft.creeper_banner_pattern", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1148, + "name": "skull_banner_pattern", + "translation_key": "item.minecraft.skull_banner_pattern", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1149, + "name": "mojang_banner_pattern", + "translation_key": "item.minecraft.mojang_banner_pattern", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1150, + "name": "globe_banner_pattern", + "translation_key": "item.minecraft.globe_banner_pattern", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1151, + "name": "piglin_banner_pattern", + "translation_key": "item.minecraft.piglin_banner_pattern", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1152, + "name": "goat_horn", + "translation_key": "item.minecraft.goat_horn", + "max_stack": 1, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1153, + "name": "composter", + "translation_key": "block.minecraft.composter", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1154, + "name": "barrel", + "translation_key": "block.minecraft.barrel", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1155, + "name": "smoker", + "translation_key": "block.minecraft.smoker", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1156, + "name": "blast_furnace", + "translation_key": "block.minecraft.blast_furnace", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1157, + "name": "cartography_table", + "translation_key": "block.minecraft.cartography_table", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1158, + "name": "fletching_table", + "translation_key": "block.minecraft.fletching_table", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1159, + "name": "grindstone", + "translation_key": "block.minecraft.grindstone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1160, + "name": "smithing_table", + "translation_key": "block.minecraft.smithing_table", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1161, + "name": "stonecutter", + "translation_key": "block.minecraft.stonecutter", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1162, + "name": "bell", + "translation_key": "block.minecraft.bell", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1163, + "name": "lantern", + "translation_key": "block.minecraft.lantern", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1164, + "name": "soul_lantern", + "translation_key": "block.minecraft.soul_lantern", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1165, + "name": "sweet_berries", + "translation_key": "item.minecraft.sweet_berries", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 2, + "saturation": 0.1, + "always_edible": false, + "meat": false, + "snack": false, + "effects": [] + } + }, + { + "id": 1166, + "name": "glow_berries", + "translation_key": "item.minecraft.glow_berries", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 2, + "saturation": 0.1, + "always_edible": false, + "meat": false, + "snack": false, + "effects": [] + } + }, + { + "id": 1167, + "name": "campfire", + "translation_key": "block.minecraft.campfire", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1168, + "name": "soul_campfire", + "translation_key": "block.minecraft.soul_campfire", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1169, + "name": "shroomlight", + "translation_key": "block.minecraft.shroomlight", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1170, + "name": "honeycomb", + "translation_key": "item.minecraft.honeycomb", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1171, + "name": "bee_nest", + "translation_key": "block.minecraft.bee_nest", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1172, + "name": "beehive", + "translation_key": "block.minecraft.beehive", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1173, + "name": "honey_bottle", + "translation_key": "item.minecraft.honey_bottle", + "max_stack": 16, + "max_durability": 0, + "enchantability": 0, + "fireproof": false, + "food": { + "hunger": 6, + "saturation": 0.1, + "always_edible": false, + "meat": false, + "snack": false, + "effects": [] + } + }, + { + "id": 1174, + "name": "honeycomb_block", + "translation_key": "block.minecraft.honeycomb_block", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1175, + "name": "lodestone", + "translation_key": "block.minecraft.lodestone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1176, + "name": "crying_obsidian", + "translation_key": "block.minecraft.crying_obsidian", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1177, + "name": "blackstone", + "translation_key": "block.minecraft.blackstone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1178, + "name": "blackstone_slab", + "translation_key": "block.minecraft.blackstone_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1179, + "name": "blackstone_stairs", + "translation_key": "block.minecraft.blackstone_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1180, + "name": "gilded_blackstone", + "translation_key": "block.minecraft.gilded_blackstone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1181, + "name": "polished_blackstone", + "translation_key": "block.minecraft.polished_blackstone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1182, + "name": "polished_blackstone_slab", + "translation_key": "block.minecraft.polished_blackstone_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1183, + "name": "polished_blackstone_stairs", + "translation_key": "block.minecraft.polished_blackstone_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1184, + "name": "chiseled_polished_blackstone", + "translation_key": "block.minecraft.chiseled_polished_blackstone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1185, + "name": "polished_blackstone_bricks", + "translation_key": "block.minecraft.polished_blackstone_bricks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1186, + "name": "polished_blackstone_brick_slab", + "translation_key": "block.minecraft.polished_blackstone_brick_slab", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1187, + "name": "polished_blackstone_brick_stairs", + "translation_key": "block.minecraft.polished_blackstone_brick_stairs", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1188, + "name": "cracked_polished_blackstone_bricks", + "translation_key": "block.minecraft.cracked_polished_blackstone_bricks", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1189, + "name": "respawn_anchor", + "translation_key": "block.minecraft.respawn_anchor", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1190, + "name": "candle", + "translation_key": "block.minecraft.candle", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1191, + "name": "white_candle", + "translation_key": "block.minecraft.white_candle", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1192, + "name": "orange_candle", + "translation_key": "block.minecraft.orange_candle", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1193, + "name": "magenta_candle", + "translation_key": "block.minecraft.magenta_candle", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1194, + "name": "light_blue_candle", + "translation_key": "block.minecraft.light_blue_candle", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1195, + "name": "yellow_candle", + "translation_key": "block.minecraft.yellow_candle", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1196, + "name": "lime_candle", + "translation_key": "block.minecraft.lime_candle", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1197, + "name": "pink_candle", + "translation_key": "block.minecraft.pink_candle", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1198, + "name": "gray_candle", + "translation_key": "block.minecraft.gray_candle", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1199, + "name": "light_gray_candle", + "translation_key": "block.minecraft.light_gray_candle", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1200, + "name": "cyan_candle", + "translation_key": "block.minecraft.cyan_candle", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1201, + "name": "purple_candle", + "translation_key": "block.minecraft.purple_candle", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1202, + "name": "blue_candle", + "translation_key": "block.minecraft.blue_candle", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1203, + "name": "brown_candle", + "translation_key": "block.minecraft.brown_candle", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1204, + "name": "green_candle", + "translation_key": "block.minecraft.green_candle", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1205, + "name": "red_candle", + "translation_key": "block.minecraft.red_candle", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1206, + "name": "black_candle", + "translation_key": "block.minecraft.black_candle", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1207, + "name": "small_amethyst_bud", + "translation_key": "block.minecraft.small_amethyst_bud", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1208, + "name": "medium_amethyst_bud", + "translation_key": "block.minecraft.medium_amethyst_bud", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1209, + "name": "large_amethyst_bud", + "translation_key": "block.minecraft.large_amethyst_bud", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1210, + "name": "amethyst_cluster", + "translation_key": "block.minecraft.amethyst_cluster", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1211, + "name": "pointed_dripstone", + "translation_key": "block.minecraft.pointed_dripstone", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1212, + "name": "ochre_froglight", + "translation_key": "block.minecraft.ochre_froglight", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1213, + "name": "verdant_froglight", + "translation_key": "block.minecraft.verdant_froglight", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1214, + "name": "pearlescent_froglight", + "translation_key": "block.minecraft.pearlescent_froglight", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1215, + "name": "frogspawn", + "translation_key": "block.minecraft.frogspawn", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1216, + "name": "echo_shard", + "translation_key": "item.minecraft.echo_shard", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1217, + "name": "brush", + "translation_key": "item.minecraft.brush", + "max_stack": 1, + "max_durability": 64, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1218, + "name": "netherite_upgrade_smithing_template", + "translation_key": "item.minecraft.smithing_template", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1219, + "name": "sentry_armor_trim_smithing_template", + "translation_key": "item.minecraft.smithing_template", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1220, + "name": "dune_armor_trim_smithing_template", + "translation_key": "item.minecraft.smithing_template", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1221, + "name": "coast_armor_trim_smithing_template", + "translation_key": "item.minecraft.smithing_template", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1222, + "name": "wild_armor_trim_smithing_template", + "translation_key": "item.minecraft.smithing_template", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1223, + "name": "ward_armor_trim_smithing_template", + "translation_key": "item.minecraft.smithing_template", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1224, + "name": "eye_armor_trim_smithing_template", + "translation_key": "item.minecraft.smithing_template", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1225, + "name": "vex_armor_trim_smithing_template", + "translation_key": "item.minecraft.smithing_template", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1226, + "name": "tide_armor_trim_smithing_template", + "translation_key": "item.minecraft.smithing_template", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1227, + "name": "snout_armor_trim_smithing_template", + "translation_key": "item.minecraft.smithing_template", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1228, + "name": "rib_armor_trim_smithing_template", + "translation_key": "item.minecraft.smithing_template", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1229, + "name": "spire_armor_trim_smithing_template", + "translation_key": "item.minecraft.smithing_template", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1230, + "name": "wayfinder_armor_trim_smithing_template", + "translation_key": "item.minecraft.smithing_template", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1231, + "name": "shaper_armor_trim_smithing_template", + "translation_key": "item.minecraft.smithing_template", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1232, + "name": "silence_armor_trim_smithing_template", + "translation_key": "item.minecraft.smithing_template", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1233, + "name": "raiser_armor_trim_smithing_template", + "translation_key": "item.minecraft.smithing_template", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1234, + "name": "host_armor_trim_smithing_template", + "translation_key": "item.minecraft.smithing_template", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1235, + "name": "angler_pottery_sherd", + "translation_key": "item.minecraft.angler_pottery_sherd", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1236, + "name": "archer_pottery_sherd", + "translation_key": "item.minecraft.archer_pottery_sherd", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1237, + "name": "arms_up_pottery_sherd", + "translation_key": "item.minecraft.arms_up_pottery_sherd", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1238, + "name": "blade_pottery_sherd", + "translation_key": "item.minecraft.blade_pottery_sherd", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1239, + "name": "brewer_pottery_sherd", + "translation_key": "item.minecraft.brewer_pottery_sherd", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1240, + "name": "burn_pottery_sherd", + "translation_key": "item.minecraft.burn_pottery_sherd", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1241, + "name": "danger_pottery_sherd", + "translation_key": "item.minecraft.danger_pottery_sherd", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1242, + "name": "explorer_pottery_sherd", + "translation_key": "item.minecraft.explorer_pottery_sherd", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1243, + "name": "friend_pottery_sherd", + "translation_key": "item.minecraft.friend_pottery_sherd", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1244, + "name": "heart_pottery_sherd", + "translation_key": "item.minecraft.heart_pottery_sherd", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1245, + "name": "heartbreak_pottery_sherd", + "translation_key": "item.minecraft.heartbreak_pottery_sherd", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1246, + "name": "howl_pottery_sherd", + "translation_key": "item.minecraft.howl_pottery_sherd", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1247, + "name": "miner_pottery_sherd", + "translation_key": "item.minecraft.miner_pottery_sherd", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1248, + "name": "mourner_pottery_sherd", + "translation_key": "item.minecraft.mourner_pottery_sherd", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1249, + "name": "plenty_pottery_sherd", + "translation_key": "item.minecraft.plenty_pottery_sherd", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1250, + "name": "prize_pottery_sherd", + "translation_key": "item.minecraft.prize_pottery_sherd", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1251, + "name": "sheaf_pottery_sherd", + "translation_key": "item.minecraft.sheaf_pottery_sherd", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1252, + "name": "shelter_pottery_sherd", + "translation_key": "item.minecraft.shelter_pottery_sherd", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1253, + "name": "skull_pottery_sherd", + "translation_key": "item.minecraft.skull_pottery_sherd", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + }, + { + "id": 1254, + "name": "snort_pottery_sherd", + "translation_key": "item.minecraft.snort_pottery_sherd", + "max_stack": 64, + "max_durability": 0, + "enchantability": 0, + "fireproof": false + } +] \ No newline at end of file diff --git a/vendor/valence/crates/valence_generated/extracted/packets.json b/vendor/valence/crates/valence_generated/extracted/packets.json new file mode 100644 index 00000000..b9d6c757 --- /dev/null +++ b/vendor/valence/crates/valence_generated/extracted/packets.json @@ -0,0 +1,1052 @@ +[ + { + "name": "HandshakeC2SPacket", + "side": "serverbound", + "state": "handshaking", + "id": 0 + }, + { + "name": "TeleportConfirmC2SPacket", + "side": "serverbound", + "state": "play", + "id": 0 + }, + { + "name": "QueryBlockNbtC2SPacket", + "side": "serverbound", + "state": "play", + "id": 1 + }, + { + "name": "UpdateDifficultyC2SPacket", + "side": "serverbound", + "state": "play", + "id": 2 + }, + { + "name": "MessageAcknowledgmentC2SPacket", + "side": "serverbound", + "state": "play", + "id": 3 + }, + { + "name": "CommandExecutionC2SPacket", + "side": "serverbound", + "state": "play", + "id": 4 + }, + { + "name": "ChatMessageC2SPacket", + "side": "serverbound", + "state": "play", + "id": 5 + }, + { + "name": "PlayerSessionC2SPacket", + "side": "serverbound", + "state": "play", + "id": 6 + }, + { + "name": "ClientStatusC2SPacket", + "side": "serverbound", + "state": "play", + "id": 7 + }, + { + "name": "ClientSettingsC2SPacket", + "side": "serverbound", + "state": "play", + "id": 8 + }, + { + "name": "RequestCommandCompletionsC2SPacket", + "side": "serverbound", + "state": "play", + "id": 9 + }, + { + "name": "ButtonClickC2SPacket", + "side": "serverbound", + "state": "play", + "id": 10 + }, + { + "name": "ClickSlotC2SPacket", + "side": "serverbound", + "state": "play", + "id": 11 + }, + { + "name": "CloseHandledScreenC2SPacket", + "side": "serverbound", + "state": "play", + "id": 12 + }, + { + "name": "CustomPayloadC2SPacket", + "side": "serverbound", + "state": "play", + "id": 13 + }, + { + "name": "BookUpdateC2SPacket", + "side": "serverbound", + "state": "play", + "id": 14 + }, + { + "name": "QueryEntityNbtC2SPacket", + "side": "serverbound", + "state": "play", + "id": 15 + }, + { + "name": "PlayerInteractEntityC2SPacket", + "side": "serverbound", + "state": "play", + "id": 16 + }, + { + "name": "JigsawGeneratingC2SPacket", + "side": "serverbound", + "state": "play", + "id": 17 + }, + { + "name": "KeepAliveC2SPacket", + "side": "serverbound", + "state": "play", + "id": 18 + }, + { + "name": "UpdateDifficultyLockC2SPacket", + "side": "serverbound", + "state": "play", + "id": 19 + }, + { + "name": "PositionAndOnGround", + "side": "serverbound", + "state": "play", + "id": 20 + }, + { + "name": "Full", + "side": "serverbound", + "state": "play", + "id": 21 + }, + { + "name": "LookAndOnGround", + "side": "serverbound", + "state": "play", + "id": 22 + }, + { + "name": "OnGroundOnly", + "side": "serverbound", + "state": "play", + "id": 23 + }, + { + "name": "VehicleMoveC2SPacket", + "side": "serverbound", + "state": "play", + "id": 24 + }, + { + "name": "BoatPaddleStateC2SPacket", + "side": "serverbound", + "state": "play", + "id": 25 + }, + { + "name": "PickFromInventoryC2SPacket", + "side": "serverbound", + "state": "play", + "id": 26 + }, + { + "name": "CraftRequestC2SPacket", + "side": "serverbound", + "state": "play", + "id": 27 + }, + { + "name": "UpdatePlayerAbilitiesC2SPacket", + "side": "serverbound", + "state": "play", + "id": 28 + }, + { + "name": "PlayerActionC2SPacket", + "side": "serverbound", + "state": "play", + "id": 29 + }, + { + "name": "ClientCommandC2SPacket", + "side": "serverbound", + "state": "play", + "id": 30 + }, + { + "name": "PlayerInputC2SPacket", + "side": "serverbound", + "state": "play", + "id": 31 + }, + { + "name": "PlayPongC2SPacket", + "side": "serverbound", + "state": "play", + "id": 32 + }, + { + "name": "RecipeCategoryOptionsC2SPacket", + "side": "serverbound", + "state": "play", + "id": 33 + }, + { + "name": "RecipeBookDataC2SPacket", + "side": "serverbound", + "state": "play", + "id": 34 + }, + { + "name": "RenameItemC2SPacket", + "side": "serverbound", + "state": "play", + "id": 35 + }, + { + "name": "ResourcePackStatusC2SPacket", + "side": "serverbound", + "state": "play", + "id": 36 + }, + { + "name": "AdvancementTabC2SPacket", + "side": "serverbound", + "state": "play", + "id": 37 + }, + { + "name": "SelectMerchantTradeC2SPacket", + "side": "serverbound", + "state": "play", + "id": 38 + }, + { + "name": "UpdateBeaconC2SPacket", + "side": "serverbound", + "state": "play", + "id": 39 + }, + { + "name": "UpdateSelectedSlotC2SPacket", + "side": "serverbound", + "state": "play", + "id": 40 + }, + { + "name": "UpdateCommandBlockC2SPacket", + "side": "serverbound", + "state": "play", + "id": 41 + }, + { + "name": "UpdateCommandBlockMinecartC2SPacket", + "side": "serverbound", + "state": "play", + "id": 42 + }, + { + "name": "CreativeInventoryActionC2SPacket", + "side": "serverbound", + "state": "play", + "id": 43 + }, + { + "name": "UpdateJigsawC2SPacket", + "side": "serverbound", + "state": "play", + "id": 44 + }, + { + "name": "UpdateStructureBlockC2SPacket", + "side": "serverbound", + "state": "play", + "id": 45 + }, + { + "name": "UpdateSignC2SPacket", + "side": "serverbound", + "state": "play", + "id": 46 + }, + { + "name": "HandSwingC2SPacket", + "side": "serverbound", + "state": "play", + "id": 47 + }, + { + "name": "SpectatorTeleportC2SPacket", + "side": "serverbound", + "state": "play", + "id": 48 + }, + { + "name": "PlayerInteractBlockC2SPacket", + "side": "serverbound", + "state": "play", + "id": 49 + }, + { + "name": "PlayerInteractItemC2SPacket", + "side": "serverbound", + "state": "play", + "id": 50 + }, + { + "name": "QueryRequestC2SPacket", + "side": "serverbound", + "state": "status", + "id": 0 + }, + { + "name": "QueryPingC2SPacket", + "side": "serverbound", + "state": "status", + "id": 1 + }, + { + "name": "LoginHelloC2SPacket", + "side": "serverbound", + "state": "login", + "id": 0 + }, + { + "name": "LoginKeyC2SPacket", + "side": "serverbound", + "state": "login", + "id": 1 + }, + { + "name": "LoginQueryResponseC2SPacket", + "side": "serverbound", + "state": "login", + "id": 2 + }, + { + "name": "BundleSplitterPacket", + "side": "clientbound", + "state": "play", + "id": 0 + }, + { + "name": "EntitySpawnS2CPacket", + "side": "clientbound", + "state": "play", + "id": 1 + }, + { + "name": "ExperienceOrbSpawnS2CPacket", + "side": "clientbound", + "state": "play", + "id": 2 + }, + { + "name": "PlayerSpawnS2CPacket", + "side": "clientbound", + "state": "play", + "id": 3 + }, + { + "name": "EntityAnimationS2CPacket", + "side": "clientbound", + "state": "play", + "id": 4 + }, + { + "name": "StatisticsS2CPacket", + "side": "clientbound", + "state": "play", + "id": 5 + }, + { + "name": "PlayerActionResponseS2CPacket", + "side": "clientbound", + "state": "play", + "id": 6 + }, + { + "name": "BlockBreakingProgressS2CPacket", + "side": "clientbound", + "state": "play", + "id": 7 + }, + { + "name": "BlockEntityUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 8 + }, + { + "name": "BlockEventS2CPacket", + "side": "clientbound", + "state": "play", + "id": 9 + }, + { + "name": "BlockUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 10 + }, + { + "name": "BossBarS2CPacket", + "side": "clientbound", + "state": "play", + "id": 11 + }, + { + "name": "DifficultyS2CPacket", + "side": "clientbound", + "state": "play", + "id": 12 + }, + { + "name": "ChunkBiomeDataS2CPacket", + "side": "clientbound", + "state": "play", + "id": 13 + }, + { + "name": "ClearTitleS2CPacket", + "side": "clientbound", + "state": "play", + "id": 14 + }, + { + "name": "CommandSuggestionsS2CPacket", + "side": "clientbound", + "state": "play", + "id": 15 + }, + { + "name": "CommandTreeS2CPacket", + "side": "clientbound", + "state": "play", + "id": 16 + }, + { + "name": "CloseScreenS2CPacket", + "side": "clientbound", + "state": "play", + "id": 17 + }, + { + "name": "InventoryS2CPacket", + "side": "clientbound", + "state": "play", + "id": 18 + }, + { + "name": "ScreenHandlerPropertyUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 19 + }, + { + "name": "ScreenHandlerSlotUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 20 + }, + { + "name": "CooldownUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 21 + }, + { + "name": "ChatSuggestionsS2CPacket", + "side": "clientbound", + "state": "play", + "id": 22 + }, + { + "name": "CustomPayloadS2CPacket", + "side": "clientbound", + "state": "play", + "id": 23 + }, + { + "name": "EntityDamageS2CPacket", + "side": "clientbound", + "state": "play", + "id": 24 + }, + { + "name": "RemoveMessageS2CPacket", + "side": "clientbound", + "state": "play", + "id": 25 + }, + { + "name": "DisconnectS2CPacket", + "side": "clientbound", + "state": "play", + "id": 26 + }, + { + "name": "ProfilelessChatMessageS2CPacket", + "side": "clientbound", + "state": "play", + "id": 27 + }, + { + "name": "EntityStatusS2CPacket", + "side": "clientbound", + "state": "play", + "id": 28 + }, + { + "name": "ExplosionS2CPacket", + "side": "clientbound", + "state": "play", + "id": 29 + }, + { + "name": "UnloadChunkS2CPacket", + "side": "clientbound", + "state": "play", + "id": 30 + }, + { + "name": "GameStateChangeS2CPacket", + "side": "clientbound", + "state": "play", + "id": 31 + }, + { + "name": "OpenHorseScreenS2CPacket", + "side": "clientbound", + "state": "play", + "id": 32 + }, + { + "name": "DamageTiltS2CPacket", + "side": "clientbound", + "state": "play", + "id": 33 + }, + { + "name": "WorldBorderInitializeS2CPacket", + "side": "clientbound", + "state": "play", + "id": 34 + }, + { + "name": "KeepAliveS2CPacket", + "side": "clientbound", + "state": "play", + "id": 35 + }, + { + "name": "ChunkDataS2CPacket", + "side": "clientbound", + "state": "play", + "id": 36 + }, + { + "name": "WorldEventS2CPacket", + "side": "clientbound", + "state": "play", + "id": 37 + }, + { + "name": "ParticleS2CPacket", + "side": "clientbound", + "state": "play", + "id": 38 + }, + { + "name": "LightUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 39 + }, + { + "name": "GameJoinS2CPacket", + "side": "clientbound", + "state": "play", + "id": 40 + }, + { + "name": "MapUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 41 + }, + { + "name": "SetTradeOffersS2CPacket", + "side": "clientbound", + "state": "play", + "id": 42 + }, + { + "name": "MoveRelative", + "side": "clientbound", + "state": "play", + "id": 43 + }, + { + "name": "RotateAndMoveRelative", + "side": "clientbound", + "state": "play", + "id": 44 + }, + { + "name": "Rotate", + "side": "clientbound", + "state": "play", + "id": 45 + }, + { + "name": "VehicleMoveS2CPacket", + "side": "clientbound", + "state": "play", + "id": 46 + }, + { + "name": "OpenWrittenBookS2CPacket", + "side": "clientbound", + "state": "play", + "id": 47 + }, + { + "name": "OpenScreenS2CPacket", + "side": "clientbound", + "state": "play", + "id": 48 + }, + { + "name": "SignEditorOpenS2CPacket", + "side": "clientbound", + "state": "play", + "id": 49 + }, + { + "name": "PlayPingS2CPacket", + "side": "clientbound", + "state": "play", + "id": 50 + }, + { + "name": "CraftFailedResponseS2CPacket", + "side": "clientbound", + "state": "play", + "id": 51 + }, + { + "name": "PlayerAbilitiesS2CPacket", + "side": "clientbound", + "state": "play", + "id": 52 + }, + { + "name": "ChatMessageS2CPacket", + "side": "clientbound", + "state": "play", + "id": 53 + }, + { + "name": "EndCombatS2CPacket", + "side": "clientbound", + "state": "play", + "id": 54 + }, + { + "name": "EnterCombatS2CPacket", + "side": "clientbound", + "state": "play", + "id": 55 + }, + { + "name": "DeathMessageS2CPacket", + "side": "clientbound", + "state": "play", + "id": 56 + }, + { + "name": "PlayerRemoveS2CPacket", + "side": "clientbound", + "state": "play", + "id": 57 + }, + { + "name": "PlayerListS2CPacket", + "side": "clientbound", + "state": "play", + "id": 58 + }, + { + "name": "LookAtS2CPacket", + "side": "clientbound", + "state": "play", + "id": 59 + }, + { + "name": "PlayerPositionLookS2CPacket", + "side": "clientbound", + "state": "play", + "id": 60 + }, + { + "name": "UnlockRecipesS2CPacket", + "side": "clientbound", + "state": "play", + "id": 61 + }, + { + "name": "EntitiesDestroyS2CPacket", + "side": "clientbound", + "state": "play", + "id": 62 + }, + { + "name": "RemoveEntityStatusEffectS2CPacket", + "side": "clientbound", + "state": "play", + "id": 63 + }, + { + "name": "ResourcePackSendS2CPacket", + "side": "clientbound", + "state": "play", + "id": 64 + }, + { + "name": "PlayerRespawnS2CPacket", + "side": "clientbound", + "state": "play", + "id": 65 + }, + { + "name": "EntitySetHeadYawS2CPacket", + "side": "clientbound", + "state": "play", + "id": 66 + }, + { + "name": "ChunkDeltaUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 67 + }, + { + "name": "SelectAdvancementTabS2CPacket", + "side": "clientbound", + "state": "play", + "id": 68 + }, + { + "name": "ServerMetadataS2CPacket", + "side": "clientbound", + "state": "play", + "id": 69 + }, + { + "name": "OverlayMessageS2CPacket", + "side": "clientbound", + "state": "play", + "id": 70 + }, + { + "name": "WorldBorderCenterChangedS2CPacket", + "side": "clientbound", + "state": "play", + "id": 71 + }, + { + "name": "WorldBorderInterpolateSizeS2CPacket", + "side": "clientbound", + "state": "play", + "id": 72 + }, + { + "name": "WorldBorderSizeChangedS2CPacket", + "side": "clientbound", + "state": "play", + "id": 73 + }, + { + "name": "WorldBorderWarningTimeChangedS2CPacket", + "side": "clientbound", + "state": "play", + "id": 74 + }, + { + "name": "WorldBorderWarningBlocksChangedS2CPacket", + "side": "clientbound", + "state": "play", + "id": 75 + }, + { + "name": "SetCameraEntityS2CPacket", + "side": "clientbound", + "state": "play", + "id": 76 + }, + { + "name": "UpdateSelectedSlotS2CPacket", + "side": "clientbound", + "state": "play", + "id": 77 + }, + { + "name": "ChunkRenderDistanceCenterS2CPacket", + "side": "clientbound", + "state": "play", + "id": 78 + }, + { + "name": "ChunkLoadDistanceS2CPacket", + "side": "clientbound", + "state": "play", + "id": 79 + }, + { + "name": "PlayerSpawnPositionS2CPacket", + "side": "clientbound", + "state": "play", + "id": 80 + }, + { + "name": "ScoreboardDisplayS2CPacket", + "side": "clientbound", + "state": "play", + "id": 81 + }, + { + "name": "EntityTrackerUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 82 + }, + { + "name": "EntityAttachS2CPacket", + "side": "clientbound", + "state": "play", + "id": 83 + }, + { + "name": "EntityVelocityUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 84 + }, + { + "name": "EntityEquipmentUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 85 + }, + { + "name": "ExperienceBarUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 86 + }, + { + "name": "HealthUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 87 + }, + { + "name": "ScoreboardObjectiveUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 88 + }, + { + "name": "EntityPassengersSetS2CPacket", + "side": "clientbound", + "state": "play", + "id": 89 + }, + { + "name": "TeamS2CPacket", + "side": "clientbound", + "state": "play", + "id": 90 + }, + { + "name": "ScoreboardPlayerUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 91 + }, + { + "name": "SimulationDistanceS2CPacket", + "side": "clientbound", + "state": "play", + "id": 92 + }, + { + "name": "SubtitleS2CPacket", + "side": "clientbound", + "state": "play", + "id": 93 + }, + { + "name": "WorldTimeUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 94 + }, + { + "name": "TitleS2CPacket", + "side": "clientbound", + "state": "play", + "id": 95 + }, + { + "name": "TitleFadeS2CPacket", + "side": "clientbound", + "state": "play", + "id": 96 + }, + { + "name": "PlaySoundFromEntityS2CPacket", + "side": "clientbound", + "state": "play", + "id": 97 + }, + { + "name": "PlaySoundS2CPacket", + "side": "clientbound", + "state": "play", + "id": 98 + }, + { + "name": "StopSoundS2CPacket", + "side": "clientbound", + "state": "play", + "id": 99 + }, + { + "name": "GameMessageS2CPacket", + "side": "clientbound", + "state": "play", + "id": 100 + }, + { + "name": "PlayerListHeaderS2CPacket", + "side": "clientbound", + "state": "play", + "id": 101 + }, + { + "name": "NbtQueryResponseS2CPacket", + "side": "clientbound", + "state": "play", + "id": 102 + }, + { + "name": "ItemPickupAnimationS2CPacket", + "side": "clientbound", + "state": "play", + "id": 103 + }, + { + "name": "EntityPositionS2CPacket", + "side": "clientbound", + "state": "play", + "id": 104 + }, + { + "name": "AdvancementUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 105 + }, + { + "name": "EntityAttributesS2CPacket", + "side": "clientbound", + "state": "play", + "id": 106 + }, + { + "name": "FeaturesS2CPacket", + "side": "clientbound", + "state": "play", + "id": 107 + }, + { + "name": "EntityStatusEffectS2CPacket", + "side": "clientbound", + "state": "play", + "id": 108 + }, + { + "name": "SynchronizeRecipesS2CPacket", + "side": "clientbound", + "state": "play", + "id": 109 + }, + { + "name": "SynchronizeTagsS2CPacket", + "side": "clientbound", + "state": "play", + "id": 110 + }, + { + "name": "QueryResponseS2CPacket", + "side": "clientbound", + "state": "status", + "id": 0 + }, + { + "name": "QueryPongS2CPacket", + "side": "clientbound", + "state": "status", + "id": 1 + }, + { + "name": "LoginDisconnectS2CPacket", + "side": "clientbound", + "state": "login", + "id": 0 + }, + { + "name": "LoginHelloS2CPacket", + "side": "clientbound", + "state": "login", + "id": 1 + }, + { + "name": "LoginSuccessS2CPacket", + "side": "clientbound", + "state": "login", + "id": 2 + }, + { + "name": "LoginCompressionS2CPacket", + "side": "clientbound", + "state": "login", + "id": 3 + }, + { + "name": "LoginQueryRequestS2CPacket", + "side": "clientbound", + "state": "login", + "id": 4 + } +] \ No newline at end of file diff --git a/vendor/valence/crates/valence_generated/extracted/sounds.json b/vendor/valence/crates/valence_generated/extracted/sounds.json new file mode 100644 index 00000000..1d629580 --- /dev/null +++ b/vendor/valence/crates/valence_generated/extracted/sounds.json @@ -0,0 +1,5898 @@ +[ + { + "id": 0, + "name": "entity.allay.ambient_with_item" + }, + { + "id": 1, + "name": "entity.allay.ambient_without_item" + }, + { + "id": 2, + "name": "entity.allay.death" + }, + { + "id": 3, + "name": "entity.allay.hurt" + }, + { + "id": 4, + "name": "entity.allay.item_given" + }, + { + "id": 5, + "name": "entity.allay.item_taken" + }, + { + "id": 6, + "name": "entity.allay.item_thrown" + }, + { + "id": 7, + "name": "ambient.cave" + }, + { + "id": 8, + "name": "ambient.basalt_deltas.additions" + }, + { + "id": 9, + "name": "ambient.basalt_deltas.loop" + }, + { + "id": 10, + "name": "ambient.basalt_deltas.mood" + }, + { + "id": 11, + "name": "ambient.crimson_forest.additions" + }, + { + "id": 12, + "name": "ambient.crimson_forest.loop" + }, + { + "id": 13, + "name": "ambient.crimson_forest.mood" + }, + { + "id": 14, + "name": "ambient.nether_wastes.additions" + }, + { + "id": 15, + "name": "ambient.nether_wastes.loop" + }, + { + "id": 16, + "name": "ambient.nether_wastes.mood" + }, + { + "id": 17, + "name": "ambient.soul_sand_valley.additions" + }, + { + "id": 18, + "name": "ambient.soul_sand_valley.loop" + }, + { + "id": 19, + "name": "ambient.soul_sand_valley.mood" + }, + { + "id": 20, + "name": "ambient.warped_forest.additions" + }, + { + "id": 21, + "name": "ambient.warped_forest.loop" + }, + { + "id": 22, + "name": "ambient.warped_forest.mood" + }, + { + "id": 23, + "name": "ambient.underwater.enter" + }, + { + "id": 24, + "name": "ambient.underwater.exit" + }, + { + "id": 25, + "name": "ambient.underwater.loop" + }, + { + "id": 26, + "name": "ambient.underwater.loop.additions" + }, + { + "id": 27, + "name": "ambient.underwater.loop.additions.rare" + }, + { + "id": 28, + "name": "ambient.underwater.loop.additions.ultra_rare" + }, + { + "id": 29, + "name": "block.amethyst_block.break" + }, + { + "id": 30, + "name": "block.amethyst_block.chime" + }, + { + "id": 31, + "name": "block.amethyst_block.fall" + }, + { + "id": 32, + "name": "block.amethyst_block.hit" + }, + { + "id": 33, + "name": "block.amethyst_block.place" + }, + { + "id": 34, + "name": "block.amethyst_block.resonate" + }, + { + "id": 35, + "name": "block.amethyst_block.step" + }, + { + "id": 36, + "name": "block.amethyst_cluster.break" + }, + { + "id": 37, + "name": "block.amethyst_cluster.fall" + }, + { + "id": 38, + "name": "block.amethyst_cluster.hit" + }, + { + "id": 39, + "name": "block.amethyst_cluster.place" + }, + { + "id": 40, + "name": "block.amethyst_cluster.step" + }, + { + "id": 41, + "name": "block.ancient_debris.break" + }, + { + "id": 42, + "name": "block.ancient_debris.step" + }, + { + "id": 43, + "name": "block.ancient_debris.place" + }, + { + "id": 44, + "name": "block.ancient_debris.hit" + }, + { + "id": 45, + "name": "block.ancient_debris.fall" + }, + { + "id": 46, + "name": "block.anvil.break" + }, + { + "id": 47, + "name": "block.anvil.destroy" + }, + { + "id": 48, + "name": "block.anvil.fall" + }, + { + "id": 49, + "name": "block.anvil.hit" + }, + { + "id": 50, + "name": "block.anvil.land" + }, + { + "id": 51, + "name": "block.anvil.place" + }, + { + "id": 52, + "name": "block.anvil.step" + }, + { + "id": 53, + "name": "block.anvil.use" + }, + { + "id": 54, + "name": "item.armor.equip_chain" + }, + { + "id": 55, + "name": "item.armor.equip_diamond" + }, + { + "id": 56, + "name": "item.armor.equip_elytra" + }, + { + "id": 57, + "name": "item.armor.equip_generic" + }, + { + "id": 58, + "name": "item.armor.equip_gold" + }, + { + "id": 59, + "name": "item.armor.equip_iron" + }, + { + "id": 60, + "name": "item.armor.equip_leather" + }, + { + "id": 61, + "name": "item.armor.equip_netherite" + }, + { + "id": 62, + "name": "item.armor.equip_turtle" + }, + { + "id": 63, + "name": "entity.armor_stand.break" + }, + { + "id": 64, + "name": "entity.armor_stand.fall" + }, + { + "id": 65, + "name": "entity.armor_stand.hit" + }, + { + "id": 66, + "name": "entity.armor_stand.place" + }, + { + "id": 67, + "name": "entity.arrow.hit" + }, + { + "id": 68, + "name": "entity.arrow.hit_player" + }, + { + "id": 69, + "name": "entity.arrow.shoot" + }, + { + "id": 70, + "name": "item.axe.strip" + }, + { + "id": 71, + "name": "item.axe.scrape" + }, + { + "id": 72, + "name": "item.axe.wax_off" + }, + { + "id": 73, + "name": "entity.axolotl.attack" + }, + { + "id": 74, + "name": "entity.axolotl.death" + }, + { + "id": 75, + "name": "entity.axolotl.hurt" + }, + { + "id": 76, + "name": "entity.axolotl.idle_air" + }, + { + "id": 77, + "name": "entity.axolotl.idle_water" + }, + { + "id": 78, + "name": "entity.axolotl.splash" + }, + { + "id": 79, + "name": "entity.axolotl.swim" + }, + { + "id": 80, + "name": "block.azalea.break" + }, + { + "id": 81, + "name": "block.azalea.fall" + }, + { + "id": 82, + "name": "block.azalea.hit" + }, + { + "id": 83, + "name": "block.azalea.place" + }, + { + "id": 84, + "name": "block.azalea.step" + }, + { + "id": 85, + "name": "block.azalea_leaves.break" + }, + { + "id": 86, + "name": "block.azalea_leaves.fall" + }, + { + "id": 87, + "name": "block.azalea_leaves.hit" + }, + { + "id": 88, + "name": "block.azalea_leaves.place" + }, + { + "id": 89, + "name": "block.azalea_leaves.step" + }, + { + "id": 90, + "name": "block.bamboo.break" + }, + { + "id": 91, + "name": "block.bamboo.fall" + }, + { + "id": 92, + "name": "block.bamboo.hit" + }, + { + "id": 93, + "name": "block.bamboo.place" + }, + { + "id": 94, + "name": "block.bamboo.step" + }, + { + "id": 95, + "name": "block.bamboo_sapling.break" + }, + { + "id": 96, + "name": "block.bamboo_sapling.hit" + }, + { + "id": 97, + "name": "block.bamboo_sapling.place" + }, + { + "id": 98, + "name": "block.bamboo_wood.break" + }, + { + "id": 99, + "name": "block.bamboo_wood.fall" + }, + { + "id": 100, + "name": "block.bamboo_wood.hit" + }, + { + "id": 101, + "name": "block.bamboo_wood.place" + }, + { + "id": 102, + "name": "block.bamboo_wood.step" + }, + { + "id": 103, + "name": "block.bamboo_wood_door.close" + }, + { + "id": 104, + "name": "block.bamboo_wood_door.open" + }, + { + "id": 105, + "name": "block.bamboo_wood_trapdoor.close" + }, + { + "id": 106, + "name": "block.bamboo_wood_trapdoor.open" + }, + { + "id": 107, + "name": "block.bamboo_wood_button.click_off" + }, + { + "id": 108, + "name": "block.bamboo_wood_button.click_on" + }, + { + "id": 109, + "name": "block.bamboo_wood_pressure_plate.click_off" + }, + { + "id": 110, + "name": "block.bamboo_wood_pressure_plate.click_on" + }, + { + "id": 111, + "name": "block.bamboo_wood_fence_gate.close" + }, + { + "id": 112, + "name": "block.bamboo_wood_fence_gate.open" + }, + { + "id": 113, + "name": "block.barrel.close" + }, + { + "id": 114, + "name": "block.barrel.open" + }, + { + "id": 115, + "name": "block.basalt.break" + }, + { + "id": 116, + "name": "block.basalt.step" + }, + { + "id": 117, + "name": "block.basalt.place" + }, + { + "id": 118, + "name": "block.basalt.hit" + }, + { + "id": 119, + "name": "block.basalt.fall" + }, + { + "id": 120, + "name": "entity.bat.ambient" + }, + { + "id": 121, + "name": "entity.bat.death" + }, + { + "id": 122, + "name": "entity.bat.hurt" + }, + { + "id": 123, + "name": "entity.bat.loop" + }, + { + "id": 124, + "name": "entity.bat.takeoff" + }, + { + "id": 125, + "name": "block.beacon.activate" + }, + { + "id": 126, + "name": "block.beacon.ambient" + }, + { + "id": 127, + "name": "block.beacon.deactivate" + }, + { + "id": 128, + "name": "block.beacon.power_select" + }, + { + "id": 129, + "name": "entity.bee.death" + }, + { + "id": 130, + "name": "entity.bee.hurt" + }, + { + "id": 131, + "name": "entity.bee.loop_aggressive" + }, + { + "id": 132, + "name": "entity.bee.loop" + }, + { + "id": 133, + "name": "entity.bee.sting" + }, + { + "id": 134, + "name": "entity.bee.pollinate" + }, + { + "id": 135, + "name": "block.beehive.drip" + }, + { + "id": 136, + "name": "block.beehive.enter" + }, + { + "id": 137, + "name": "block.beehive.exit" + }, + { + "id": 138, + "name": "block.beehive.shear" + }, + { + "id": 139, + "name": "block.beehive.work" + }, + { + "id": 140, + "name": "block.bell.use" + }, + { + "id": 141, + "name": "block.bell.resonate" + }, + { + "id": 142, + "name": "block.big_dripleaf.break" + }, + { + "id": 143, + "name": "block.big_dripleaf.fall" + }, + { + "id": 144, + "name": "block.big_dripleaf.hit" + }, + { + "id": 145, + "name": "block.big_dripleaf.place" + }, + { + "id": 146, + "name": "block.big_dripleaf.step" + }, + { + "id": 147, + "name": "entity.blaze.ambient" + }, + { + "id": 148, + "name": "entity.blaze.burn" + }, + { + "id": 149, + "name": "entity.blaze.death" + }, + { + "id": 150, + "name": "entity.blaze.hurt" + }, + { + "id": 151, + "name": "entity.blaze.shoot" + }, + { + "id": 152, + "name": "entity.boat.paddle_land" + }, + { + "id": 153, + "name": "entity.boat.paddle_water" + }, + { + "id": 154, + "name": "block.bone_block.break" + }, + { + "id": 155, + "name": "block.bone_block.fall" + }, + { + "id": 156, + "name": "block.bone_block.hit" + }, + { + "id": 157, + "name": "block.bone_block.place" + }, + { + "id": 158, + "name": "block.bone_block.step" + }, + { + "id": 159, + "name": "item.bone_meal.use" + }, + { + "id": 160, + "name": "item.book.page_turn" + }, + { + "id": 161, + "name": "item.book.put" + }, + { + "id": 162, + "name": "block.blastfurnace.fire_crackle" + }, + { + "id": 163, + "name": "item.bottle.empty" + }, + { + "id": 164, + "name": "item.bottle.fill" + }, + { + "id": 165, + "name": "item.bottle.fill_dragonbreath" + }, + { + "id": 166, + "name": "block.brewing_stand.brew" + }, + { + "id": 167, + "name": "item.brush.brushing.generic" + }, + { + "id": 168, + "name": "item.brush.brushing.sand" + }, + { + "id": 169, + "name": "item.brush.brushing.gravel" + }, + { + "id": 170, + "name": "item.brush.brushing.sand.complete" + }, + { + "id": 171, + "name": "item.brush.brushing.gravel.complete" + }, + { + "id": 172, + "name": "block.bubble_column.bubble_pop" + }, + { + "id": 173, + "name": "block.bubble_column.upwards_ambient" + }, + { + "id": 174, + "name": "block.bubble_column.upwards_inside" + }, + { + "id": 175, + "name": "block.bubble_column.whirlpool_ambient" + }, + { + "id": 176, + "name": "block.bubble_column.whirlpool_inside" + }, + { + "id": 177, + "name": "item.bucket.empty" + }, + { + "id": 178, + "name": "item.bucket.empty_axolotl" + }, + { + "id": 179, + "name": "item.bucket.empty_fish" + }, + { + "id": 180, + "name": "item.bucket.empty_lava" + }, + { + "id": 181, + "name": "item.bucket.empty_powder_snow" + }, + { + "id": 182, + "name": "item.bucket.empty_tadpole" + }, + { + "id": 183, + "name": "item.bucket.fill" + }, + { + "id": 184, + "name": "item.bucket.fill_axolotl" + }, + { + "id": 185, + "name": "item.bucket.fill_fish" + }, + { + "id": 186, + "name": "item.bucket.fill_lava" + }, + { + "id": 187, + "name": "item.bucket.fill_powder_snow" + }, + { + "id": 188, + "name": "item.bucket.fill_tadpole" + }, + { + "id": 189, + "name": "item.bundle.drop_contents" + }, + { + "id": 190, + "name": "item.bundle.insert" + }, + { + "id": 191, + "name": "item.bundle.remove_one" + }, + { + "id": 192, + "name": "block.cake.add_candle" + }, + { + "id": 193, + "name": "block.calcite.break" + }, + { + "id": 194, + "name": "block.calcite.step" + }, + { + "id": 195, + "name": "block.calcite.place" + }, + { + "id": 196, + "name": "block.calcite.hit" + }, + { + "id": 197, + "name": "block.calcite.fall" + }, + { + "id": 198, + "name": "entity.camel.ambient" + }, + { + "id": 199, + "name": "entity.camel.dash" + }, + { + "id": 200, + "name": "entity.camel.dash_ready" + }, + { + "id": 201, + "name": "entity.camel.death" + }, + { + "id": 202, + "name": "entity.camel.eat" + }, + { + "id": 203, + "name": "entity.camel.hurt" + }, + { + "id": 204, + "name": "entity.camel.saddle" + }, + { + "id": 205, + "name": "entity.camel.sit" + }, + { + "id": 206, + "name": "entity.camel.stand" + }, + { + "id": 207, + "name": "entity.camel.step" + }, + { + "id": 208, + "name": "entity.camel.step_sand" + }, + { + "id": 209, + "name": "block.campfire.crackle" + }, + { + "id": 210, + "name": "block.candle.ambient" + }, + { + "id": 211, + "name": "block.candle.break" + }, + { + "id": 212, + "name": "block.candle.extinguish" + }, + { + "id": 213, + "name": "block.candle.fall" + }, + { + "id": 214, + "name": "block.candle.hit" + }, + { + "id": 215, + "name": "block.candle.place" + }, + { + "id": 216, + "name": "block.candle.step" + }, + { + "id": 217, + "name": "entity.cat.ambient" + }, + { + "id": 218, + "name": "entity.cat.stray_ambient" + }, + { + "id": 219, + "name": "entity.cat.death" + }, + { + "id": 220, + "name": "entity.cat.eat" + }, + { + "id": 221, + "name": "entity.cat.hiss" + }, + { + "id": 222, + "name": "entity.cat.beg_for_food" + }, + { + "id": 223, + "name": "entity.cat.hurt" + }, + { + "id": 224, + "name": "entity.cat.purr" + }, + { + "id": 225, + "name": "entity.cat.purreow" + }, + { + "id": 226, + "name": "block.cave_vines.break" + }, + { + "id": 227, + "name": "block.cave_vines.fall" + }, + { + "id": 228, + "name": "block.cave_vines.hit" + }, + { + "id": 229, + "name": "block.cave_vines.place" + }, + { + "id": 230, + "name": "block.cave_vines.step" + }, + { + "id": 231, + "name": "block.cave_vines.pick_berries" + }, + { + "id": 232, + "name": "block.chain.break" + }, + { + "id": 233, + "name": "block.chain.fall" + }, + { + "id": 234, + "name": "block.chain.hit" + }, + { + "id": 235, + "name": "block.chain.place" + }, + { + "id": 236, + "name": "block.chain.step" + }, + { + "id": 237, + "name": "block.cherry_wood.break" + }, + { + "id": 238, + "name": "block.cherry_wood.fall" + }, + { + "id": 239, + "name": "block.cherry_wood.hit" + }, + { + "id": 240, + "name": "block.cherry_wood.place" + }, + { + "id": 241, + "name": "block.cherry_wood.step" + }, + { + "id": 242, + "name": "block.cherry_sapling.break" + }, + { + "id": 243, + "name": "block.cherry_sapling.fall" + }, + { + "id": 244, + "name": "block.cherry_sapling.hit" + }, + { + "id": 245, + "name": "block.cherry_sapling.place" + }, + { + "id": 246, + "name": "block.cherry_sapling.step" + }, + { + "id": 247, + "name": "block.cherry_leaves.break" + }, + { + "id": 248, + "name": "block.cherry_leaves.fall" + }, + { + "id": 249, + "name": "block.cherry_leaves.hit" + }, + { + "id": 250, + "name": "block.cherry_leaves.place" + }, + { + "id": 251, + "name": "block.cherry_leaves.step" + }, + { + "id": 252, + "name": "block.cherry_wood_hanging_sign.step" + }, + { + "id": 253, + "name": "block.cherry_wood_hanging_sign.break" + }, + { + "id": 254, + "name": "block.cherry_wood_hanging_sign.fall" + }, + { + "id": 255, + "name": "block.cherry_wood_hanging_sign.hit" + }, + { + "id": 256, + "name": "block.cherry_wood_hanging_sign.place" + }, + { + "id": 257, + "name": "block.cherry_wood_door.close" + }, + { + "id": 258, + "name": "block.cherry_wood_door.open" + }, + { + "id": 259, + "name": "block.cherry_wood_trapdoor.close" + }, + { + "id": 260, + "name": "block.cherry_wood_trapdoor.open" + }, + { + "id": 261, + "name": "block.cherry_wood_button.click_off" + }, + { + "id": 262, + "name": "block.cherry_wood_button.click_on" + }, + { + "id": 263, + "name": "block.cherry_wood_pressure_plate.click_off" + }, + { + "id": 264, + "name": "block.cherry_wood_pressure_plate.click_on" + }, + { + "id": 265, + "name": "block.cherry_wood_fence_gate.close" + }, + { + "id": 266, + "name": "block.cherry_wood_fence_gate.open" + }, + { + "id": 267, + "name": "block.chest.close" + }, + { + "id": 268, + "name": "block.chest.locked" + }, + { + "id": 269, + "name": "block.chest.open" + }, + { + "id": 270, + "name": "entity.chicken.ambient" + }, + { + "id": 271, + "name": "entity.chicken.death" + }, + { + "id": 272, + "name": "entity.chicken.egg" + }, + { + "id": 273, + "name": "entity.chicken.hurt" + }, + { + "id": 274, + "name": "entity.chicken.step" + }, + { + "id": 275, + "name": "block.chiseled_bookshelf.break" + }, + { + "id": 276, + "name": "block.chiseled_bookshelf.fall" + }, + { + "id": 277, + "name": "block.chiseled_bookshelf.hit" + }, + { + "id": 278, + "name": "block.chiseled_bookshelf.insert" + }, + { + "id": 279, + "name": "block.chiseled_bookshelf.insert.enchanted" + }, + { + "id": 280, + "name": "block.chiseled_bookshelf.step" + }, + { + "id": 281, + "name": "block.chiseled_bookshelf.pickup" + }, + { + "id": 282, + "name": "block.chiseled_bookshelf.pickup.enchanted" + }, + { + "id": 283, + "name": "block.chiseled_bookshelf.place" + }, + { + "id": 284, + "name": "block.chorus_flower.death" + }, + { + "id": 285, + "name": "block.chorus_flower.grow" + }, + { + "id": 286, + "name": "item.chorus_fruit.teleport" + }, + { + "id": 287, + "name": "entity.cod.ambient" + }, + { + "id": 288, + "name": "entity.cod.death" + }, + { + "id": 289, + "name": "entity.cod.flop" + }, + { + "id": 290, + "name": "entity.cod.hurt" + }, + { + "id": 291, + "name": "block.comparator.click" + }, + { + "id": 292, + "name": "block.composter.empty" + }, + { + "id": 293, + "name": "block.composter.fill" + }, + { + "id": 294, + "name": "block.composter.fill_success" + }, + { + "id": 295, + "name": "block.composter.ready" + }, + { + "id": 296, + "name": "block.conduit.activate" + }, + { + "id": 297, + "name": "block.conduit.ambient" + }, + { + "id": 298, + "name": "block.conduit.ambient.short" + }, + { + "id": 299, + "name": "block.conduit.attack.target" + }, + { + "id": 300, + "name": "block.conduit.deactivate" + }, + { + "id": 301, + "name": "block.copper.break" + }, + { + "id": 302, + "name": "block.copper.step" + }, + { + "id": 303, + "name": "block.copper.place" + }, + { + "id": 304, + "name": "block.copper.hit" + }, + { + "id": 305, + "name": "block.copper.fall" + }, + { + "id": 306, + "name": "block.coral_block.break" + }, + { + "id": 307, + "name": "block.coral_block.fall" + }, + { + "id": 308, + "name": "block.coral_block.hit" + }, + { + "id": 309, + "name": "block.coral_block.place" + }, + { + "id": 310, + "name": "block.coral_block.step" + }, + { + "id": 311, + "name": "entity.cow.ambient" + }, + { + "id": 312, + "name": "entity.cow.death" + }, + { + "id": 313, + "name": "entity.cow.hurt" + }, + { + "id": 314, + "name": "entity.cow.milk" + }, + { + "id": 315, + "name": "entity.cow.step" + }, + { + "id": 316, + "name": "entity.creeper.death" + }, + { + "id": 317, + "name": "entity.creeper.hurt" + }, + { + "id": 318, + "name": "entity.creeper.primed" + }, + { + "id": 319, + "name": "block.crop.break" + }, + { + "id": 320, + "name": "item.crop.plant" + }, + { + "id": 321, + "name": "item.crossbow.hit" + }, + { + "id": 322, + "name": "item.crossbow.loading_end" + }, + { + "id": 323, + "name": "item.crossbow.loading_middle" + }, + { + "id": 324, + "name": "item.crossbow.loading_start" + }, + { + "id": 325, + "name": "item.crossbow.quick_charge_1" + }, + { + "id": 326, + "name": "item.crossbow.quick_charge_2" + }, + { + "id": 327, + "name": "item.crossbow.quick_charge_3" + }, + { + "id": 328, + "name": "item.crossbow.shoot" + }, + { + "id": 329, + "name": "block.decorated_pot.break" + }, + { + "id": 330, + "name": "block.decorated_pot.fall" + }, + { + "id": 331, + "name": "block.decorated_pot.hit" + }, + { + "id": 332, + "name": "block.decorated_pot.step" + }, + { + "id": 333, + "name": "block.decorated_pot.place" + }, + { + "id": 334, + "name": "block.decorated_pot.shatter" + }, + { + "id": 335, + "name": "block.deepslate_bricks.break" + }, + { + "id": 336, + "name": "block.deepslate_bricks.fall" + }, + { + "id": 337, + "name": "block.deepslate_bricks.hit" + }, + { + "id": 338, + "name": "block.deepslate_bricks.place" + }, + { + "id": 339, + "name": "block.deepslate_bricks.step" + }, + { + "id": 340, + "name": "block.deepslate.break" + }, + { + "id": 341, + "name": "block.deepslate.fall" + }, + { + "id": 342, + "name": "block.deepslate.hit" + }, + { + "id": 343, + "name": "block.deepslate.place" + }, + { + "id": 344, + "name": "block.deepslate.step" + }, + { + "id": 345, + "name": "block.deepslate_tiles.break" + }, + { + "id": 346, + "name": "block.deepslate_tiles.fall" + }, + { + "id": 347, + "name": "block.deepslate_tiles.hit" + }, + { + "id": 348, + "name": "block.deepslate_tiles.place" + }, + { + "id": 349, + "name": "block.deepslate_tiles.step" + }, + { + "id": 350, + "name": "block.dispenser.dispense" + }, + { + "id": 351, + "name": "block.dispenser.fail" + }, + { + "id": 352, + "name": "block.dispenser.launch" + }, + { + "id": 353, + "name": "entity.dolphin.ambient" + }, + { + "id": 354, + "name": "entity.dolphin.ambient_water" + }, + { + "id": 355, + "name": "entity.dolphin.attack" + }, + { + "id": 356, + "name": "entity.dolphin.death" + }, + { + "id": 357, + "name": "entity.dolphin.eat" + }, + { + "id": 358, + "name": "entity.dolphin.hurt" + }, + { + "id": 359, + "name": "entity.dolphin.jump" + }, + { + "id": 360, + "name": "entity.dolphin.play" + }, + { + "id": 361, + "name": "entity.dolphin.splash" + }, + { + "id": 362, + "name": "entity.dolphin.swim" + }, + { + "id": 363, + "name": "entity.donkey.ambient" + }, + { + "id": 364, + "name": "entity.donkey.angry" + }, + { + "id": 365, + "name": "entity.donkey.chest" + }, + { + "id": 366, + "name": "entity.donkey.death" + }, + { + "id": 367, + "name": "entity.donkey.eat" + }, + { + "id": 368, + "name": "entity.donkey.hurt" + }, + { + "id": 369, + "name": "block.dripstone_block.break" + }, + { + "id": 370, + "name": "block.dripstone_block.step" + }, + { + "id": 371, + "name": "block.dripstone_block.place" + }, + { + "id": 372, + "name": "block.dripstone_block.hit" + }, + { + "id": 373, + "name": "block.dripstone_block.fall" + }, + { + "id": 374, + "name": "block.pointed_dripstone.break" + }, + { + "id": 375, + "name": "block.pointed_dripstone.step" + }, + { + "id": 376, + "name": "block.pointed_dripstone.place" + }, + { + "id": 377, + "name": "block.pointed_dripstone.hit" + }, + { + "id": 378, + "name": "block.pointed_dripstone.fall" + }, + { + "id": 379, + "name": "block.pointed_dripstone.land" + }, + { + "id": 380, + "name": "block.pointed_dripstone.drip_lava" + }, + { + "id": 381, + "name": "block.pointed_dripstone.drip_water" + }, + { + "id": 382, + "name": "block.pointed_dripstone.drip_lava_into_cauldron" + }, + { + "id": 383, + "name": "block.pointed_dripstone.drip_water_into_cauldron" + }, + { + "id": 384, + "name": "block.big_dripleaf.tilt_down" + }, + { + "id": 385, + "name": "block.big_dripleaf.tilt_up" + }, + { + "id": 386, + "name": "entity.drowned.ambient" + }, + { + "id": 387, + "name": "entity.drowned.ambient_water" + }, + { + "id": 388, + "name": "entity.drowned.death" + }, + { + "id": 389, + "name": "entity.drowned.death_water" + }, + { + "id": 390, + "name": "entity.drowned.hurt" + }, + { + "id": 391, + "name": "entity.drowned.hurt_water" + }, + { + "id": 392, + "name": "entity.drowned.shoot" + }, + { + "id": 393, + "name": "entity.drowned.step" + }, + { + "id": 394, + "name": "entity.drowned.swim" + }, + { + "id": 395, + "name": "item.dye.use" + }, + { + "id": 396, + "name": "entity.egg.throw" + }, + { + "id": 397, + "name": "entity.elder_guardian.ambient" + }, + { + "id": 398, + "name": "entity.elder_guardian.ambient_land" + }, + { + "id": 399, + "name": "entity.elder_guardian.curse" + }, + { + "id": 400, + "name": "entity.elder_guardian.death" + }, + { + "id": 401, + "name": "entity.elder_guardian.death_land" + }, + { + "id": 402, + "name": "entity.elder_guardian.flop" + }, + { + "id": 403, + "name": "entity.elder_guardian.hurt" + }, + { + "id": 404, + "name": "entity.elder_guardian.hurt_land" + }, + { + "id": 405, + "name": "item.elytra.flying" + }, + { + "id": 406, + "name": "block.enchantment_table.use" + }, + { + "id": 407, + "name": "block.ender_chest.close" + }, + { + "id": 408, + "name": "block.ender_chest.open" + }, + { + "id": 409, + "name": "entity.ender_dragon.ambient" + }, + { + "id": 410, + "name": "entity.ender_dragon.death" + }, + { + "id": 411, + "name": "entity.dragon_fireball.explode" + }, + { + "id": 412, + "name": "entity.ender_dragon.flap" + }, + { + "id": 413, + "name": "entity.ender_dragon.growl" + }, + { + "id": 414, + "name": "entity.ender_dragon.hurt" + }, + { + "id": 415, + "name": "entity.ender_dragon.shoot" + }, + { + "id": 416, + "name": "entity.ender_eye.death" + }, + { + "id": 417, + "name": "entity.ender_eye.launch" + }, + { + "id": 418, + "name": "entity.enderman.ambient" + }, + { + "id": 419, + "name": "entity.enderman.death" + }, + { + "id": 420, + "name": "entity.enderman.hurt" + }, + { + "id": 421, + "name": "entity.enderman.scream" + }, + { + "id": 422, + "name": "entity.enderman.stare" + }, + { + "id": 423, + "name": "entity.enderman.teleport" + }, + { + "id": 424, + "name": "entity.endermite.ambient" + }, + { + "id": 425, + "name": "entity.endermite.death" + }, + { + "id": 426, + "name": "entity.endermite.hurt" + }, + { + "id": 427, + "name": "entity.endermite.step" + }, + { + "id": 428, + "name": "entity.ender_pearl.throw" + }, + { + "id": 429, + "name": "block.end_gateway.spawn" + }, + { + "id": 430, + "name": "block.end_portal_frame.fill" + }, + { + "id": 431, + "name": "block.end_portal.spawn" + }, + { + "id": 432, + "name": "entity.evoker.ambient" + }, + { + "id": 433, + "name": "entity.evoker.cast_spell" + }, + { + "id": 434, + "name": "entity.evoker.celebrate" + }, + { + "id": 435, + "name": "entity.evoker.death" + }, + { + "id": 436, + "name": "entity.evoker_fangs.attack" + }, + { + "id": 437, + "name": "entity.evoker.hurt" + }, + { + "id": 438, + "name": "entity.evoker.prepare_attack" + }, + { + "id": 439, + "name": "entity.evoker.prepare_summon" + }, + { + "id": 440, + "name": "entity.evoker.prepare_wololo" + }, + { + "id": 441, + "name": "entity.experience_bottle.throw" + }, + { + "id": 442, + "name": "entity.experience_orb.pickup" + }, + { + "id": 443, + "name": "block.fence_gate.close" + }, + { + "id": 444, + "name": "block.fence_gate.open" + }, + { + "id": 445, + "name": "item.firecharge.use" + }, + { + "id": 446, + "name": "entity.firework_rocket.blast" + }, + { + "id": 447, + "name": "entity.firework_rocket.blast_far" + }, + { + "id": 448, + "name": "entity.firework_rocket.large_blast" + }, + { + "id": 449, + "name": "entity.firework_rocket.large_blast_far" + }, + { + "id": 450, + "name": "entity.firework_rocket.launch" + }, + { + "id": 451, + "name": "entity.firework_rocket.shoot" + }, + { + "id": 452, + "name": "entity.firework_rocket.twinkle" + }, + { + "id": 453, + "name": "entity.firework_rocket.twinkle_far" + }, + { + "id": 454, + "name": "block.fire.ambient" + }, + { + "id": 455, + "name": "block.fire.extinguish" + }, + { + "id": 456, + "name": "entity.fish.swim" + }, + { + "id": 457, + "name": "entity.fishing_bobber.retrieve" + }, + { + "id": 458, + "name": "entity.fishing_bobber.splash" + }, + { + "id": 459, + "name": "entity.fishing_bobber.throw" + }, + { + "id": 460, + "name": "item.flintandsteel.use" + }, + { + "id": 461, + "name": "block.flowering_azalea.break" + }, + { + "id": 462, + "name": "block.flowering_azalea.fall" + }, + { + "id": 463, + "name": "block.flowering_azalea.hit" + }, + { + "id": 464, + "name": "block.flowering_azalea.place" + }, + { + "id": 465, + "name": "block.flowering_azalea.step" + }, + { + "id": 466, + "name": "entity.fox.aggro" + }, + { + "id": 467, + "name": "entity.fox.ambient" + }, + { + "id": 468, + "name": "entity.fox.bite" + }, + { + "id": 469, + "name": "entity.fox.death" + }, + { + "id": 470, + "name": "entity.fox.eat" + }, + { + "id": 471, + "name": "entity.fox.hurt" + }, + { + "id": 472, + "name": "entity.fox.screech" + }, + { + "id": 473, + "name": "entity.fox.sleep" + }, + { + "id": 474, + "name": "entity.fox.sniff" + }, + { + "id": 475, + "name": "entity.fox.spit" + }, + { + "id": 476, + "name": "entity.fox.teleport" + }, + { + "id": 477, + "name": "block.suspicious_sand.break" + }, + { + "id": 478, + "name": "block.suspicious_sand.step" + }, + { + "id": 479, + "name": "block.suspicious_sand.place" + }, + { + "id": 480, + "name": "block.suspicious_sand.hit" + }, + { + "id": 481, + "name": "block.suspicious_sand.fall" + }, + { + "id": 482, + "name": "block.suspicious_gravel.break" + }, + { + "id": 483, + "name": "block.suspicious_gravel.step" + }, + { + "id": 484, + "name": "block.suspicious_gravel.place" + }, + { + "id": 485, + "name": "block.suspicious_gravel.hit" + }, + { + "id": 486, + "name": "block.suspicious_gravel.fall" + }, + { + "id": 487, + "name": "block.froglight.break" + }, + { + "id": 488, + "name": "block.froglight.fall" + }, + { + "id": 489, + "name": "block.froglight.hit" + }, + { + "id": 490, + "name": "block.froglight.place" + }, + { + "id": 491, + "name": "block.froglight.step" + }, + { + "id": 492, + "name": "block.frogspawn.step" + }, + { + "id": 493, + "name": "block.frogspawn.break" + }, + { + "id": 494, + "name": "block.frogspawn.fall" + }, + { + "id": 495, + "name": "block.frogspawn.hatch" + }, + { + "id": 496, + "name": "block.frogspawn.hit" + }, + { + "id": 497, + "name": "block.frogspawn.place" + }, + { + "id": 498, + "name": "entity.frog.ambient" + }, + { + "id": 499, + "name": "entity.frog.death" + }, + { + "id": 500, + "name": "entity.frog.eat" + }, + { + "id": 501, + "name": "entity.frog.hurt" + }, + { + "id": 502, + "name": "entity.frog.lay_spawn" + }, + { + "id": 503, + "name": "entity.frog.long_jump" + }, + { + "id": 504, + "name": "entity.frog.step" + }, + { + "id": 505, + "name": "entity.frog.tongue" + }, + { + "id": 506, + "name": "block.roots.break" + }, + { + "id": 507, + "name": "block.roots.step" + }, + { + "id": 508, + "name": "block.roots.place" + }, + { + "id": 509, + "name": "block.roots.hit" + }, + { + "id": 510, + "name": "block.roots.fall" + }, + { + "id": 511, + "name": "block.furnace.fire_crackle" + }, + { + "id": 512, + "name": "entity.generic.big_fall" + }, + { + "id": 513, + "name": "entity.generic.burn" + }, + { + "id": 514, + "name": "entity.generic.death" + }, + { + "id": 515, + "name": "entity.generic.drink" + }, + { + "id": 516, + "name": "entity.generic.eat" + }, + { + "id": 517, + "name": "entity.generic.explode" + }, + { + "id": 518, + "name": "entity.generic.extinguish_fire" + }, + { + "id": 519, + "name": "entity.generic.hurt" + }, + { + "id": 520, + "name": "entity.generic.small_fall" + }, + { + "id": 521, + "name": "entity.generic.splash" + }, + { + "id": 522, + "name": "entity.generic.swim" + }, + { + "id": 523, + "name": "entity.ghast.ambient" + }, + { + "id": 524, + "name": "entity.ghast.death" + }, + { + "id": 525, + "name": "entity.ghast.hurt" + }, + { + "id": 526, + "name": "entity.ghast.scream" + }, + { + "id": 527, + "name": "entity.ghast.shoot" + }, + { + "id": 528, + "name": "entity.ghast.warn" + }, + { + "id": 529, + "name": "block.gilded_blackstone.break" + }, + { + "id": 530, + "name": "block.gilded_blackstone.fall" + }, + { + "id": 531, + "name": "block.gilded_blackstone.hit" + }, + { + "id": 532, + "name": "block.gilded_blackstone.place" + }, + { + "id": 533, + "name": "block.gilded_blackstone.step" + }, + { + "id": 534, + "name": "block.glass.break" + }, + { + "id": 535, + "name": "block.glass.fall" + }, + { + "id": 536, + "name": "block.glass.hit" + }, + { + "id": 537, + "name": "block.glass.place" + }, + { + "id": 538, + "name": "block.glass.step" + }, + { + "id": 539, + "name": "item.glow_ink_sac.use" + }, + { + "id": 540, + "name": "entity.glow_item_frame.add_item" + }, + { + "id": 541, + "name": "entity.glow_item_frame.break" + }, + { + "id": 542, + "name": "entity.glow_item_frame.place" + }, + { + "id": 543, + "name": "entity.glow_item_frame.remove_item" + }, + { + "id": 544, + "name": "entity.glow_item_frame.rotate_item" + }, + { + "id": 545, + "name": "entity.glow_squid.ambient" + }, + { + "id": 546, + "name": "entity.glow_squid.death" + }, + { + "id": 547, + "name": "entity.glow_squid.hurt" + }, + { + "id": 548, + "name": "entity.glow_squid.squirt" + }, + { + "id": 549, + "name": "entity.goat.ambient" + }, + { + "id": 550, + "name": "entity.goat.death" + }, + { + "id": 551, + "name": "entity.goat.eat" + }, + { + "id": 552, + "name": "entity.goat.hurt" + }, + { + "id": 553, + "name": "entity.goat.long_jump" + }, + { + "id": 554, + "name": "entity.goat.milk" + }, + { + "id": 555, + "name": "entity.goat.prepare_ram" + }, + { + "id": 556, + "name": "entity.goat.ram_impact" + }, + { + "id": 557, + "name": "entity.goat.horn_break" + }, + { + "id": 558, + "name": "item.goat_horn.play" + }, + { + "id": 559, + "name": "entity.goat.screaming.ambient" + }, + { + "id": 560, + "name": "entity.goat.screaming.death" + }, + { + "id": 561, + "name": "entity.goat.screaming.eat" + }, + { + "id": 562, + "name": "entity.goat.screaming.hurt" + }, + { + "id": 563, + "name": "entity.goat.screaming.long_jump" + }, + { + "id": 564, + "name": "entity.goat.screaming.milk" + }, + { + "id": 565, + "name": "entity.goat.screaming.prepare_ram" + }, + { + "id": 566, + "name": "entity.goat.screaming.ram_impact" + }, + { + "id": 567, + "name": "entity.goat.screaming.horn_break" + }, + { + "id": 568, + "name": "entity.goat.step" + }, + { + "id": 569, + "name": "block.grass.break" + }, + { + "id": 570, + "name": "block.grass.fall" + }, + { + "id": 571, + "name": "block.grass.hit" + }, + { + "id": 572, + "name": "block.grass.place" + }, + { + "id": 573, + "name": "block.grass.step" + }, + { + "id": 574, + "name": "block.gravel.break" + }, + { + "id": 575, + "name": "block.gravel.fall" + }, + { + "id": 576, + "name": "block.gravel.hit" + }, + { + "id": 577, + "name": "block.gravel.place" + }, + { + "id": 578, + "name": "block.gravel.step" + }, + { + "id": 579, + "name": "block.grindstone.use" + }, + { + "id": 580, + "name": "block.growing_plant.crop" + }, + { + "id": 581, + "name": "entity.guardian.ambient" + }, + { + "id": 582, + "name": "entity.guardian.ambient_land" + }, + { + "id": 583, + "name": "entity.guardian.attack" + }, + { + "id": 584, + "name": "entity.guardian.death" + }, + { + "id": 585, + "name": "entity.guardian.death_land" + }, + { + "id": 586, + "name": "entity.guardian.flop" + }, + { + "id": 587, + "name": "entity.guardian.hurt" + }, + { + "id": 588, + "name": "entity.guardian.hurt_land" + }, + { + "id": 589, + "name": "block.hanging_roots.break" + }, + { + "id": 590, + "name": "block.hanging_roots.fall" + }, + { + "id": 591, + "name": "block.hanging_roots.hit" + }, + { + "id": 592, + "name": "block.hanging_roots.place" + }, + { + "id": 593, + "name": "block.hanging_roots.step" + }, + { + "id": 594, + "name": "block.hanging_sign.step" + }, + { + "id": 595, + "name": "block.hanging_sign.break" + }, + { + "id": 596, + "name": "block.hanging_sign.fall" + }, + { + "id": 597, + "name": "block.hanging_sign.hit" + }, + { + "id": 598, + "name": "block.hanging_sign.place" + }, + { + "id": 599, + "name": "block.nether_wood_hanging_sign.step" + }, + { + "id": 600, + "name": "block.nether_wood_hanging_sign.break" + }, + { + "id": 601, + "name": "block.nether_wood_hanging_sign.fall" + }, + { + "id": 602, + "name": "block.nether_wood_hanging_sign.hit" + }, + { + "id": 603, + "name": "block.nether_wood_hanging_sign.place" + }, + { + "id": 604, + "name": "block.bamboo_wood_hanging_sign.step" + }, + { + "id": 605, + "name": "block.bamboo_wood_hanging_sign.break" + }, + { + "id": 606, + "name": "block.bamboo_wood_hanging_sign.fall" + }, + { + "id": 607, + "name": "block.bamboo_wood_hanging_sign.hit" + }, + { + "id": 608, + "name": "block.bamboo_wood_hanging_sign.place" + }, + { + "id": 609, + "name": "item.hoe.till" + }, + { + "id": 610, + "name": "entity.hoglin.ambient" + }, + { + "id": 611, + "name": "entity.hoglin.angry" + }, + { + "id": 612, + "name": "entity.hoglin.attack" + }, + { + "id": 613, + "name": "entity.hoglin.converted_to_zombified" + }, + { + "id": 614, + "name": "entity.hoglin.death" + }, + { + "id": 615, + "name": "entity.hoglin.hurt" + }, + { + "id": 616, + "name": "entity.hoglin.retreat" + }, + { + "id": 617, + "name": "entity.hoglin.step" + }, + { + "id": 618, + "name": "block.honey_block.break" + }, + { + "id": 619, + "name": "block.honey_block.fall" + }, + { + "id": 620, + "name": "block.honey_block.hit" + }, + { + "id": 621, + "name": "block.honey_block.place" + }, + { + "id": 622, + "name": "block.honey_block.slide" + }, + { + "id": 623, + "name": "block.honey_block.step" + }, + { + "id": 624, + "name": "item.honeycomb.wax_on" + }, + { + "id": 625, + "name": "item.honey_bottle.drink" + }, + { + "id": 626, + "name": "item.goat_horn.sound.0" + }, + { + "id": 627, + "name": "item.goat_horn.sound.1" + }, + { + "id": 628, + "name": "item.goat_horn.sound.2" + }, + { + "id": 629, + "name": "item.goat_horn.sound.3" + }, + { + "id": 630, + "name": "item.goat_horn.sound.4" + }, + { + "id": 631, + "name": "item.goat_horn.sound.5" + }, + { + "id": 632, + "name": "item.goat_horn.sound.6" + }, + { + "id": 633, + "name": "item.goat_horn.sound.7" + }, + { + "id": 634, + "name": "entity.horse.ambient" + }, + { + "id": 635, + "name": "entity.horse.angry" + }, + { + "id": 636, + "name": "entity.horse.armor" + }, + { + "id": 637, + "name": "entity.horse.breathe" + }, + { + "id": 638, + "name": "entity.horse.death" + }, + { + "id": 639, + "name": "entity.horse.eat" + }, + { + "id": 640, + "name": "entity.horse.gallop" + }, + { + "id": 641, + "name": "entity.horse.hurt" + }, + { + "id": 642, + "name": "entity.horse.jump" + }, + { + "id": 643, + "name": "entity.horse.land" + }, + { + "id": 644, + "name": "entity.horse.saddle" + }, + { + "id": 645, + "name": "entity.horse.step" + }, + { + "id": 646, + "name": "entity.horse.step_wood" + }, + { + "id": 647, + "name": "entity.hostile.big_fall" + }, + { + "id": 648, + "name": "entity.hostile.death" + }, + { + "id": 649, + "name": "entity.hostile.hurt" + }, + { + "id": 650, + "name": "entity.hostile.small_fall" + }, + { + "id": 651, + "name": "entity.hostile.splash" + }, + { + "id": 652, + "name": "entity.hostile.swim" + }, + { + "id": 653, + "name": "entity.husk.ambient" + }, + { + "id": 654, + "name": "entity.husk.converted_to_zombie" + }, + { + "id": 655, + "name": "entity.husk.death" + }, + { + "id": 656, + "name": "entity.husk.hurt" + }, + { + "id": 657, + "name": "entity.husk.step" + }, + { + "id": 658, + "name": "entity.illusioner.ambient" + }, + { + "id": 659, + "name": "entity.illusioner.cast_spell" + }, + { + "id": 660, + "name": "entity.illusioner.death" + }, + { + "id": 661, + "name": "entity.illusioner.hurt" + }, + { + "id": 662, + "name": "entity.illusioner.mirror_move" + }, + { + "id": 663, + "name": "entity.illusioner.prepare_blindness" + }, + { + "id": 664, + "name": "entity.illusioner.prepare_mirror" + }, + { + "id": 665, + "name": "item.ink_sac.use" + }, + { + "id": 666, + "name": "block.iron_door.close" + }, + { + "id": 667, + "name": "block.iron_door.open" + }, + { + "id": 668, + "name": "entity.iron_golem.attack" + }, + { + "id": 669, + "name": "entity.iron_golem.damage" + }, + { + "id": 670, + "name": "entity.iron_golem.death" + }, + { + "id": 671, + "name": "entity.iron_golem.hurt" + }, + { + "id": 672, + "name": "entity.iron_golem.repair" + }, + { + "id": 673, + "name": "entity.iron_golem.step" + }, + { + "id": 674, + "name": "block.iron_trapdoor.close" + }, + { + "id": 675, + "name": "block.iron_trapdoor.open" + }, + { + "id": 676, + "name": "entity.item_frame.add_item" + }, + { + "id": 677, + "name": "entity.item_frame.break" + }, + { + "id": 678, + "name": "entity.item_frame.place" + }, + { + "id": 679, + "name": "entity.item_frame.remove_item" + }, + { + "id": 680, + "name": "entity.item_frame.rotate_item" + }, + { + "id": 681, + "name": "entity.item.break" + }, + { + "id": 682, + "name": "entity.item.pickup" + }, + { + "id": 683, + "name": "block.ladder.break" + }, + { + "id": 684, + "name": "block.ladder.fall" + }, + { + "id": 685, + "name": "block.ladder.hit" + }, + { + "id": 686, + "name": "block.ladder.place" + }, + { + "id": 687, + "name": "block.ladder.step" + }, + { + "id": 688, + "name": "block.lantern.break" + }, + { + "id": 689, + "name": "block.lantern.fall" + }, + { + "id": 690, + "name": "block.lantern.hit" + }, + { + "id": 691, + "name": "block.lantern.place" + }, + { + "id": 692, + "name": "block.lantern.step" + }, + { + "id": 693, + "name": "block.large_amethyst_bud.break" + }, + { + "id": 694, + "name": "block.large_amethyst_bud.place" + }, + { + "id": 695, + "name": "block.lava.ambient" + }, + { + "id": 696, + "name": "block.lava.extinguish" + }, + { + "id": 697, + "name": "block.lava.pop" + }, + { + "id": 698, + "name": "entity.leash_knot.break" + }, + { + "id": 699, + "name": "entity.leash_knot.place" + }, + { + "id": 700, + "name": "block.lever.click" + }, + { + "id": 701, + "name": "entity.lightning_bolt.impact" + }, + { + "id": 702, + "name": "entity.lightning_bolt.thunder" + }, + { + "id": 703, + "name": "entity.lingering_potion.throw" + }, + { + "id": 704, + "name": "entity.llama.ambient" + }, + { + "id": 705, + "name": "entity.llama.angry" + }, + { + "id": 706, + "name": "entity.llama.chest" + }, + { + "id": 707, + "name": "entity.llama.death" + }, + { + "id": 708, + "name": "entity.llama.eat" + }, + { + "id": 709, + "name": "entity.llama.hurt" + }, + { + "id": 710, + "name": "entity.llama.spit" + }, + { + "id": 711, + "name": "entity.llama.step" + }, + { + "id": 712, + "name": "entity.llama.swag" + }, + { + "id": 713, + "name": "entity.magma_cube.death_small" + }, + { + "id": 714, + "name": "block.lodestone.break" + }, + { + "id": 715, + "name": "block.lodestone.step" + }, + { + "id": 716, + "name": "block.lodestone.place" + }, + { + "id": 717, + "name": "block.lodestone.hit" + }, + { + "id": 718, + "name": "block.lodestone.fall" + }, + { + "id": 719, + "name": "item.lodestone_compass.lock" + }, + { + "id": 720, + "name": "entity.magma_cube.death" + }, + { + "id": 721, + "name": "entity.magma_cube.hurt" + }, + { + "id": 722, + "name": "entity.magma_cube.hurt_small" + }, + { + "id": 723, + "name": "entity.magma_cube.jump" + }, + { + "id": 724, + "name": "entity.magma_cube.squish" + }, + { + "id": 725, + "name": "entity.magma_cube.squish_small" + }, + { + "id": 726, + "name": "block.mangrove_roots.break" + }, + { + "id": 727, + "name": "block.mangrove_roots.fall" + }, + { + "id": 728, + "name": "block.mangrove_roots.hit" + }, + { + "id": 729, + "name": "block.mangrove_roots.place" + }, + { + "id": 730, + "name": "block.mangrove_roots.step" + }, + { + "id": 731, + "name": "block.medium_amethyst_bud.break" + }, + { + "id": 732, + "name": "block.medium_amethyst_bud.place" + }, + { + "id": 733, + "name": "block.metal.break" + }, + { + "id": 734, + "name": "block.metal.fall" + }, + { + "id": 735, + "name": "block.metal.hit" + }, + { + "id": 736, + "name": "block.metal.place" + }, + { + "id": 737, + "name": "block.metal_pressure_plate.click_off" + }, + { + "id": 738, + "name": "block.metal_pressure_plate.click_on" + }, + { + "id": 739, + "name": "block.metal.step" + }, + { + "id": 740, + "name": "entity.minecart.inside.underwater" + }, + { + "id": 741, + "name": "entity.minecart.inside" + }, + { + "id": 742, + "name": "entity.minecart.riding" + }, + { + "id": 743, + "name": "entity.mooshroom.convert" + }, + { + "id": 744, + "name": "entity.mooshroom.eat" + }, + { + "id": 745, + "name": "entity.mooshroom.milk" + }, + { + "id": 746, + "name": "entity.mooshroom.suspicious_milk" + }, + { + "id": 747, + "name": "entity.mooshroom.shear" + }, + { + "id": 748, + "name": "block.moss_carpet.break" + }, + { + "id": 749, + "name": "block.moss_carpet.fall" + }, + { + "id": 750, + "name": "block.moss_carpet.hit" + }, + { + "id": 751, + "name": "block.moss_carpet.place" + }, + { + "id": 752, + "name": "block.moss_carpet.step" + }, + { + "id": 753, + "name": "block.pink_petals.break" + }, + { + "id": 754, + "name": "block.pink_petals.fall" + }, + { + "id": 755, + "name": "block.pink_petals.hit" + }, + { + "id": 756, + "name": "block.pink_petals.place" + }, + { + "id": 757, + "name": "block.pink_petals.step" + }, + { + "id": 758, + "name": "block.moss.break" + }, + { + "id": 759, + "name": "block.moss.fall" + }, + { + "id": 760, + "name": "block.moss.hit" + }, + { + "id": 761, + "name": "block.moss.place" + }, + { + "id": 762, + "name": "block.moss.step" + }, + { + "id": 763, + "name": "block.mud.break" + }, + { + "id": 764, + "name": "block.mud.fall" + }, + { + "id": 765, + "name": "block.mud.hit" + }, + { + "id": 766, + "name": "block.mud.place" + }, + { + "id": 767, + "name": "block.mud.step" + }, + { + "id": 768, + "name": "block.mud_bricks.break" + }, + { + "id": 769, + "name": "block.mud_bricks.fall" + }, + { + "id": 770, + "name": "block.mud_bricks.hit" + }, + { + "id": 771, + "name": "block.mud_bricks.place" + }, + { + "id": 772, + "name": "block.mud_bricks.step" + }, + { + "id": 773, + "name": "block.muddy_mangrove_roots.break" + }, + { + "id": 774, + "name": "block.muddy_mangrove_roots.fall" + }, + { + "id": 775, + "name": "block.muddy_mangrove_roots.hit" + }, + { + "id": 776, + "name": "block.muddy_mangrove_roots.place" + }, + { + "id": 777, + "name": "block.muddy_mangrove_roots.step" + }, + { + "id": 778, + "name": "entity.mule.ambient" + }, + { + "id": 779, + "name": "entity.mule.angry" + }, + { + "id": 780, + "name": "entity.mule.chest" + }, + { + "id": 781, + "name": "entity.mule.death" + }, + { + "id": 782, + "name": "entity.mule.eat" + }, + { + "id": 783, + "name": "entity.mule.hurt" + }, + { + "id": 784, + "name": "music.creative" + }, + { + "id": 785, + "name": "music.credits" + }, + { + "id": 786, + "name": "music_disc.5" + }, + { + "id": 787, + "name": "music_disc.11" + }, + { + "id": 788, + "name": "music_disc.13" + }, + { + "id": 789, + "name": "music_disc.blocks" + }, + { + "id": 790, + "name": "music_disc.cat" + }, + { + "id": 791, + "name": "music_disc.chirp" + }, + { + "id": 792, + "name": "music_disc.far" + }, + { + "id": 793, + "name": "music_disc.mall" + }, + { + "id": 794, + "name": "music_disc.mellohi" + }, + { + "id": 795, + "name": "music_disc.pigstep" + }, + { + "id": 796, + "name": "music_disc.stal" + }, + { + "id": 797, + "name": "music_disc.strad" + }, + { + "id": 798, + "name": "music_disc.wait" + }, + { + "id": 799, + "name": "music_disc.ward" + }, + { + "id": 800, + "name": "music_disc.otherside" + }, + { + "id": 801, + "name": "music_disc.relic" + }, + { + "id": 802, + "name": "music.dragon" + }, + { + "id": 803, + "name": "music.end" + }, + { + "id": 804, + "name": "music.game" + }, + { + "id": 805, + "name": "music.menu" + }, + { + "id": 806, + "name": "music.nether.basalt_deltas" + }, + { + "id": 807, + "name": "music.nether.crimson_forest" + }, + { + "id": 808, + "name": "music.overworld.deep_dark" + }, + { + "id": 809, + "name": "music.overworld.dripstone_caves" + }, + { + "id": 810, + "name": "music.overworld.grove" + }, + { + "id": 811, + "name": "music.overworld.jagged_peaks" + }, + { + "id": 812, + "name": "music.overworld.lush_caves" + }, + { + "id": 813, + "name": "music.overworld.swamp" + }, + { + "id": 814, + "name": "music.overworld.forest" + }, + { + "id": 815, + "name": "music.overworld.old_growth_taiga" + }, + { + "id": 816, + "name": "music.overworld.meadow" + }, + { + "id": 817, + "name": "music.overworld.cherry_grove" + }, + { + "id": 818, + "name": "music.nether.nether_wastes" + }, + { + "id": 819, + "name": "music.overworld.frozen_peaks" + }, + { + "id": 820, + "name": "music.overworld.snowy_slopes" + }, + { + "id": 821, + "name": "music.nether.soul_sand_valley" + }, + { + "id": 822, + "name": "music.overworld.stony_peaks" + }, + { + "id": 823, + "name": "music.nether.warped_forest" + }, + { + "id": 824, + "name": "music.overworld.flower_forest" + }, + { + "id": 825, + "name": "music.overworld.desert" + }, + { + "id": 826, + "name": "music.overworld.badlands" + }, + { + "id": 827, + "name": "music.overworld.jungle" + }, + { + "id": 828, + "name": "music.overworld.sparse_jungle" + }, + { + "id": 829, + "name": "music.overworld.bamboo_jungle" + }, + { + "id": 830, + "name": "music.under_water" + }, + { + "id": 831, + "name": "block.nether_bricks.break" + }, + { + "id": 832, + "name": "block.nether_bricks.step" + }, + { + "id": 833, + "name": "block.nether_bricks.place" + }, + { + "id": 834, + "name": "block.nether_bricks.hit" + }, + { + "id": 835, + "name": "block.nether_bricks.fall" + }, + { + "id": 836, + "name": "block.nether_wart.break" + }, + { + "id": 837, + "name": "item.nether_wart.plant" + }, + { + "id": 838, + "name": "block.nether_wood.break" + }, + { + "id": 839, + "name": "block.nether_wood.fall" + }, + { + "id": 840, + "name": "block.nether_wood.hit" + }, + { + "id": 841, + "name": "block.nether_wood.place" + }, + { + "id": 842, + "name": "block.nether_wood.step" + }, + { + "id": 843, + "name": "block.nether_wood_door.close" + }, + { + "id": 844, + "name": "block.nether_wood_door.open" + }, + { + "id": 845, + "name": "block.nether_wood_trapdoor.close" + }, + { + "id": 846, + "name": "block.nether_wood_trapdoor.open" + }, + { + "id": 847, + "name": "block.nether_wood_button.click_off" + }, + { + "id": 848, + "name": "block.nether_wood_button.click_on" + }, + { + "id": 849, + "name": "block.nether_wood_pressure_plate.click_off" + }, + { + "id": 850, + "name": "block.nether_wood_pressure_plate.click_on" + }, + { + "id": 851, + "name": "block.nether_wood_fence_gate.close" + }, + { + "id": 852, + "name": "block.nether_wood_fence_gate.open" + }, + { + "id": 853, + "name": "intentionally_empty" + }, + { + "id": 854, + "name": "block.packed_mud.break" + }, + { + "id": 855, + "name": "block.packed_mud.fall" + }, + { + "id": 856, + "name": "block.packed_mud.hit" + }, + { + "id": 857, + "name": "block.packed_mud.place" + }, + { + "id": 858, + "name": "block.packed_mud.step" + }, + { + "id": 859, + "name": "block.stem.break" + }, + { + "id": 860, + "name": "block.stem.step" + }, + { + "id": 861, + "name": "block.stem.place" + }, + { + "id": 862, + "name": "block.stem.hit" + }, + { + "id": 863, + "name": "block.stem.fall" + }, + { + "id": 864, + "name": "block.nylium.break" + }, + { + "id": 865, + "name": "block.nylium.step" + }, + { + "id": 866, + "name": "block.nylium.place" + }, + { + "id": 867, + "name": "block.nylium.hit" + }, + { + "id": 868, + "name": "block.nylium.fall" + }, + { + "id": 869, + "name": "block.nether_sprouts.break" + }, + { + "id": 870, + "name": "block.nether_sprouts.step" + }, + { + "id": 871, + "name": "block.nether_sprouts.place" + }, + { + "id": 872, + "name": "block.nether_sprouts.hit" + }, + { + "id": 873, + "name": "block.nether_sprouts.fall" + }, + { + "id": 874, + "name": "block.fungus.break" + }, + { + "id": 875, + "name": "block.fungus.step" + }, + { + "id": 876, + "name": "block.fungus.place" + }, + { + "id": 877, + "name": "block.fungus.hit" + }, + { + "id": 878, + "name": "block.fungus.fall" + }, + { + "id": 879, + "name": "block.weeping_vines.break" + }, + { + "id": 880, + "name": "block.weeping_vines.step" + }, + { + "id": 881, + "name": "block.weeping_vines.place" + }, + { + "id": 882, + "name": "block.weeping_vines.hit" + }, + { + "id": 883, + "name": "block.weeping_vines.fall" + }, + { + "id": 884, + "name": "block.wart_block.break" + }, + { + "id": 885, + "name": "block.wart_block.step" + }, + { + "id": 886, + "name": "block.wart_block.place" + }, + { + "id": 887, + "name": "block.wart_block.hit" + }, + { + "id": 888, + "name": "block.wart_block.fall" + }, + { + "id": 889, + "name": "block.netherite_block.break" + }, + { + "id": 890, + "name": "block.netherite_block.step" + }, + { + "id": 891, + "name": "block.netherite_block.place" + }, + { + "id": 892, + "name": "block.netherite_block.hit" + }, + { + "id": 893, + "name": "block.netherite_block.fall" + }, + { + "id": 894, + "name": "block.netherrack.break" + }, + { + "id": 895, + "name": "block.netherrack.step" + }, + { + "id": 896, + "name": "block.netherrack.place" + }, + { + "id": 897, + "name": "block.netherrack.hit" + }, + { + "id": 898, + "name": "block.netherrack.fall" + }, + { + "id": 899, + "name": "block.note_block.basedrum" + }, + { + "id": 900, + "name": "block.note_block.bass" + }, + { + "id": 901, + "name": "block.note_block.bell" + }, + { + "id": 902, + "name": "block.note_block.chime" + }, + { + "id": 903, + "name": "block.note_block.flute" + }, + { + "id": 904, + "name": "block.note_block.guitar" + }, + { + "id": 905, + "name": "block.note_block.harp" + }, + { + "id": 906, + "name": "block.note_block.hat" + }, + { + "id": 907, + "name": "block.note_block.pling" + }, + { + "id": 908, + "name": "block.note_block.snare" + }, + { + "id": 909, + "name": "block.note_block.xylophone" + }, + { + "id": 910, + "name": "block.note_block.iron_xylophone" + }, + { + "id": 911, + "name": "block.note_block.cow_bell" + }, + { + "id": 912, + "name": "block.note_block.didgeridoo" + }, + { + "id": 913, + "name": "block.note_block.bit" + }, + { + "id": 914, + "name": "block.note_block.banjo" + }, + { + "id": 915, + "name": "block.note_block.imitate.zombie" + }, + { + "id": 916, + "name": "block.note_block.imitate.skeleton" + }, + { + "id": 917, + "name": "block.note_block.imitate.creeper" + }, + { + "id": 918, + "name": "block.note_block.imitate.ender_dragon" + }, + { + "id": 919, + "name": "block.note_block.imitate.wither_skeleton" + }, + { + "id": 920, + "name": "block.note_block.imitate.piglin" + }, + { + "id": 921, + "name": "entity.ocelot.hurt" + }, + { + "id": 922, + "name": "entity.ocelot.ambient" + }, + { + "id": 923, + "name": "entity.ocelot.death" + }, + { + "id": 924, + "name": "entity.painting.break" + }, + { + "id": 925, + "name": "entity.painting.place" + }, + { + "id": 926, + "name": "entity.panda.pre_sneeze" + }, + { + "id": 927, + "name": "entity.panda.sneeze" + }, + { + "id": 928, + "name": "entity.panda.ambient" + }, + { + "id": 929, + "name": "entity.panda.death" + }, + { + "id": 930, + "name": "entity.panda.eat" + }, + { + "id": 931, + "name": "entity.panda.step" + }, + { + "id": 932, + "name": "entity.panda.cant_breed" + }, + { + "id": 933, + "name": "entity.panda.aggressive_ambient" + }, + { + "id": 934, + "name": "entity.panda.worried_ambient" + }, + { + "id": 935, + "name": "entity.panda.hurt" + }, + { + "id": 936, + "name": "entity.panda.bite" + }, + { + "id": 937, + "name": "entity.parrot.ambient" + }, + { + "id": 938, + "name": "entity.parrot.death" + }, + { + "id": 939, + "name": "entity.parrot.eat" + }, + { + "id": 940, + "name": "entity.parrot.fly" + }, + { + "id": 941, + "name": "entity.parrot.hurt" + }, + { + "id": 942, + "name": "entity.parrot.imitate.blaze" + }, + { + "id": 943, + "name": "entity.parrot.imitate.creeper" + }, + { + "id": 944, + "name": "entity.parrot.imitate.drowned" + }, + { + "id": 945, + "name": "entity.parrot.imitate.elder_guardian" + }, + { + "id": 946, + "name": "entity.parrot.imitate.ender_dragon" + }, + { + "id": 947, + "name": "entity.parrot.imitate.endermite" + }, + { + "id": 948, + "name": "entity.parrot.imitate.evoker" + }, + { + "id": 949, + "name": "entity.parrot.imitate.ghast" + }, + { + "id": 950, + "name": "entity.parrot.imitate.guardian" + }, + { + "id": 951, + "name": "entity.parrot.imitate.hoglin" + }, + { + "id": 952, + "name": "entity.parrot.imitate.husk" + }, + { + "id": 953, + "name": "entity.parrot.imitate.illusioner" + }, + { + "id": 954, + "name": "entity.parrot.imitate.magma_cube" + }, + { + "id": 955, + "name": "entity.parrot.imitate.phantom" + }, + { + "id": 956, + "name": "entity.parrot.imitate.piglin" + }, + { + "id": 957, + "name": "entity.parrot.imitate.piglin_brute" + }, + { + "id": 958, + "name": "entity.parrot.imitate.pillager" + }, + { + "id": 959, + "name": "entity.parrot.imitate.ravager" + }, + { + "id": 960, + "name": "entity.parrot.imitate.shulker" + }, + { + "id": 961, + "name": "entity.parrot.imitate.silverfish" + }, + { + "id": 962, + "name": "entity.parrot.imitate.skeleton" + }, + { + "id": 963, + "name": "entity.parrot.imitate.slime" + }, + { + "id": 964, + "name": "entity.parrot.imitate.spider" + }, + { + "id": 965, + "name": "entity.parrot.imitate.stray" + }, + { + "id": 966, + "name": "entity.parrot.imitate.vex" + }, + { + "id": 967, + "name": "entity.parrot.imitate.vindicator" + }, + { + "id": 968, + "name": "entity.parrot.imitate.warden" + }, + { + "id": 969, + "name": "entity.parrot.imitate.witch" + }, + { + "id": 970, + "name": "entity.parrot.imitate.wither" + }, + { + "id": 971, + "name": "entity.parrot.imitate.wither_skeleton" + }, + { + "id": 972, + "name": "entity.parrot.imitate.zoglin" + }, + { + "id": 973, + "name": "entity.parrot.imitate.zombie" + }, + { + "id": 974, + "name": "entity.parrot.imitate.zombie_villager" + }, + { + "id": 975, + "name": "entity.parrot.step" + }, + { + "id": 976, + "name": "entity.phantom.ambient" + }, + { + "id": 977, + "name": "entity.phantom.bite" + }, + { + "id": 978, + "name": "entity.phantom.death" + }, + { + "id": 979, + "name": "entity.phantom.flap" + }, + { + "id": 980, + "name": "entity.phantom.hurt" + }, + { + "id": 981, + "name": "entity.phantom.swoop" + }, + { + "id": 982, + "name": "entity.pig.ambient" + }, + { + "id": 983, + "name": "entity.pig.death" + }, + { + "id": 984, + "name": "entity.pig.hurt" + }, + { + "id": 985, + "name": "entity.pig.saddle" + }, + { + "id": 986, + "name": "entity.pig.step" + }, + { + "id": 987, + "name": "entity.piglin.admiring_item" + }, + { + "id": 988, + "name": "entity.piglin.ambient" + }, + { + "id": 989, + "name": "entity.piglin.angry" + }, + { + "id": 990, + "name": "entity.piglin.celebrate" + }, + { + "id": 991, + "name": "entity.piglin.death" + }, + { + "id": 992, + "name": "entity.piglin.jealous" + }, + { + "id": 993, + "name": "entity.piglin.hurt" + }, + { + "id": 994, + "name": "entity.piglin.retreat" + }, + { + "id": 995, + "name": "entity.piglin.step" + }, + { + "id": 996, + "name": "entity.piglin.converted_to_zombified" + }, + { + "id": 997, + "name": "entity.piglin_brute.ambient" + }, + { + "id": 998, + "name": "entity.piglin_brute.angry" + }, + { + "id": 999, + "name": "entity.piglin_brute.death" + }, + { + "id": 1000, + "name": "entity.piglin_brute.hurt" + }, + { + "id": 1001, + "name": "entity.piglin_brute.step" + }, + { + "id": 1002, + "name": "entity.piglin_brute.converted_to_zombified" + }, + { + "id": 1003, + "name": "entity.pillager.ambient" + }, + { + "id": 1004, + "name": "entity.pillager.celebrate" + }, + { + "id": 1005, + "name": "entity.pillager.death" + }, + { + "id": 1006, + "name": "entity.pillager.hurt" + }, + { + "id": 1007, + "name": "block.piston.contract" + }, + { + "id": 1008, + "name": "block.piston.extend" + }, + { + "id": 1009, + "name": "entity.player.attack.crit" + }, + { + "id": 1010, + "name": "entity.player.attack.knockback" + }, + { + "id": 1011, + "name": "entity.player.attack.nodamage" + }, + { + "id": 1012, + "name": "entity.player.attack.strong" + }, + { + "id": 1013, + "name": "entity.player.attack.sweep" + }, + { + "id": 1014, + "name": "entity.player.attack.weak" + }, + { + "id": 1015, + "name": "entity.player.big_fall" + }, + { + "id": 1016, + "name": "entity.player.breath" + }, + { + "id": 1017, + "name": "entity.player.burp" + }, + { + "id": 1018, + "name": "entity.player.death" + }, + { + "id": 1019, + "name": "entity.player.hurt" + }, + { + "id": 1020, + "name": "entity.player.hurt_drown" + }, + { + "id": 1021, + "name": "entity.player.hurt_freeze" + }, + { + "id": 1022, + "name": "entity.player.hurt_on_fire" + }, + { + "id": 1023, + "name": "entity.player.hurt_sweet_berry_bush" + }, + { + "id": 1024, + "name": "entity.player.levelup" + }, + { + "id": 1025, + "name": "entity.player.small_fall" + }, + { + "id": 1026, + "name": "entity.player.splash" + }, + { + "id": 1027, + "name": "entity.player.splash.high_speed" + }, + { + "id": 1028, + "name": "entity.player.swim" + }, + { + "id": 1029, + "name": "entity.polar_bear.ambient" + }, + { + "id": 1030, + "name": "entity.polar_bear.ambient_baby" + }, + { + "id": 1031, + "name": "entity.polar_bear.death" + }, + { + "id": 1032, + "name": "entity.polar_bear.hurt" + }, + { + "id": 1033, + "name": "entity.polar_bear.step" + }, + { + "id": 1034, + "name": "entity.polar_bear.warning" + }, + { + "id": 1035, + "name": "block.polished_deepslate.break" + }, + { + "id": 1036, + "name": "block.polished_deepslate.fall" + }, + { + "id": 1037, + "name": "block.polished_deepslate.hit" + }, + { + "id": 1038, + "name": "block.polished_deepslate.place" + }, + { + "id": 1039, + "name": "block.polished_deepslate.step" + }, + { + "id": 1040, + "name": "block.portal.ambient" + }, + { + "id": 1041, + "name": "block.portal.travel" + }, + { + "id": 1042, + "name": "block.portal.trigger" + }, + { + "id": 1043, + "name": "block.powder_snow.break" + }, + { + "id": 1044, + "name": "block.powder_snow.fall" + }, + { + "id": 1045, + "name": "block.powder_snow.hit" + }, + { + "id": 1046, + "name": "block.powder_snow.place" + }, + { + "id": 1047, + "name": "block.powder_snow.step" + }, + { + "id": 1048, + "name": "entity.puffer_fish.ambient" + }, + { + "id": 1049, + "name": "entity.puffer_fish.blow_out" + }, + { + "id": 1050, + "name": "entity.puffer_fish.blow_up" + }, + { + "id": 1051, + "name": "entity.puffer_fish.death" + }, + { + "id": 1052, + "name": "entity.puffer_fish.flop" + }, + { + "id": 1053, + "name": "entity.puffer_fish.hurt" + }, + { + "id": 1054, + "name": "entity.puffer_fish.sting" + }, + { + "id": 1055, + "name": "block.pumpkin.carve" + }, + { + "id": 1056, + "name": "entity.rabbit.ambient" + }, + { + "id": 1057, + "name": "entity.rabbit.attack" + }, + { + "id": 1058, + "name": "entity.rabbit.death" + }, + { + "id": 1059, + "name": "entity.rabbit.hurt" + }, + { + "id": 1060, + "name": "entity.rabbit.jump" + }, + { + "id": 1061, + "name": "event.raid.horn" + }, + { + "id": 1062, + "name": "entity.ravager.ambient" + }, + { + "id": 1063, + "name": "entity.ravager.attack" + }, + { + "id": 1064, + "name": "entity.ravager.celebrate" + }, + { + "id": 1065, + "name": "entity.ravager.death" + }, + { + "id": 1066, + "name": "entity.ravager.hurt" + }, + { + "id": 1067, + "name": "entity.ravager.step" + }, + { + "id": 1068, + "name": "entity.ravager.stunned" + }, + { + "id": 1069, + "name": "entity.ravager.roar" + }, + { + "id": 1070, + "name": "block.nether_gold_ore.break" + }, + { + "id": 1071, + "name": "block.nether_gold_ore.fall" + }, + { + "id": 1072, + "name": "block.nether_gold_ore.hit" + }, + { + "id": 1073, + "name": "block.nether_gold_ore.place" + }, + { + "id": 1074, + "name": "block.nether_gold_ore.step" + }, + { + "id": 1075, + "name": "block.nether_ore.break" + }, + { + "id": 1076, + "name": "block.nether_ore.fall" + }, + { + "id": 1077, + "name": "block.nether_ore.hit" + }, + { + "id": 1078, + "name": "block.nether_ore.place" + }, + { + "id": 1079, + "name": "block.nether_ore.step" + }, + { + "id": 1080, + "name": "block.redstone_torch.burnout" + }, + { + "id": 1081, + "name": "block.respawn_anchor.ambient" + }, + { + "id": 1082, + "name": "block.respawn_anchor.charge" + }, + { + "id": 1083, + "name": "block.respawn_anchor.deplete" + }, + { + "id": 1084, + "name": "block.respawn_anchor.set_spawn" + }, + { + "id": 1085, + "name": "block.rooted_dirt.break" + }, + { + "id": 1086, + "name": "block.rooted_dirt.fall" + }, + { + "id": 1087, + "name": "block.rooted_dirt.hit" + }, + { + "id": 1088, + "name": "block.rooted_dirt.place" + }, + { + "id": 1089, + "name": "block.rooted_dirt.step" + }, + { + "id": 1090, + "name": "entity.salmon.ambient" + }, + { + "id": 1091, + "name": "entity.salmon.death" + }, + { + "id": 1092, + "name": "entity.salmon.flop" + }, + { + "id": 1093, + "name": "entity.salmon.hurt" + }, + { + "id": 1094, + "name": "block.sand.break" + }, + { + "id": 1095, + "name": "block.sand.fall" + }, + { + "id": 1096, + "name": "block.sand.hit" + }, + { + "id": 1097, + "name": "block.sand.place" + }, + { + "id": 1098, + "name": "block.sand.step" + }, + { + "id": 1099, + "name": "block.scaffolding.break" + }, + { + "id": 1100, + "name": "block.scaffolding.fall" + }, + { + "id": 1101, + "name": "block.scaffolding.hit" + }, + { + "id": 1102, + "name": "block.scaffolding.place" + }, + { + "id": 1103, + "name": "block.scaffolding.step" + }, + { + "id": 1104, + "name": "block.sculk.spread" + }, + { + "id": 1105, + "name": "block.sculk.charge" + }, + { + "id": 1106, + "name": "block.sculk.break" + }, + { + "id": 1107, + "name": "block.sculk.fall" + }, + { + "id": 1108, + "name": "block.sculk.hit" + }, + { + "id": 1109, + "name": "block.sculk.place" + }, + { + "id": 1110, + "name": "block.sculk.step" + }, + { + "id": 1111, + "name": "block.sculk_catalyst.bloom" + }, + { + "id": 1112, + "name": "block.sculk_catalyst.break" + }, + { + "id": 1113, + "name": "block.sculk_catalyst.fall" + }, + { + "id": 1114, + "name": "block.sculk_catalyst.hit" + }, + { + "id": 1115, + "name": "block.sculk_catalyst.place" + }, + { + "id": 1116, + "name": "block.sculk_catalyst.step" + }, + { + "id": 1117, + "name": "block.sculk_sensor.clicking" + }, + { + "id": 1118, + "name": "block.sculk_sensor.clicking_stop" + }, + { + "id": 1119, + "name": "block.sculk_sensor.break" + }, + { + "id": 1120, + "name": "block.sculk_sensor.fall" + }, + { + "id": 1121, + "name": "block.sculk_sensor.hit" + }, + { + "id": 1122, + "name": "block.sculk_sensor.place" + }, + { + "id": 1123, + "name": "block.sculk_sensor.step" + }, + { + "id": 1124, + "name": "block.sculk_shrieker.break" + }, + { + "id": 1125, + "name": "block.sculk_shrieker.fall" + }, + { + "id": 1126, + "name": "block.sculk_shrieker.hit" + }, + { + "id": 1127, + "name": "block.sculk_shrieker.place" + }, + { + "id": 1128, + "name": "block.sculk_shrieker.shriek" + }, + { + "id": 1129, + "name": "block.sculk_shrieker.step" + }, + { + "id": 1130, + "name": "block.sculk_vein.break" + }, + { + "id": 1131, + "name": "block.sculk_vein.fall" + }, + { + "id": 1132, + "name": "block.sculk_vein.hit" + }, + { + "id": 1133, + "name": "block.sculk_vein.place" + }, + { + "id": 1134, + "name": "block.sculk_vein.step" + }, + { + "id": 1135, + "name": "entity.sheep.ambient" + }, + { + "id": 1136, + "name": "entity.sheep.death" + }, + { + "id": 1137, + "name": "entity.sheep.hurt" + }, + { + "id": 1138, + "name": "entity.sheep.shear" + }, + { + "id": 1139, + "name": "entity.sheep.step" + }, + { + "id": 1140, + "name": "item.shield.block" + }, + { + "id": 1141, + "name": "item.shield.break" + }, + { + "id": 1142, + "name": "block.shroomlight.break" + }, + { + "id": 1143, + "name": "block.shroomlight.step" + }, + { + "id": 1144, + "name": "block.shroomlight.place" + }, + { + "id": 1145, + "name": "block.shroomlight.hit" + }, + { + "id": 1146, + "name": "block.shroomlight.fall" + }, + { + "id": 1147, + "name": "item.shovel.flatten" + }, + { + "id": 1148, + "name": "entity.shulker.ambient" + }, + { + "id": 1149, + "name": "block.shulker_box.close" + }, + { + "id": 1150, + "name": "block.shulker_box.open" + }, + { + "id": 1151, + "name": "entity.shulker_bullet.hit" + }, + { + "id": 1152, + "name": "entity.shulker_bullet.hurt" + }, + { + "id": 1153, + "name": "entity.shulker.close" + }, + { + "id": 1154, + "name": "entity.shulker.death" + }, + { + "id": 1155, + "name": "entity.shulker.hurt" + }, + { + "id": 1156, + "name": "entity.shulker.hurt_closed" + }, + { + "id": 1157, + "name": "entity.shulker.open" + }, + { + "id": 1158, + "name": "entity.shulker.shoot" + }, + { + "id": 1159, + "name": "entity.shulker.teleport" + }, + { + "id": 1160, + "name": "entity.silverfish.ambient" + }, + { + "id": 1161, + "name": "entity.silverfish.death" + }, + { + "id": 1162, + "name": "entity.silverfish.hurt" + }, + { + "id": 1163, + "name": "entity.silverfish.step" + }, + { + "id": 1164, + "name": "entity.skeleton.ambient" + }, + { + "id": 1165, + "name": "entity.skeleton.converted_to_stray" + }, + { + "id": 1166, + "name": "entity.skeleton.death" + }, + { + "id": 1167, + "name": "entity.skeleton_horse.ambient" + }, + { + "id": 1168, + "name": "entity.skeleton_horse.death" + }, + { + "id": 1169, + "name": "entity.skeleton_horse.hurt" + }, + { + "id": 1170, + "name": "entity.skeleton_horse.swim" + }, + { + "id": 1171, + "name": "entity.skeleton_horse.ambient_water" + }, + { + "id": 1172, + "name": "entity.skeleton_horse.gallop_water" + }, + { + "id": 1173, + "name": "entity.skeleton_horse.jump_water" + }, + { + "id": 1174, + "name": "entity.skeleton_horse.step_water" + }, + { + "id": 1175, + "name": "entity.skeleton.hurt" + }, + { + "id": 1176, + "name": "entity.skeleton.shoot" + }, + { + "id": 1177, + "name": "entity.skeleton.step" + }, + { + "id": 1178, + "name": "entity.slime.attack" + }, + { + "id": 1179, + "name": "entity.slime.death" + }, + { + "id": 1180, + "name": "entity.slime.hurt" + }, + { + "id": 1181, + "name": "entity.slime.jump" + }, + { + "id": 1182, + "name": "entity.slime.squish" + }, + { + "id": 1183, + "name": "block.slime_block.break" + }, + { + "id": 1184, + "name": "block.slime_block.fall" + }, + { + "id": 1185, + "name": "block.slime_block.hit" + }, + { + "id": 1186, + "name": "block.slime_block.place" + }, + { + "id": 1187, + "name": "block.slime_block.step" + }, + { + "id": 1188, + "name": "block.small_amethyst_bud.break" + }, + { + "id": 1189, + "name": "block.small_amethyst_bud.place" + }, + { + "id": 1190, + "name": "block.small_dripleaf.break" + }, + { + "id": 1191, + "name": "block.small_dripleaf.fall" + }, + { + "id": 1192, + "name": "block.small_dripleaf.hit" + }, + { + "id": 1193, + "name": "block.small_dripleaf.place" + }, + { + "id": 1194, + "name": "block.small_dripleaf.step" + }, + { + "id": 1195, + "name": "block.soul_sand.break" + }, + { + "id": 1196, + "name": "block.soul_sand.step" + }, + { + "id": 1197, + "name": "block.soul_sand.place" + }, + { + "id": 1198, + "name": "block.soul_sand.hit" + }, + { + "id": 1199, + "name": "block.soul_sand.fall" + }, + { + "id": 1200, + "name": "block.soul_soil.break" + }, + { + "id": 1201, + "name": "block.soul_soil.step" + }, + { + "id": 1202, + "name": "block.soul_soil.place" + }, + { + "id": 1203, + "name": "block.soul_soil.hit" + }, + { + "id": 1204, + "name": "block.soul_soil.fall" + }, + { + "id": 1205, + "name": "particle.soul_escape" + }, + { + "id": 1206, + "name": "block.spore_blossom.break" + }, + { + "id": 1207, + "name": "block.spore_blossom.fall" + }, + { + "id": 1208, + "name": "block.spore_blossom.hit" + }, + { + "id": 1209, + "name": "block.spore_blossom.place" + }, + { + "id": 1210, + "name": "block.spore_blossom.step" + }, + { + "id": 1211, + "name": "entity.strider.ambient" + }, + { + "id": 1212, + "name": "entity.strider.happy" + }, + { + "id": 1213, + "name": "entity.strider.retreat" + }, + { + "id": 1214, + "name": "entity.strider.death" + }, + { + "id": 1215, + "name": "entity.strider.hurt" + }, + { + "id": 1216, + "name": "entity.strider.step" + }, + { + "id": 1217, + "name": "entity.strider.step_lava" + }, + { + "id": 1218, + "name": "entity.strider.eat" + }, + { + "id": 1219, + "name": "entity.strider.saddle" + }, + { + "id": 1220, + "name": "entity.slime.death_small" + }, + { + "id": 1221, + "name": "entity.slime.hurt_small" + }, + { + "id": 1222, + "name": "entity.slime.jump_small" + }, + { + "id": 1223, + "name": "entity.slime.squish_small" + }, + { + "id": 1224, + "name": "block.smithing_table.use" + }, + { + "id": 1225, + "name": "block.smoker.smoke" + }, + { + "id": 1226, + "name": "entity.sniffer.step" + }, + { + "id": 1227, + "name": "entity.sniffer.eat" + }, + { + "id": 1228, + "name": "entity.sniffer.idle" + }, + { + "id": 1229, + "name": "entity.sniffer.hurt" + }, + { + "id": 1230, + "name": "entity.sniffer.death" + }, + { + "id": 1231, + "name": "entity.sniffer.drop_seed" + }, + { + "id": 1232, + "name": "entity.sniffer.scenting" + }, + { + "id": 1233, + "name": "entity.sniffer.sniffing" + }, + { + "id": 1234, + "name": "entity.sniffer.searching" + }, + { + "id": 1235, + "name": "entity.sniffer.digging" + }, + { + "id": 1236, + "name": "entity.sniffer.digging_stop" + }, + { + "id": 1237, + "name": "entity.sniffer.happy" + }, + { + "id": 1238, + "name": "block.sniffer_egg.plop" + }, + { + "id": 1239, + "name": "block.sniffer_egg.crack" + }, + { + "id": 1240, + "name": "block.sniffer_egg.hatch" + }, + { + "id": 1241, + "name": "entity.snowball.throw" + }, + { + "id": 1242, + "name": "block.snow.break" + }, + { + "id": 1243, + "name": "block.snow.fall" + }, + { + "id": 1244, + "name": "entity.snow_golem.ambient" + }, + { + "id": 1245, + "name": "entity.snow_golem.death" + }, + { + "id": 1246, + "name": "entity.snow_golem.hurt" + }, + { + "id": 1247, + "name": "entity.snow_golem.shoot" + }, + { + "id": 1248, + "name": "entity.snow_golem.shear" + }, + { + "id": 1249, + "name": "block.snow.hit" + }, + { + "id": 1250, + "name": "block.snow.place" + }, + { + "id": 1251, + "name": "block.snow.step" + }, + { + "id": 1252, + "name": "entity.spider.ambient" + }, + { + "id": 1253, + "name": "entity.spider.death" + }, + { + "id": 1254, + "name": "entity.spider.hurt" + }, + { + "id": 1255, + "name": "entity.spider.step" + }, + { + "id": 1256, + "name": "entity.splash_potion.break" + }, + { + "id": 1257, + "name": "entity.splash_potion.throw" + }, + { + "id": 1258, + "name": "item.spyglass.use" + }, + { + "id": 1259, + "name": "item.spyglass.stop_using" + }, + { + "id": 1260, + "name": "entity.squid.ambient" + }, + { + "id": 1261, + "name": "entity.squid.death" + }, + { + "id": 1262, + "name": "entity.squid.hurt" + }, + { + "id": 1263, + "name": "entity.squid.squirt" + }, + { + "id": 1264, + "name": "block.stone.break" + }, + { + "id": 1265, + "name": "block.stone_button.click_off" + }, + { + "id": 1266, + "name": "block.stone_button.click_on" + }, + { + "id": 1267, + "name": "block.stone.fall" + }, + { + "id": 1268, + "name": "block.stone.hit" + }, + { + "id": 1269, + "name": "block.stone.place" + }, + { + "id": 1270, + "name": "block.stone_pressure_plate.click_off" + }, + { + "id": 1271, + "name": "block.stone_pressure_plate.click_on" + }, + { + "id": 1272, + "name": "block.stone.step" + }, + { + "id": 1273, + "name": "entity.stray.ambient" + }, + { + "id": 1274, + "name": "entity.stray.death" + }, + { + "id": 1275, + "name": "entity.stray.hurt" + }, + { + "id": 1276, + "name": "entity.stray.step" + }, + { + "id": 1277, + "name": "block.sweet_berry_bush.break" + }, + { + "id": 1278, + "name": "block.sweet_berry_bush.place" + }, + { + "id": 1279, + "name": "block.sweet_berry_bush.pick_berries" + }, + { + "id": 1280, + "name": "entity.tadpole.death" + }, + { + "id": 1281, + "name": "entity.tadpole.flop" + }, + { + "id": 1282, + "name": "entity.tadpole.grow_up" + }, + { + "id": 1283, + "name": "entity.tadpole.hurt" + }, + { + "id": 1284, + "name": "enchant.thorns.hit" + }, + { + "id": 1285, + "name": "entity.tnt.primed" + }, + { + "id": 1286, + "name": "item.totem.use" + }, + { + "id": 1287, + "name": "item.trident.hit" + }, + { + "id": 1288, + "name": "item.trident.hit_ground" + }, + { + "id": 1289, + "name": "item.trident.return" + }, + { + "id": 1290, + "name": "item.trident.riptide_1" + }, + { + "id": 1291, + "name": "item.trident.riptide_2" + }, + { + "id": 1292, + "name": "item.trident.riptide_3" + }, + { + "id": 1293, + "name": "item.trident.throw" + }, + { + "id": 1294, + "name": "item.trident.thunder" + }, + { + "id": 1295, + "name": "block.tripwire.attach" + }, + { + "id": 1296, + "name": "block.tripwire.click_off" + }, + { + "id": 1297, + "name": "block.tripwire.click_on" + }, + { + "id": 1298, + "name": "block.tripwire.detach" + }, + { + "id": 1299, + "name": "entity.tropical_fish.ambient" + }, + { + "id": 1300, + "name": "entity.tropical_fish.death" + }, + { + "id": 1301, + "name": "entity.tropical_fish.flop" + }, + { + "id": 1302, + "name": "entity.tropical_fish.hurt" + }, + { + "id": 1303, + "name": "block.tuff.break" + }, + { + "id": 1304, + "name": "block.tuff.step" + }, + { + "id": 1305, + "name": "block.tuff.place" + }, + { + "id": 1306, + "name": "block.tuff.hit" + }, + { + "id": 1307, + "name": "block.tuff.fall" + }, + { + "id": 1308, + "name": "entity.turtle.ambient_land" + }, + { + "id": 1309, + "name": "entity.turtle.death" + }, + { + "id": 1310, + "name": "entity.turtle.death_baby" + }, + { + "id": 1311, + "name": "entity.turtle.egg_break" + }, + { + "id": 1312, + "name": "entity.turtle.egg_crack" + }, + { + "id": 1313, + "name": "entity.turtle.egg_hatch" + }, + { + "id": 1314, + "name": "entity.turtle.hurt" + }, + { + "id": 1315, + "name": "entity.turtle.hurt_baby" + }, + { + "id": 1316, + "name": "entity.turtle.lay_egg" + }, + { + "id": 1317, + "name": "entity.turtle.shamble" + }, + { + "id": 1318, + "name": "entity.turtle.shamble_baby" + }, + { + "id": 1319, + "name": "entity.turtle.swim" + }, + { + "id": 1320, + "name": "ui.button.click" + }, + { + "id": 1321, + "name": "ui.loom.select_pattern" + }, + { + "id": 1322, + "name": "ui.loom.take_result" + }, + { + "id": 1323, + "name": "ui.cartography_table.take_result" + }, + { + "id": 1324, + "name": "ui.stonecutter.take_result" + }, + { + "id": 1325, + "name": "ui.stonecutter.select_recipe" + }, + { + "id": 1326, + "name": "ui.toast.challenge_complete" + }, + { + "id": 1327, + "name": "ui.toast.in" + }, + { + "id": 1328, + "name": "ui.toast.out" + }, + { + "id": 1329, + "name": "entity.vex.ambient" + }, + { + "id": 1330, + "name": "entity.vex.charge" + }, + { + "id": 1331, + "name": "entity.vex.death" + }, + { + "id": 1332, + "name": "entity.vex.hurt" + }, + { + "id": 1333, + "name": "entity.villager.ambient" + }, + { + "id": 1334, + "name": "entity.villager.celebrate" + }, + { + "id": 1335, + "name": "entity.villager.death" + }, + { + "id": 1336, + "name": "entity.villager.hurt" + }, + { + "id": 1337, + "name": "entity.villager.no" + }, + { + "id": 1338, + "name": "entity.villager.trade" + }, + { + "id": 1339, + "name": "entity.villager.yes" + }, + { + "id": 1340, + "name": "entity.villager.work_armorer" + }, + { + "id": 1341, + "name": "entity.villager.work_butcher" + }, + { + "id": 1342, + "name": "entity.villager.work_cartographer" + }, + { + "id": 1343, + "name": "entity.villager.work_cleric" + }, + { + "id": 1344, + "name": "entity.villager.work_farmer" + }, + { + "id": 1345, + "name": "entity.villager.work_fisherman" + }, + { + "id": 1346, + "name": "entity.villager.work_fletcher" + }, + { + "id": 1347, + "name": "entity.villager.work_leatherworker" + }, + { + "id": 1348, + "name": "entity.villager.work_librarian" + }, + { + "id": 1349, + "name": "entity.villager.work_mason" + }, + { + "id": 1350, + "name": "entity.villager.work_shepherd" + }, + { + "id": 1351, + "name": "entity.villager.work_toolsmith" + }, + { + "id": 1352, + "name": "entity.villager.work_weaponsmith" + }, + { + "id": 1353, + "name": "entity.vindicator.ambient" + }, + { + "id": 1354, + "name": "entity.vindicator.celebrate" + }, + { + "id": 1355, + "name": "entity.vindicator.death" + }, + { + "id": 1356, + "name": "entity.vindicator.hurt" + }, + { + "id": 1357, + "name": "block.vine.break" + }, + { + "id": 1358, + "name": "block.vine.fall" + }, + { + "id": 1359, + "name": "block.vine.hit" + }, + { + "id": 1360, + "name": "block.vine.place" + }, + { + "id": 1361, + "name": "block.vine.step" + }, + { + "id": 1362, + "name": "block.lily_pad.place" + }, + { + "id": 1363, + "name": "entity.wandering_trader.ambient" + }, + { + "id": 1364, + "name": "entity.wandering_trader.death" + }, + { + "id": 1365, + "name": "entity.wandering_trader.disappeared" + }, + { + "id": 1366, + "name": "entity.wandering_trader.drink_milk" + }, + { + "id": 1367, + "name": "entity.wandering_trader.drink_potion" + }, + { + "id": 1368, + "name": "entity.wandering_trader.hurt" + }, + { + "id": 1369, + "name": "entity.wandering_trader.no" + }, + { + "id": 1370, + "name": "entity.wandering_trader.reappeared" + }, + { + "id": 1371, + "name": "entity.wandering_trader.trade" + }, + { + "id": 1372, + "name": "entity.wandering_trader.yes" + }, + { + "id": 1373, + "name": "entity.warden.agitated" + }, + { + "id": 1374, + "name": "entity.warden.ambient" + }, + { + "id": 1375, + "name": "entity.warden.angry" + }, + { + "id": 1376, + "name": "entity.warden.attack_impact" + }, + { + "id": 1377, + "name": "entity.warden.death" + }, + { + "id": 1378, + "name": "entity.warden.dig" + }, + { + "id": 1379, + "name": "entity.warden.emerge" + }, + { + "id": 1380, + "name": "entity.warden.heartbeat" + }, + { + "id": 1381, + "name": "entity.warden.hurt" + }, + { + "id": 1382, + "name": "entity.warden.listening" + }, + { + "id": 1383, + "name": "entity.warden.listening_angry" + }, + { + "id": 1384, + "name": "entity.warden.nearby_close" + }, + { + "id": 1385, + "name": "entity.warden.nearby_closer" + }, + { + "id": 1386, + "name": "entity.warden.nearby_closest" + }, + { + "id": 1387, + "name": "entity.warden.roar" + }, + { + "id": 1388, + "name": "entity.warden.sniff" + }, + { + "id": 1389, + "name": "entity.warden.sonic_boom" + }, + { + "id": 1390, + "name": "entity.warden.sonic_charge" + }, + { + "id": 1391, + "name": "entity.warden.step" + }, + { + "id": 1392, + "name": "entity.warden.tendril_clicks" + }, + { + "id": 1393, + "name": "block.sign.waxed_interact_fail" + }, + { + "id": 1394, + "name": "block.water.ambient" + }, + { + "id": 1395, + "name": "weather.rain" + }, + { + "id": 1396, + "name": "weather.rain.above" + }, + { + "id": 1397, + "name": "block.wet_grass.break" + }, + { + "id": 1398, + "name": "block.wet_grass.fall" + }, + { + "id": 1399, + "name": "block.wet_grass.hit" + }, + { + "id": 1400, + "name": "block.wet_grass.place" + }, + { + "id": 1401, + "name": "block.wet_grass.step" + }, + { + "id": 1402, + "name": "entity.witch.ambient" + }, + { + "id": 1403, + "name": "entity.witch.celebrate" + }, + { + "id": 1404, + "name": "entity.witch.death" + }, + { + "id": 1405, + "name": "entity.witch.drink" + }, + { + "id": 1406, + "name": "entity.witch.hurt" + }, + { + "id": 1407, + "name": "entity.witch.throw" + }, + { + "id": 1408, + "name": "entity.wither.ambient" + }, + { + "id": 1409, + "name": "entity.wither.break_block" + }, + { + "id": 1410, + "name": "entity.wither.death" + }, + { + "id": 1411, + "name": "entity.wither.hurt" + }, + { + "id": 1412, + "name": "entity.wither.shoot" + }, + { + "id": 1413, + "name": "entity.wither_skeleton.ambient" + }, + { + "id": 1414, + "name": "entity.wither_skeleton.death" + }, + { + "id": 1415, + "name": "entity.wither_skeleton.hurt" + }, + { + "id": 1416, + "name": "entity.wither_skeleton.step" + }, + { + "id": 1417, + "name": "entity.wither.spawn" + }, + { + "id": 1418, + "name": "entity.wolf.ambient" + }, + { + "id": 1419, + "name": "entity.wolf.death" + }, + { + "id": 1420, + "name": "entity.wolf.growl" + }, + { + "id": 1421, + "name": "entity.wolf.howl" + }, + { + "id": 1422, + "name": "entity.wolf.hurt" + }, + { + "id": 1423, + "name": "entity.wolf.pant" + }, + { + "id": 1424, + "name": "entity.wolf.shake" + }, + { + "id": 1425, + "name": "entity.wolf.step" + }, + { + "id": 1426, + "name": "entity.wolf.whine" + }, + { + "id": 1427, + "name": "block.wooden_door.close" + }, + { + "id": 1428, + "name": "block.wooden_door.open" + }, + { + "id": 1429, + "name": "block.wooden_trapdoor.close" + }, + { + "id": 1430, + "name": "block.wooden_trapdoor.open" + }, + { + "id": 1431, + "name": "block.wooden_button.click_off" + }, + { + "id": 1432, + "name": "block.wooden_button.click_on" + }, + { + "id": 1433, + "name": "block.wooden_pressure_plate.click_off" + }, + { + "id": 1434, + "name": "block.wooden_pressure_plate.click_on" + }, + { + "id": 1435, + "name": "block.wood.break" + }, + { + "id": 1436, + "name": "block.wood.fall" + }, + { + "id": 1437, + "name": "block.wood.hit" + }, + { + "id": 1438, + "name": "block.wood.place" + }, + { + "id": 1439, + "name": "block.wood.step" + }, + { + "id": 1440, + "name": "block.wool.break" + }, + { + "id": 1441, + "name": "block.wool.fall" + }, + { + "id": 1442, + "name": "block.wool.hit" + }, + { + "id": 1443, + "name": "block.wool.place" + }, + { + "id": 1444, + "name": "block.wool.step" + }, + { + "id": 1445, + "name": "entity.zoglin.ambient" + }, + { + "id": 1446, + "name": "entity.zoglin.angry" + }, + { + "id": 1447, + "name": "entity.zoglin.attack" + }, + { + "id": 1448, + "name": "entity.zoglin.death" + }, + { + "id": 1449, + "name": "entity.zoglin.hurt" + }, + { + "id": 1450, + "name": "entity.zoglin.step" + }, + { + "id": 1451, + "name": "entity.zombie.ambient" + }, + { + "id": 1452, + "name": "entity.zombie.attack_wooden_door" + }, + { + "id": 1453, + "name": "entity.zombie.attack_iron_door" + }, + { + "id": 1454, + "name": "entity.zombie.break_wooden_door" + }, + { + "id": 1455, + "name": "entity.zombie.converted_to_drowned" + }, + { + "id": 1456, + "name": "entity.zombie.death" + }, + { + "id": 1457, + "name": "entity.zombie.destroy_egg" + }, + { + "id": 1458, + "name": "entity.zombie_horse.ambient" + }, + { + "id": 1459, + "name": "entity.zombie_horse.death" + }, + { + "id": 1460, + "name": "entity.zombie_horse.hurt" + }, + { + "id": 1461, + "name": "entity.zombie.hurt" + }, + { + "id": 1462, + "name": "entity.zombie.infect" + }, + { + "id": 1463, + "name": "entity.zombified_piglin.ambient" + }, + { + "id": 1464, + "name": "entity.zombified_piglin.angry" + }, + { + "id": 1465, + "name": "entity.zombified_piglin.death" + }, + { + "id": 1466, + "name": "entity.zombified_piglin.hurt" + }, + { + "id": 1467, + "name": "entity.zombie.step" + }, + { + "id": 1468, + "name": "entity.zombie_villager.ambient" + }, + { + "id": 1469, + "name": "entity.zombie_villager.converted" + }, + { + "id": 1470, + "name": "entity.zombie_villager.cure" + }, + { + "id": 1471, + "name": "entity.zombie_villager.death" + }, + { + "id": 1472, + "name": "entity.zombie_villager.hurt" + }, + { + "id": 1473, + "name": "entity.zombie_villager.step" + } +] \ No newline at end of file diff --git a/vendor/valence/crates/valence_generated/src/block.rs b/vendor/valence/crates/valence_generated/src/block.rs new file mode 100644 index 00000000..50075709 --- /dev/null +++ b/vendor/valence/crates/valence_generated/src/block.rs @@ -0,0 +1,83 @@ +#![allow(clippy::all)] // TODO: block build script creates many warnings. + +use std::fmt; +use std::fmt::Display; +use std::iter::FusedIterator; + +use valence_ident::{ident, Ident}; + +use crate::item::ItemKind; + +include!(concat!(env!("OUT_DIR"), "/block.rs")); + +impl fmt::Debug for BlockState { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + fmt_block_state(*self, f) + } +} + +impl Display for BlockState { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + fmt_block_state(*self, f) + } +} + +fn fmt_block_state(bs: BlockState, f: &mut fmt::Formatter) -> fmt::Result { + let kind = bs.to_kind(); + + write!(f, "{}", kind.to_str())?; + + let props = kind.props(); + + if !props.is_empty() { + let mut list = f.debug_list(); + for &p in kind.props() { + struct KeyVal<'a>(&'a str, &'a str); + + impl<'a> fmt::Debug for KeyVal<'a> { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}={}", self.0, self.1) + } + } + + list.entry(&KeyVal(p.to_str(), bs.get(p).unwrap().to_str())); + } + list.finish() + } else { + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn get_set_consistency() { + for kind in BlockKind::ALL { + let block = kind.to_state(); + + for &prop in kind.props() { + let new_block = block.set(prop, block.get(prop).unwrap()); + assert_eq!(new_block, block); + } + } + } + + #[test] + fn blockstate_to_wall() { + assert_eq!(BlockState::STONE.wall_block_id(), None); + assert_eq!( + BlockState::OAK_SIGN.wall_block_id(), + Some(BlockState::OAK_WALL_SIGN) + ); + assert_eq!( + BlockState::GREEN_BANNER.wall_block_id(), + Some(BlockState::GREEN_WALL_BANNER) + ); + assert_ne!( + BlockState::GREEN_BANNER.wall_block_id(), + Some(BlockState::GREEN_BANNER) + ); + } +} diff --git a/vendor/valence/crates/valence_generated/src/lib.rs b/vendor/valence/crates/valence_generated/src/lib.rs new file mode 100644 index 00000000..28966301 --- /dev/null +++ b/vendor/valence/crates/valence_generated/src/lib.rs @@ -0,0 +1,26 @@ +pub mod block; + +pub mod attributes { + include!(concat!(env!("OUT_DIR"), "/attributes.rs")); +} + +pub mod item { + include!(concat!(env!("OUT_DIR"), "/item.rs")); +} + +pub mod sound { + include!(concat!(env!("OUT_DIR"), "/sound.rs")); +} + +/// Contains constants for every vanilla packet ID. +pub mod packet_id { + include!(concat!(env!("OUT_DIR"), "/packet_id.rs")); +} + +pub mod chunk_view { + include!(concat!(env!("OUT_DIR"), "/chunk_view.rs")); +} + +pub mod status_effects { + include!(concat!(env!("OUT_DIR"), "/status_effects.rs")); +} diff --git a/vendor/valence/crates/valence_ident/Cargo.toml b/vendor/valence/crates/valence_ident/Cargo.toml new file mode 100644 index 00000000..c6476094 --- /dev/null +++ b/vendor/valence/crates/valence_ident/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "valence_ident" +description = "Parse and create Minecraft's resource identifiers" +readme = "README.md" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[dependencies] +bytes.workspace = true +thiserror.workspace = true +serde.workspace = true +valence_bytes.workspace = true +valence_ident_macros.workspace = true diff --git a/vendor/valence/crates/valence_ident/README.md b/vendor/valence/crates/valence_ident/README.md new file mode 100644 index 00000000..53f68957 --- /dev/null +++ b/vendor/valence/crates/valence_ident/README.md @@ -0,0 +1,3 @@ +# valence_ident + +A library for parsing Minecraft's [resource locations](https://minecraft.wiki/w/Resource_location) (also known as "resource identifiers" and "namespaced IDs") diff --git a/vendor/valence/crates/valence_ident/src/lib.rs b/vendor/valence/crates/valence_ident/src/lib.rs new file mode 100644 index 00000000..6936ec5c --- /dev/null +++ b/vendor/valence/crates/valence_ident/src/lib.rs @@ -0,0 +1,268 @@ +#![doc = include_str!("../README.md")] + +use std::borrow::Borrow; +use std::fmt; +use std::fmt::Formatter; + +use bytes::Bytes; +use serde::de::Error as _; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use thiserror::Error; +/// Used internally by the `ident` macro. Not public API. +#[doc(hidden)] +pub use valence_bytes::Utf8Bytes; +/// Used internally by the `ident` macro. Not public API. +#[doc(hidden)] +pub use valence_ident_macros::parse_ident_str; + +/// Creates a new [`Ident`] at compile time from a string literal. A compile +/// error is raised if the string is not a valid resource identifier. +/// +/// The type of the expression returned by this macro is `Ident`. +/// The expression is usable in a `const` context. +/// +/// # Examples +/// +/// ``` +/// # use valence_ident::{ident, Ident}; +/// let my_ident: Ident = ident!("apple"); +/// +/// println!("{my_ident}"); +/// ``` +#[macro_export] +macro_rules! ident { + ($string:literal) => { + // SAFETY: parse_ident_str returns a &'static str, which is guaranteed to be + // valid UTF-8 + unsafe { + $crate::Ident::new_unchecked($crate::Utf8Bytes::from_static($crate::parse_ident_str!( + $string + ))) + } + }; +} + +/// A wrapper around [`Utf8Bytes`] which guarantees the wrapped string is a +/// valid resource identifier. +/// +/// A resource identifier is a string divided into a "namespace" part and a +/// "path" part. For instance `minecraft:apple` and `valence:frobnicator` are +/// both valid identifiers. A string must match the regex +/// `^([a-z0-9_.-]+:)?[a-z0-9_.-\/]+$` to be successfully parsed. +/// +/// While parsing, if the namespace part is left off (the part before and +/// including the colon) then "minecraft:" is inserted at the beginning of the +/// string. +#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub struct Ident { + string: Utf8Bytes, +} + +/// The error type created when an [`Ident`] cannot be parsed from a +/// string. Contains the string that failed to parse. +#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Error)] +#[error("invalid resource identifier \"{0}\"")] +pub struct IdentError(pub Utf8Bytes); + +impl Ident { + pub fn is_valid(string: &str) -> bool { + match string.split_once(':') { + Some((namespace, path)) => check_namespace(namespace) && check_path(path), + None => check_path(string), + } + } + + pub fn new(string: impl Into) -> Result { + parse(string.into()) + } + + /// Used internally by the `ident` macro. Not public API. + #[doc(hidden)] + pub const fn new_unchecked(string: Utf8Bytes) -> Self { + Self { string } + } + + pub fn as_str(&self) -> &str { + &self.string + } + + pub fn into_inner(self) -> Utf8Bytes { + self.string + } + + /// Returns the namespace part of this resource identifier (the part before + /// the colon). + pub fn namespace(&self) -> &str { + self.namespace_and_path().0 + } + + /// Returns the path part of this resource identifier (the part after the + /// colon). + pub fn path(&self) -> &str { + self.namespace_and_path().1 + } + + pub fn namespace_and_path(&self) -> (&str, &str) { + self.as_str() + .split_once(':') + .expect("invalid resource identifier") + } +} + +fn check_namespace(s: &str) -> bool { + !s.is_empty() + && s.chars() + .all(|c| matches!(c, 'a'..='z' | '0'..='9' | '_' | '.' | '-')) +} + +fn check_path(s: &str) -> bool { + !s.is_empty() + && s.chars() + .all(|c| matches!(c, 'a'..='z' | '0'..='9' | '_' | '.' | '-' | '/')) +} + +fn parse(string: Utf8Bytes) -> Result { + match string.split_once(':') { + Some((namespace, path)) if check_namespace(namespace) && check_path(path) => { + Ok(Ident::new_unchecked(string)) + } + None if check_path(&string) => { + let string = format!("minecraft:{string}").into(); + Ok(Ident::new_unchecked(string)) + } + _ => Err(IdentError(string)), + } +} + +impl AsRef for Ident { + fn as_ref(&self) -> &str { + self.as_str() + } +} + +impl Borrow for Ident { + fn borrow(&self) -> &str { + self.as_ref() + } +} + +impl From for String { + fn from(value: Ident) -> Self { + value.as_str().to_owned() + } +} + +impl TryFrom for Ident { + type Error = IdentError; + + fn try_from(value: Utf8Bytes) -> Result { + parse(value) + } +} + +// TODO: +// impl FromStr for Ident { +// type Err = IdentError; +// +// fn from_str(s: &str) -> Result { +// Ok(Ident::new(s)?.into()) +// } +// } +// +// impl<'a> TryFrom<&'a str> for Ident { +// type Error = IdentError; +// +// fn try_from(value: &'a str) -> Result { +// Ok(Ident::new(value)?.into()) +// } +// } +// +// impl TryFrom for Ident { +// type Error = IdentError; +// +// fn try_from(value: String) -> Result { +// Ok(Ident::new(value)?.into()) +// } +// } +// +// impl<'a> TryFrom> for Ident { +// type Error = IdentError; +// +// fn try_from(value: Cow<'a, str>) -> Result { +// Ok(Ident::new(value)?.into()) +// } +// } + +impl fmt::Debug for Ident { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + self.as_ref().fmt(f) + } +} + +impl fmt::Display for Ident { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + self.as_ref().fmt(f) + } +} + +impl Serialize for Ident { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + self.string.serialize(serializer) + } +} + +impl<'de> Deserialize<'de> for Ident { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let bytes = Bytes::from_owner(String::deserialize(deserializer)?); + let bytes = Utf8Bytes::try_from(bytes).map_err(D::Error::custom)?; + Ident::try_from(bytes).map_err(D::Error::custom) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn check_namespace_and_path() { + let id = ident!("namespace:path"); + assert_eq!(id.namespace(), "namespace"); + assert_eq!(id.path(), "path"); + } + + #[test] + fn parse_valid() { + ident!("minecraft:whatever"); + ident!("_what-ever55_:.whatever/whatever123456789_"); + ident!("valence:frobnicator"); + } + + #[test] + #[should_panic] + fn parse_invalid_0() { + Ident::new("").unwrap(); + } + + #[test] + #[should_panic] + fn parse_invalid_1() { + Ident::new(":").unwrap(); + } + + #[test] + #[should_panic] + fn parse_invalid_2() { + Ident::new("foo:bar:baz").unwrap(); + } + + #[test] + fn equality() { + assert_eq!(ident!("minecraft:my.identifier"), ident!("my.identifier")); + } +} diff --git a/vendor/valence/crates/valence_ident_macros/Cargo.toml b/vendor/valence/crates/valence_ident_macros/Cargo.toml new file mode 100644 index 00000000..f83651c8 --- /dev/null +++ b/vendor/valence/crates/valence_ident_macros/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "valence_ident_macros" +description = "Procedural macros for valence_ident" +readme = "README.md" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[lib] +proc-macro = true + +[dependencies] +proc-macro2.workspace = true +quote.workspace = true +syn = { workspace = true, features = ["full"] } diff --git a/vendor/valence/crates/valence_ident_macros/README.md b/vendor/valence/crates/valence_ident_macros/README.md new file mode 100644 index 00000000..d6c164fc --- /dev/null +++ b/vendor/valence/crates/valence_ident_macros/README.md @@ -0,0 +1,3 @@ +# valence_ident_macros + +Proc macros for `valence_ident`. diff --git a/vendor/valence/crates/valence_ident_macros/src/lib.rs b/vendor/valence/crates/valence_ident_macros/src/lib.rs new file mode 100644 index 00000000..a8abb77c --- /dev/null +++ b/vendor/valence/crates/valence_ident_macros/src/lib.rs @@ -0,0 +1,45 @@ +#![doc = include_str!("../README.md")] + +use proc_macro::TokenStream as StdTokenStream; +use proc_macro2::TokenStream; +use quote::quote; +use syn::{parse2, Error, LitStr, Result}; + +#[proc_macro] +pub fn parse_ident_str(item: StdTokenStream) -> StdTokenStream { + parse_ident_str_inner(item.into()) + .unwrap_or_else(Error::into_compile_error) + .into() +} + +fn parse_ident_str_inner(item: TokenStream) -> Result { + let ident_lit: LitStr = parse2(item)?; + let mut ident = ident_lit.value(); + + match ident.split_once(':') { + Some((namespace, path)) if check_namespace(namespace) && check_path(path) => {} + None if check_path(&ident) => { + ident = format!("minecraft:{ident}"); + } + _ => { + return Err(syn::Error::new( + ident_lit.span(), + "string cannot be parsed as a resource identifier", + )); + } + } + + Ok(quote!(#ident)) +} + +fn check_namespace(s: &str) -> bool { + !s.is_empty() + && s.chars() + .all(|c| matches!(c, 'a'..='z' | '0'..='9' | '_' | '.' | '-')) +} + +fn check_path(s: &str) -> bool { + !s.is_empty() + && s.chars() + .all(|c| matches!(c, 'a'..='z' | '0'..='9' | '_' | '.' | '-' | '/')) +} diff --git a/vendor/valence/crates/valence_inventory/Cargo.toml b/vendor/valence/crates/valence_inventory/Cargo.toml new file mode 100644 index 00000000..f38aa99a --- /dev/null +++ b/vendor/valence/crates/valence_inventory/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "valence_inventory" +description = "Inventory support for Valence" +readme = "README.md" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[dependencies] +bevy_app.workspace = true +bevy_ecs.workspace = true +derive_more.workspace = true +tracing.workspace = true +valence_server.workspace = true diff --git a/vendor/valence/crates/valence_inventory/README.md b/vendor/valence/crates/valence_inventory/README.md new file mode 100644 index 00000000..d5b2615b --- /dev/null +++ b/vendor/valence/crates/valence_inventory/README.md @@ -0,0 +1,31 @@ +# valence_inventory + +The inventory system. + +This module contains the systems and components needed to handle +inventories. By default, clients will have a player inventory attached to +them. + +# Components + +- [`Inventory`]: The inventory component. This is the thing that holds + items. +- [`OpenInventory`]: The component that is attached to clients when they + have an inventory open. + +# Examples + +An example system that will let you access all player's inventories: + +``` +# use bevy_ecs::prelude::*; +# use valence_inventory::*; +# use valence_server::client::Client; +fn system(clients: Query<(&Client, &Inventory)>) {} +``` + +### See also + +Examples related to inventories in the `valence/examples/` directory: +- `building` +- `chest` diff --git a/vendor/valence/crates/valence_inventory/src/lib.rs b/vendor/valence/crates/valence_inventory/src/lib.rs new file mode 100644 index 00000000..6e450eac --- /dev/null +++ b/vendor/valence/crates/valence_inventory/src/lib.rs @@ -0,0 +1,1449 @@ +#![doc = include_str!("../README.md")] +#![deny( + rustdoc::broken_intra_doc_links, + rustdoc::private_intra_doc_links, + rustdoc::missing_crate_level_docs, + rustdoc::invalid_codeblock_attributes, + rustdoc::invalid_rust_codeblocks, + rustdoc::bare_urls, + rustdoc::invalid_html_tags +)] +#![warn( + trivial_casts, + trivial_numeric_casts, + unused_lifetimes, + unused_import_braces, + unreachable_pub, + clippy::dbg_macro +)] +#![allow(clippy::type_complexity)] + +use std::borrow::Cow; +use std::iter::FusedIterator; +use std::num::Wrapping; +use std::ops::Range; + +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use derive_more::{Deref, DerefMut}; +use player_inventory::PlayerInventory; +use tracing::{debug, warn}; +use valence_server::client::{Client, FlushPacketsSet, SpawnClientsSet}; +use valence_server::event_loop::{EventLoopPreUpdate, PacketEvent}; +pub use valence_server::protocol::packets::play::click_slot_c2s::{ClickMode, SlotChange}; +use valence_server::protocol::packets::play::open_screen_s2c::WindowType; +pub use valence_server::protocol::packets::play::player_action_c2s::PlayerAction; +use valence_server::protocol::packets::play::{ + ClickSlotC2s, CloseHandledScreenC2s, CloseScreenS2c, CreativeInventoryActionC2s, InventoryS2c, + OpenScreenS2c, PlayerActionC2s, ScreenHandlerSlotUpdateS2c, UpdateSelectedSlotC2s, + UpdateSelectedSlotS2c, +}; +use valence_server::protocol::{VarInt, WritePacket}; +use valence_server::text::IntoText; +use valence_server::{GameMode, ItemKind, ItemStack, Text}; + +pub mod player_inventory; +mod validate; + +pub struct InventoryPlugin; + +impl Plugin for InventoryPlugin { + fn build(&self, app: &mut bevy_app::App) { + app.add_systems( + PreUpdate, + init_new_client_inventories.after(SpawnClientsSet), + ) + .add_systems( + PostUpdate, + ( + update_client_on_close_inventory.before(update_open_inventories), + update_player_selected_slot, + update_open_inventories, + update_player_inventories, + ) + .before(FlushPacketsSet), + ) + .add_systems( + EventLoopPreUpdate, + ( + handle_update_selected_slot, + handle_click_slot, + handle_creative_inventory_action, + handle_close_handled_screen, + handle_player_actions, + ), + ) + .init_resource::() + .add_event::() + .add_event::() + .add_event::() + .add_event::(); + } +} + +#[derive(Debug, Clone, Component)] +pub struct Inventory { + title: Text, + kind: InventoryKind, + slots: Box<[ItemStack]>, + /// Contains a set bit for each modified slot in `slots`. + #[doc(hidden)] + pub changed: u64, +} + +impl Inventory { + pub fn new(kind: InventoryKind) -> Self { + // TODO: default title to the correct translation key instead + Self::with_title(kind, "Inventory") + } + + pub fn with_title<'a>(kind: InventoryKind, title: impl IntoText<'a>) -> Self { + Inventory { + title: title.into_cow_text().into_owned(), + kind, + slots: vec![ItemStack::EMPTY; kind.slot_count()].into(), + changed: 0, + } + } + + #[track_caller] + pub fn slot(&self, idx: u16) -> &ItemStack { + self.slots + .get(idx as usize) + .expect("slot index out of range") + } + + /// Sets the slot at the given index to the given item stack. + /// + /// See also [`Inventory::replace_slot`]. + /// + /// ``` + /// # use valence_inventory::*; + /// # use valence_server::item::{ItemStack, ItemKind}; + /// let mut inv = Inventory::new(InventoryKind::Generic9x1); + /// inv.set_slot(0, ItemStack::new(ItemKind::Diamond, 1, None)); + /// assert_eq!(inv.slot(0).item, ItemKind::Diamond); + /// ``` + #[track_caller] + #[inline] + pub fn set_slot(&mut self, idx: u16, item: impl Into) { + let _ = self.replace_slot(idx, item); + } + + /// Replaces the slot at the given index with the given item stack, and + /// returns the old stack in that slot. + /// + /// See also [`Inventory::set_slot`]. + /// + /// ``` + /// # use valence_inventory::*; + /// # use valence_server::item::{ItemStack, ItemKind}; + /// let mut inv = Inventory::new(InventoryKind::Generic9x1); + /// inv.set_slot(0, ItemStack::new(ItemKind::Diamond, 1, None)); + /// let old = inv.replace_slot(0, ItemStack::new(ItemKind::IronIngot, 1, None)); + /// assert_eq!(old.item, ItemKind::Diamond); + /// ``` + #[track_caller] + #[must_use] + pub fn replace_slot(&mut self, idx: u16, item: impl Into) -> ItemStack { + assert!(idx < self.slot_count(), "slot index of {idx} out of bounds"); + + let new = item.into(); + let old = &mut self.slots[idx as usize]; + + if new != *old { + self.changed |= 1 << idx; + } + + std::mem::replace(old, new) + } + + /// Swap the contents of two slots. If the slots are the same, nothing + /// happens. + /// + /// ``` + /// # use valence_inventory::*; + /// # use valence_server::item::{ItemStack, ItemKind}; + /// let mut inv = Inventory::new(InventoryKind::Generic9x1); + /// inv.set_slot(0, ItemStack::new(ItemKind::Diamond, 1, None)); + /// assert!(inv.slot(1).is_empty()); + /// inv.swap_slot(0, 1); + /// assert_eq!(inv.slot(1).item, ItemKind::Diamond); + /// ``` + #[track_caller] + pub fn swap_slot(&mut self, idx_a: u16, idx_b: u16) { + assert!( + idx_a < self.slot_count(), + "slot index of {idx_a} out of bounds" + ); + assert!( + idx_b < self.slot_count(), + "slot index of {idx_b} out of bounds" + ); + + if idx_a == idx_b || self.slots[idx_a as usize] == self.slots[idx_b as usize] { + // Nothing to do here, ignore. + return; + } + + self.changed |= 1 << idx_a; + self.changed |= 1 << idx_b; + + self.slots.swap(idx_a as usize, idx_b as usize); + } + + /// Set the amount of items in the given slot without replacing the slot + /// entirely. Valid values are 1-127, inclusive, and `amount` will be + /// clamped to this range. If the slot is empty, nothing happens. + /// + /// ``` + /// # use valence_inventory::*; + /// # use valence_server::item::{ItemStack, ItemKind}; + /// let mut inv = Inventory::new(InventoryKind::Generic9x1); + /// inv.set_slot(0, ItemStack::new(ItemKind::Diamond, 1, None)); + /// inv.set_slot_amount(0, 64); + /// assert_eq!(inv.slot(0).count, 64); + /// ``` + #[track_caller] + pub fn set_slot_amount(&mut self, idx: u16, amount: i8) { + assert!(idx < self.slot_count(), "slot index out of range"); + + let item = &mut self.slots[idx as usize]; + + if !item.is_empty() { + if item.count == amount { + return; + } + item.count = amount; + self.changed |= 1 << idx; + } + } + + pub fn slot_count(&self) -> u16 { + self.slots.len() as u16 + } + + pub fn slots( + &self, + ) -> impl ExactSizeIterator + DoubleEndedIterator + FusedIterator + Clone + '_ + { + self.slots.iter() + } + + pub fn kind(&self) -> InventoryKind { + self.kind + } + + /// The text displayed on the inventory's title bar. + /// + /// ``` + /// # use valence_inventory::*; + /// # use valence_server::item::{ItemStack, ItemKind}; + /// # use valence_server::text::Text; + /// let inv = Inventory::with_title(InventoryKind::Generic9x3, "Box of Holding"); + /// assert_eq!(inv.title(), &Text::from("Box of Holding")); + /// ``` + pub fn title(&self) -> &Text { + &self.title + } + + /// Set the text displayed on the inventory's title bar. + /// + /// To get the old title, use [`Inventory::replace_title`]. + /// + /// ``` + /// # use valence_inventory::*; + /// let mut inv = Inventory::new(InventoryKind::Generic9x3); + /// inv.set_title("Box of Holding"); + /// ``` + #[inline] + pub fn set_title<'a>(&mut self, title: impl IntoText<'a>) { + let _ = self.replace_title(title); + } + + /// Replace the text displayed on the inventory's title bar, and returns the + /// old text. + #[must_use] + pub fn replace_title<'a>(&mut self, title: impl IntoText<'a>) -> Text { + // TODO: set title modified flag + std::mem::replace(&mut self.title, title.into_cow_text().into_owned()) + } + + pub(crate) fn slot_slice(&self) -> &[ItemStack] { + &self.slots + } + + /// Returns the first empty slot in the given range, or `None` if there are + /// no empty slots in the range. + /// + /// ``` + /// # use valence_inventory::*; + /// # use valence_server::item::*; + /// let mut inv = Inventory::new(InventoryKind::Generic9x1); + /// inv.set_slot(0, ItemStack::new(ItemKind::Diamond, 1, None)); + /// inv.set_slot(2, ItemStack::new(ItemKind::GoldIngot, 1, None)); + /// inv.set_slot(3, ItemStack::new(ItemKind::IronIngot, 1, None)); + /// assert_eq!(inv.first_empty_slot_in(0..6), Some(1)); + /// assert_eq!(inv.first_empty_slot_in(2..6), Some(4)); + /// ``` + #[track_caller] + #[must_use] + pub fn first_empty_slot_in(&self, mut range: Range) -> Option { + assert!( + (0..=self.slot_count()).contains(&range.start) + && (0..=self.slot_count()).contains(&range.end), + "slot range out of range" + ); + + range.find(|&idx| self.slots[idx as usize].is_empty()) + } + + /// Returns the first empty slot in the inventory, or `None` if there are no + /// empty slots. + /// ``` + /// # use valence_inventory::*; + /// # use valence_server::item::*; + /// let mut inv = Inventory::new(InventoryKind::Generic9x1); + /// inv.set_slot(0, ItemStack::new(ItemKind::Diamond, 1, None)); + /// inv.set_slot(2, ItemStack::new(ItemKind::GoldIngot, 1, None)); + /// inv.set_slot(3, ItemStack::new(ItemKind::IronIngot, 1, None)); + /// assert_eq!(inv.first_empty_slot(), Some(1)); + /// ``` + #[inline] + pub fn first_empty_slot(&self) -> Option { + self.first_empty_slot_in(0..self.slot_count()) + } + + /// Returns the first slot with the given [`ItemKind`] in the inventory + /// where `count < stack_max`, or `None` if there are no empty slots. + /// ``` + /// # use valence_inventory::*; + /// # use valence_server::item::*; + /// let mut inv = Inventory::new(InventoryKind::Generic9x1); + /// inv.set_slot(0, ItemStack::new(ItemKind::Diamond, 1, None)); + /// inv.set_slot(2, ItemStack::new(ItemKind::GoldIngot, 64, None)); + /// inv.set_slot(3, ItemStack::new(ItemKind::IronIngot, 1, None)); + /// inv.set_slot(4, ItemStack::new(ItemKind::GoldIngot, 1, None)); + /// assert_eq!( + /// inv.first_slot_with_item_in(ItemKind::GoldIngot, 64, 0..5), + /// Some(4) + /// ); + /// ``` + pub fn first_slot_with_item_in( + &self, + item: ItemKind, + stack_max: i8, + mut range: Range, + ) -> Option { + assert!( + (0..=self.slot_count()).contains(&range.start) + && (0..=self.slot_count()).contains(&range.end), + "slot range out of range" + ); + assert!(stack_max > 0, "stack_max must be greater than 0"); + + range.find(|&idx| { + let stack = &self.slots[idx as usize]; + stack.item == item && stack.count < stack_max + }) + } + + /// Returns the first slot with the given [`ItemKind`] in the inventory + /// where `count < stack_max`, or `None` if there are no empty slots. + /// ``` + /// # use valence_inventory::*; + /// # use valence_server::item::*; + /// let mut inv = Inventory::new(InventoryKind::Generic9x1); + /// inv.set_slot(0, ItemStack::new(ItemKind::Diamond, 1, None)); + /// inv.set_slot(2, ItemStack::new(ItemKind::GoldIngot, 64, None)); + /// inv.set_slot(3, ItemStack::new(ItemKind::IronIngot, 1, None)); + /// inv.set_slot(4, ItemStack::new(ItemKind::GoldIngot, 1, None)); + /// assert_eq!(inv.first_slot_with_item(ItemKind::GoldIngot, 64), Some(4)); + /// ``` + #[inline] + pub fn first_slot_with_item(&self, item: ItemKind, stack_max: i8) -> Option { + self.first_slot_with_item_in(item, stack_max, 0..self.slot_count()) + } +} + +/// Miscellaneous inventory data. +#[derive(Component, Debug)] +pub struct ClientInventoryState { + /// The current window ID. Incremented when inventories are opened. + window_id: u8, + state_id: Wrapping, + /// Tracks what slots have been changed by this client in this tick, so we + /// don't need to send updates for them. + slots_changed: u64, + /// Whether the client has updated the cursor item in this tick. This is not + /// on the `CursorItem` component to make maintaining accurate change + /// detection for end users easier. + client_updated_cursor_item: bool, +} + +impl ClientInventoryState { + #[doc(hidden)] + pub fn window_id(&self) -> u8 { + self.window_id + } + + #[doc(hidden)] + pub fn state_id(&self) -> Wrapping { + self.state_id + } +} + +/// Indicates which hotbar slot the player is currently holding. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Component, Deref)] +pub struct HeldItem { + held_item_slot: u16, +} + +impl HeldItem { + /// The slot ID of the currently held item, in the range 36-44 inclusive. + /// This value is safe to use on the player's inventory directly. + pub fn slot(&self) -> u16 { + self.held_item_slot + } + + pub fn hotbar_idx(&self) -> u8 { + PlayerInventory::slot_to_hotbar(self.held_item_slot) + } + + pub fn set_slot(&mut self, slot: u16) { + // temp + assert!( + PlayerInventory::SLOTS_HOTBAR.contains(&slot), + "slot index of {slot} out of bounds" + ); + + self.held_item_slot = slot; + } + + pub fn set_hotbar_idx(&mut self, hotbar_idx: u8) { + self.set_slot(PlayerInventory::hotbar_to_slot(hotbar_idx)) + } +} + +/// The item stack that the client thinks it's holding under the mouse +/// cursor. +#[derive(Component, Clone, PartialEq, Default, Debug, Deref, DerefMut)] +pub struct CursorItem(pub ItemStack); + +/// Used to indicate that the client with this component is currently viewing +/// an inventory. +#[derive(Component, Clone, Debug)] +pub struct OpenInventory { + /// The entity with the `Inventory` component that the client is currently + /// viewing. + pub entity: Entity, + client_changed: u64, +} + +impl OpenInventory { + pub fn new(entity: Entity) -> Self { + OpenInventory { + entity, + client_changed: 0, + } + } +} + +/// A helper to represent the inventory window that the player is currently +/// viewing. Handles dispatching reads to the correct inventory. +/// +/// This is a read-only version of [`InventoryWindowMut`]. +/// +/// ``` +/// # use valence_inventory::*; +/// # use valence_server::item::*; +/// let mut player_inventory = Inventory::new(InventoryKind::Player); +/// player_inventory.set_slot(36, ItemStack::new(ItemKind::Diamond, 1, None)); +/// +/// let target_inventory = Inventory::new(InventoryKind::Generic9x3); +/// let window = InventoryWindow::new(&player_inventory, Some(&target_inventory)); +/// +/// assert_eq!(window.slot(54), &ItemStack::new(ItemKind::Diamond, 1, None)); +/// ``` +pub struct InventoryWindow<'a> { + player_inventory: &'a Inventory, + open_inventory: Option<&'a Inventory>, +} + +impl<'a> InventoryWindow<'a> { + pub fn new(player_inventory: &'a Inventory, open_inventory: Option<&'a Inventory>) -> Self { + Self { + player_inventory, + open_inventory, + } + } + + #[track_caller] + pub fn slot(&self, idx: u16) -> &ItemStack { + if let Some(open_inv) = self.open_inventory.as_ref() { + if idx < open_inv.slot_count() { + open_inv.slot(idx) + } else { + self.player_inventory + .slot(convert_to_player_slot_id(open_inv.kind(), idx)) + } + } else { + self.player_inventory.slot(idx) + } + } + + #[track_caller] + pub fn slot_count(&self) -> u16 { + if let Some(open_inv) = &self.open_inventory { + // when the window is split, we can only access the main slots of player's + // inventory + PlayerInventory::MAIN_SIZE + open_inv.slot_count() + } else { + self.player_inventory.slot_count() + } + } +} + +/// A helper to represent the inventory window that the player is currently +/// viewing. Handles dispatching reads/writes to the correct inventory. +/// +/// This is a writable version of [`InventoryWindow`]. +/// +/// ``` +/// # use valence_inventory::*; +/// # use valence_server::item::*; +/// let mut player_inventory = Inventory::new(InventoryKind::Player); +/// let mut target_inventory = Inventory::new(InventoryKind::Generic9x3); +/// let mut window = InventoryWindowMut::new(&mut player_inventory, Some(&mut target_inventory)); +/// +/// window.set_slot(54, ItemStack::new(ItemKind::Diamond, 1, None)); +/// +/// assert_eq!( +/// player_inventory.slot(36), +/// &ItemStack::new(ItemKind::Diamond, 1, None) +/// ); +/// ``` +pub struct InventoryWindowMut<'a> { + player_inventory: &'a mut Inventory, + open_inventory: Option<&'a mut Inventory>, +} + +impl<'a> InventoryWindowMut<'a> { + pub fn new( + player_inventory: &'a mut Inventory, + open_inventory: Option<&'a mut Inventory>, + ) -> Self { + Self { + player_inventory, + open_inventory, + } + } + + #[track_caller] + pub fn slot(&self, idx: u16) -> &ItemStack { + if let Some(open_inv) = self.open_inventory.as_ref() { + if idx < open_inv.slot_count() { + open_inv.slot(idx) + } else { + self.player_inventory + .slot(convert_to_player_slot_id(open_inv.kind(), idx)) + } + } else { + self.player_inventory.slot(idx) + } + } + + #[track_caller] + #[must_use] + pub fn replace_slot(&mut self, idx: u16, item: impl Into) -> ItemStack { + assert!(idx < self.slot_count(), "slot index of {idx} out of bounds"); + + if let Some(open_inv) = self.open_inventory.as_mut() { + if idx < open_inv.slot_count() { + open_inv.replace_slot(idx, item) + } else { + self.player_inventory + .replace_slot(convert_to_player_slot_id(open_inv.kind(), idx), item) + } + } else { + self.player_inventory.replace_slot(idx, item) + } + } + + #[track_caller] + #[inline] + pub fn set_slot(&mut self, idx: u16, item: impl Into) { + let _ = self.replace_slot(idx, item); + } + + pub fn slot_count(&self) -> u16 { + if let Some(open_inv) = &self.open_inventory { + // when the window is split, we can only access the main slots of player's + // inventory + PlayerInventory::MAIN_SIZE + open_inv.slot_count() + } else { + self.player_inventory.slot_count() + } + } +} + +/// Attach the necessary inventory components to new clients. +fn init_new_client_inventories(clients: Query>, mut commands: Commands) { + for entity in &clients { + commands.entity(entity).insert(( + Inventory::new(InventoryKind::Player), + CursorItem(ItemStack::EMPTY), + ClientInventoryState { + window_id: 0, + state_id: Wrapping(0), + slots_changed: 0, + client_updated_cursor_item: false, + }, + HeldItem { + // First slot of the hotbar. + held_item_slot: 36, + }, + )); + } +} + +/// Send updates for each client's player inventory. +fn update_player_inventories( + mut query: Query< + ( + &mut Inventory, + &mut Client, + &mut ClientInventoryState, + Ref, + ), + Without, + >, +) { + for (mut inventory, mut client, mut inv_state, cursor_item) in &mut query { + if inventory.kind != InventoryKind::Player { + warn!("Inventory on client entity is not a player inventory"); + } + + if inventory.changed == u64::MAX { + // Update the whole inventory. + + inv_state.state_id += 1; + + client.write_packet(&InventoryS2c { + window_id: 0, + state_id: VarInt(inv_state.state_id.0), + slots: Cow::Borrowed(inventory.slot_slice()), + carried_item: Cow::Borrowed(&cursor_item.0), + }); + + inventory.changed = 0; + inv_state.slots_changed = 0; + + // Skip updating the cursor item because we just updated the whole inventory. + continue; + } else if inventory.changed != 0 { + // Send the modified slots. + + // The slots that were NOT modified by this client, and they need to be sent + let changed_filtered = inventory.changed & !inv_state.slots_changed; + + if changed_filtered != 0 { + inv_state.state_id += 1; + + for (i, slot) in inventory.slots.iter().enumerate() { + if ((changed_filtered >> i) & 1) == 1 { + client.write_packet(&ScreenHandlerSlotUpdateS2c { + window_id: 0, + state_id: VarInt(inv_state.state_id.0), + slot_idx: i as i16, + slot_data: Cow::Borrowed(slot), + }); + } + } + } + + inventory.changed = 0; + inv_state.slots_changed = 0; + } + + if cursor_item.is_changed() && !inv_state.client_updated_cursor_item { + // Contrary to what you might think, we actually don't want to increment the + // state ID here because the client doesn't actually acknowledge the + // state_id change for this packet specifically. See #304. + + client.write_packet(&ScreenHandlerSlotUpdateS2c { + window_id: -1, + state_id: VarInt(inv_state.state_id.0), + slot_idx: -1, + slot_data: Cow::Borrowed(&cursor_item.0), + }); + } + + inv_state.client_updated_cursor_item = false; + } +} + +/// Handles the `OpenInventory` component being added to a client, which +/// indicates that the client is now viewing an inventory, and sends inventory +/// updates to the client when the inventory is modified. +fn update_open_inventories( + mut clients: Query<( + Entity, + &mut Client, + &mut ClientInventoryState, + &CursorItem, + &mut OpenInventory, + )>, + mut inventories: Query<&mut Inventory>, + mut commands: Commands, +) { + // These operations need to happen in this order. + + // Send the inventory contents to all clients that are viewing an inventory. + for (client_entity, mut client, mut inv_state, cursor_item, mut open_inventory) in &mut clients + { + // Validate that the inventory exists. + let Ok(mut inventory) = inventories.get_mut(open_inventory.entity) else { + // The inventory no longer exists, so close the inventory. + commands.entity(client_entity).remove::(); + + client.write_packet(&CloseScreenS2c { + window_id: inv_state.window_id, + }); + + continue; + }; + + if open_inventory.is_added() { + // Send the inventory to the client if the client just opened the inventory. + inv_state.window_id = inv_state.window_id % 100 + 1; + open_inventory.client_changed = 0; + + client.write_packet(&OpenScreenS2c { + window_id: VarInt(inv_state.window_id.into()), + window_type: WindowType::from(inventory.kind), + window_title: Cow::Borrowed(&inventory.title), + }); + + client.write_packet(&InventoryS2c { + window_id: inv_state.window_id, + state_id: VarInt(inv_state.state_id.0), + slots: Cow::Borrowed(inventory.slot_slice()), + carried_item: Cow::Borrowed(&cursor_item.0), + }); + } else { + // The client is already viewing the inventory. + + if inventory.changed == u64::MAX { + // Send the entire inventory. + + inv_state.state_id += 1; + + client.write_packet(&InventoryS2c { + window_id: inv_state.window_id, + state_id: VarInt(inv_state.state_id.0), + slots: Cow::Borrowed(inventory.slot_slice()), + carried_item: Cow::Borrowed(&cursor_item.0), + }) + } else { + // Send the changed slots. + + // The slots that were NOT changed by this client, and they need to be sent. + let changed_filtered = inventory.changed & !open_inventory.client_changed; + + if changed_filtered != 0 { + inv_state.state_id += 1; + + for (i, slot) in inventory.slots.iter().enumerate() { + if (changed_filtered >> i) & 1 == 1 { + client.write_packet(&ScreenHandlerSlotUpdateS2c { + window_id: inv_state.window_id as i8, + state_id: VarInt(inv_state.state_id.0), + slot_idx: i as i16, + slot_data: Cow::Borrowed(slot), + }); + } + } + } + } + } + + open_inventory.client_changed = 0; + inv_state.slots_changed = 0; + inv_state.client_updated_cursor_item = false; + inventory.changed = 0; + } +} + +/// Handles clients telling the server that they are closing an inventory. +fn handle_close_handled_screen(mut packets: EventReader, mut commands: Commands) { + for packet in packets.read() { + if packet.decode::().is_some() { + if let Some(mut entity) = commands.get_entity(packet.client) { + entity.remove::(); + } + } + } +} + +/// Detects when a client's `OpenInventory` component is removed, which +/// indicates that the client is no longer viewing an inventory. +fn update_client_on_close_inventory( + mut removals: RemovedComponents, + mut clients: Query<(&mut Client, &ClientInventoryState)>, +) { + for entity in &mut removals.read() { + if let Ok((mut client, inv_state)) = clients.get_mut(entity) { + client.write_packet(&CloseScreenS2c { + window_id: inv_state.window_id, + }) + } + } +} + +// TODO: make this event user friendly. +#[derive(Event, Clone, Debug)] +pub struct ClickSlotEvent { + pub client: Entity, + pub window_id: u8, + pub state_id: i32, + pub slot_id: i16, + pub button: i8, + pub mode: ClickMode, + pub slot_changes: Vec, + pub carried_item: ItemStack, +} + +#[derive(Event, Clone, Debug)] +pub struct DropItemStackEvent { + pub client: Entity, + pub from_slot: Option, + pub stack: ItemStack, +} + +fn handle_click_slot( + mut packets: EventReader, + mut clients: Query<( + &mut Client, + &mut Inventory, + &mut ClientInventoryState, + Option<&mut OpenInventory>, + &mut CursorItem, + )>, + mut inventories: Query<&mut Inventory, Without>, + mut drop_item_stack_events: EventWriter, + mut click_slot_events: EventWriter, +) { + for packet in packets.read() { + let Some(pkt) = packet.decode::() else { + // Not the packet we're looking for. + continue; + }; + + let Ok((mut client, mut client_inv, mut inv_state, open_inventory, mut cursor_item)) = + clients.get_mut(packet.client) + else { + // The client does not exist, ignore. + continue; + }; + + let open_inv = open_inventory + .as_ref() + .and_then(|open| inventories.get_mut(open.entity).ok()); + + if let Err(e) = validate::validate_click_slot_packet( + &pkt, + &client_inv, + open_inv.as_deref(), + &cursor_item, + ) { + debug!( + "failed to validate click slot packet for client {:#?}: \"{e:#}\" {pkt:#?}", + packet.client + ); + + // Resync the inventory. + + client.write_packet(&InventoryS2c { + window_id: if open_inv.is_some() { + inv_state.window_id + } else { + 0 + }, + state_id: VarInt(inv_state.state_id.0), + slots: Cow::Borrowed(open_inv.unwrap_or(client_inv).slot_slice()), + carried_item: Cow::Borrowed(&cursor_item.0), + }); + + continue; + } + + if pkt.slot_idx < 0 && pkt.mode == ClickMode::Click { + // The client is dropping the cursor item by clicking outside the window. + + let stack = std::mem::take(&mut cursor_item.0); + + if !stack.is_empty() { + drop_item_stack_events.send(DropItemStackEvent { + client: packet.client, + from_slot: None, + stack, + }); + } + } else if pkt.mode == ClickMode::DropKey { + // The client is dropping an item by pressing the drop key. + + let entire_stack = pkt.button == 1; + + // Needs to open the inventory for if the player is dropping an item while + // having an inventory open. + if let Some(open_inventory) = open_inventory { + // The player is interacting with an inventory that is open. + + let Ok(mut target_inventory) = inventories.get_mut(open_inventory.entity) else { + // The inventory does not exist, ignore. + continue; + }; + + if inv_state.state_id.0 != pkt.state_id.0 { + // Client is out of sync. Resync and ignore click. + + debug!("Client state id mismatch, resyncing"); + + inv_state.state_id += 1; + + client.write_packet(&InventoryS2c { + window_id: inv_state.window_id, + state_id: VarInt(inv_state.state_id.0), + slots: Cow::Borrowed(target_inventory.slot_slice()), + carried_item: Cow::Borrowed(&cursor_item.0), + }); + + continue; + } + + if (0i16..target_inventory.slot_count() as i16).contains(&pkt.slot_idx) { + // The player is dropping an item from another inventory. + + let stack = target_inventory.slot(pkt.slot_idx as u16); + + if !stack.is_empty() { + let dropped = if entire_stack || stack.count == 1 { + target_inventory.replace_slot(pkt.slot_idx as u16, ItemStack::EMPTY) + } else { + let stack = stack.clone().with_count(stack.count - 1); + let mut old_slot = + target_inventory.replace_slot(pkt.slot_idx as u16, stack); + // we already checked that the slot was not empty and that the + // stack count is > 1 + old_slot.count = 1; + old_slot + }; + + drop_item_stack_events.send(DropItemStackEvent { + client: packet.client, + from_slot: Some(pkt.slot_idx as u16), + stack: dropped, + }); + } + } else { + // The player is dropping an item from their inventory. + let slot_id = + convert_to_player_slot_id(target_inventory.kind, pkt.slot_idx as u16); + + let stack = client_inv.slot(slot_id); + + if !stack.is_empty() { + let dropped = if entire_stack || stack.count == 1 { + client_inv.replace_slot(slot_id, ItemStack::EMPTY) + } else { + let stack = stack.clone().with_count(stack.count - 1); + let mut old_slot = client_inv.replace_slot(slot_id, stack); + // we already checked that the slot was not empty and that the + // stack count is > 1 + old_slot.count = 1; + old_slot + }; + + drop_item_stack_events.send(DropItemStackEvent { + client: packet.client, + from_slot: Some(slot_id), + stack: dropped, + }); + } + } + } else { + // The player has no inventory open and is dropping an item from their + // inventory. + + let stack = client_inv.slot(pkt.slot_idx as u16); + + if !stack.is_empty() { + let dropped = if entire_stack || stack.count == 1 { + client_inv.replace_slot(pkt.slot_idx as u16, ItemStack::EMPTY) + } else { + let stack = stack.clone().with_count(stack.count - 1); + let mut old_slot = client_inv.replace_slot(pkt.slot_idx as u16, stack); + // we already checked that the slot was not empty and that the + // stack count is > 1 + old_slot.count = 1; + old_slot + }; + + drop_item_stack_events.send(DropItemStackEvent { + client: packet.client, + from_slot: Some(pkt.slot_idx as u16), + stack: dropped, + }); + } + } + } else { + // The player is clicking a slot in an inventory. + + // Validate the window id. + if (pkt.window_id == 0) != open_inventory.is_none() { + warn!( + "Client sent a click with an invalid window id for current state: window_id = \ + {}, open_inventory present = {}", + pkt.window_id, + open_inventory.is_some() + ); + continue; + } + + if let Some(mut open_inventory) = open_inventory { + // The player is interacting with an inventory that is open. + + let Ok(mut target_inventory) = inventories.get_mut(open_inventory.entity) else { + // The inventory does not exist, ignore. + continue; + }; + + if inv_state.state_id.0 != pkt.state_id.0 { + // Client is out of sync. Resync and ignore click. + + debug!("Client state id mismatch, resyncing"); + + inv_state.state_id += 1; + + client.write_packet(&InventoryS2c { + window_id: inv_state.window_id, + state_id: VarInt(inv_state.state_id.0), + slots: Cow::Borrowed(target_inventory.slot_slice()), + carried_item: Cow::Borrowed(&cursor_item.0), + }); + + continue; + } + + cursor_item.set_if_neq(CursorItem(pkt.carried_item.clone())); + + for slot in pkt.slot_changes.iter() { + if (0i16..target_inventory.slot_count() as i16).contains(&slot.idx) { + // The client is interacting with a slot in the target inventory. + target_inventory.set_slot(slot.idx as u16, slot.stack.clone()); + open_inventory.client_changed |= 1 << slot.idx; + } else { + // The client is interacting with a slot in their own inventory. + let slot_id = + convert_to_player_slot_id(target_inventory.kind, slot.idx as u16); + client_inv.set_slot(slot_id, slot.stack.clone()); + inv_state.slots_changed |= 1 << slot_id; + } + } + } else { + // The client is interacting with their own inventory. + + if inv_state.state_id.0 != pkt.state_id.0 { + // Client is out of sync. Resync and ignore the click. + + debug!("Client state id mismatch, resyncing"); + + inv_state.state_id += 1; + + client.write_packet(&InventoryS2c { + window_id: inv_state.window_id, + state_id: VarInt(inv_state.state_id.0), + slots: Cow::Borrowed(client_inv.slot_slice()), + carried_item: Cow::Borrowed(&cursor_item.0), + }); + + continue; + } + + cursor_item.set_if_neq(CursorItem(pkt.carried_item.clone())); + inv_state.client_updated_cursor_item = true; + + for slot in pkt.slot_changes.iter() { + if (0i16..client_inv.slot_count() as i16).contains(&slot.idx) { + client_inv.set_slot(slot.idx as u16, slot.stack.clone()); + inv_state.slots_changed |= 1 << slot.idx; + } else { + // The client is trying to interact with a slot that does not exist, + // ignore. + warn!( + "Client attempted to interact with slot {} which does not exist", + slot.idx + ); + } + } + } + + click_slot_events.send(ClickSlotEvent { + client: packet.client, + window_id: pkt.window_id, + state_id: pkt.state_id.0, + slot_id: pkt.slot_idx, + button: pkt.button, + mode: pkt.mode, + slot_changes: pkt.slot_changes.into(), + carried_item: pkt.carried_item, + }); + } + } +} + +fn handle_player_actions( + mut packets: EventReader, + mut clients: Query<(&mut Inventory, &mut ClientInventoryState, &HeldItem)>, + mut drop_item_stack_events: EventWriter, +) { + for packet in packets.read() { + if let Some(pkt) = packet.decode::() { + match pkt.action { + PlayerAction::DropAllItems => { + if let Ok((mut inv, mut inv_state, &held)) = clients.get_mut(packet.client) { + let stack = inv.replace_slot(held.slot(), ItemStack::EMPTY); + + if !stack.is_empty() { + inv_state.slots_changed |= 1 << held.slot(); + + drop_item_stack_events.send(DropItemStackEvent { + client: packet.client, + from_slot: Some(held.slot()), + stack, + }); + } + } + } + PlayerAction::DropItem => { + if let Ok((mut inv, mut inv_state, held)) = clients.get_mut(packet.client) { + let mut stack = inv.replace_slot(held.slot(), ItemStack::EMPTY); + + if !stack.is_empty() { + if stack.count > 1 { + inv.set_slot( + held.slot(), + stack.clone().with_count(stack.count - 1), + ); + + stack.count = 1; + } + + inv_state.slots_changed |= 1 << held.slot(); + + drop_item_stack_events.send(DropItemStackEvent { + client: packet.client, + from_slot: Some(held.slot()), + stack, + }) + } + } + } + PlayerAction::SwapItemWithOffhand => { + if let Ok((mut inv, _, held)) = clients.get_mut(packet.client) { + inv.swap_slot(held.slot(), PlayerInventory::SLOT_OFFHAND); + } + } + _ => {} + } + } + } +} + +// TODO: make this event user friendly. +#[derive(Event, Clone, Debug)] +pub struct CreativeInventoryActionEvent { + pub client: Entity, + pub slot: i16, + pub clicked_item: ItemStack, +} + +fn handle_creative_inventory_action( + mut packets: EventReader, + mut clients: Query<( + &mut Client, + &mut Inventory, + &mut ClientInventoryState, + &GameMode, + )>, + mut inv_action_events: EventWriter, + mut drop_item_stack_events: EventWriter, +) { + for packet in packets.read() { + if let Some(pkt) = packet.decode::() { + let Ok((mut client, mut inventory, mut inv_state, game_mode)) = + clients.get_mut(packet.client) + else { + continue; + }; + + if *game_mode != GameMode::Creative { + // The client is not in creative mode, ignore. + continue; + } + + if pkt.slot == -1 { + let stack = pkt.clicked_item.clone(); + + if !stack.is_empty() { + drop_item_stack_events.send(DropItemStackEvent { + client: packet.client, + from_slot: None, + stack, + }); + } + continue; + } + + if pkt.slot < 0 || pkt.slot >= inventory.slot_count() as i16 { + // The client is trying to interact with a slot that does not exist, ignore. + continue; + } + + // Set the slot without marking it as changed. + inventory.slots[pkt.slot as usize] = pkt.clicked_item.clone(); + + inv_state.state_id += 1; + + // HACK: notchian clients rely on the server to send the slot update when in + // creative mode. Simply marking the slot as changed is not enough. This was + // discovered because shift-clicking the destroy item slot in creative mode does + // not work without this hack. + client.write_packet(&ScreenHandlerSlotUpdateS2c { + window_id: 0, + state_id: VarInt(inv_state.state_id.0), + slot_idx: pkt.slot, + slot_data: Cow::Borrowed(&pkt.clicked_item), + }); + + inv_action_events.send(CreativeInventoryActionEvent { + client: packet.client, + slot: pkt.slot, + clicked_item: pkt.clicked_item, + }); + } + } +} + +#[derive(Event, Clone, Debug)] +pub struct UpdateSelectedSlotEvent { + pub client: Entity, + pub slot: u8, +} + +/// Handles the `HeldItem` component being changed on a client entity, which +/// indicates that the server has changed the selected hotbar slot. +fn update_player_selected_slot(mut clients: Query<(&mut Client, &HeldItem), Changed>) { + for (mut client, held_item) in &mut clients { + client.write_packet(&UpdateSelectedSlotS2c { + slot: held_item.hotbar_idx(), + }); + } +} + +/// Client to Server HeldItem Slot +fn handle_update_selected_slot( + mut packets: EventReader, + mut clients: Query<&mut HeldItem>, + mut events: EventWriter, +) { + for packet in packets.read() { + if let Some(pkt) = packet.decode::() { + if let Ok(mut mut_held) = clients.get_mut(packet.client) { + let held = mut_held.bypass_change_detection(); + if pkt.slot > 8 { + // The client is trying to interact with a slot that does not exist, ignore. + continue; + } + + held.set_hotbar_idx(pkt.slot as u8); + + events.send(UpdateSelectedSlotEvent { + client: packet.client, + slot: pkt.slot as u8, + }); + } + } + } +} + +/// Convert a slot that is outside a target inventory's range to a slot that is +/// inside the player's inventory. +#[doc(hidden)] +pub fn convert_to_player_slot_id(target_kind: InventoryKind, slot_id: u16) -> u16 { + // the first slot in the player's general inventory + let offset = target_kind.slot_count() as u16; + slot_id - offset + 9 +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug)] +pub enum InventoryKind { + Generic9x1, + Generic9x2, + Generic9x3, + Generic9x4, + Generic9x5, + Generic9x6, + Generic3x3, + Anvil, + Beacon, + BlastFurnace, + BrewingStand, + Crafting, + Enchantment, + Furnace, + Grindstone, + Hopper, + Lectern, + Loom, + Merchant, + ShulkerBox, + Smithing, + Smoker, + Cartography, + Stonecutter, + Player, +} + +impl InventoryKind { + /// The number of slots in this inventory. When the inventory is shown to + /// clients, this number does not include the player's main inventory slots. + pub const fn slot_count(self) -> usize { + match self { + InventoryKind::Generic9x1 => 9, + InventoryKind::Generic9x2 => 9 * 2, + InventoryKind::Generic9x3 => 9 * 3, + InventoryKind::Generic9x4 => 9 * 4, + InventoryKind::Generic9x5 => 9 * 5, + InventoryKind::Generic9x6 => 9 * 6, + InventoryKind::Generic3x3 => 3 * 3, + InventoryKind::Anvil => 4, + InventoryKind::Beacon => 1, + InventoryKind::BlastFurnace => 3, + InventoryKind::BrewingStand => 5, + InventoryKind::Crafting => 10, + InventoryKind::Enchantment => 2, + InventoryKind::Furnace => 3, + InventoryKind::Grindstone => 3, + InventoryKind::Hopper => 5, + InventoryKind::Lectern => 1, + InventoryKind::Loom => 4, + InventoryKind::Merchant => 3, + InventoryKind::ShulkerBox => 27, + InventoryKind::Smithing => 3, + InventoryKind::Smoker => 3, + InventoryKind::Cartography => 3, + InventoryKind::Stonecutter => 2, + InventoryKind::Player => 46, + } + } +} + +impl From for WindowType { + fn from(value: InventoryKind) -> Self { + match value { + InventoryKind::Generic9x1 => WindowType::Generic9x1, + InventoryKind::Generic9x2 => WindowType::Generic9x2, + InventoryKind::Generic9x3 => WindowType::Generic9x3, + InventoryKind::Generic9x4 => WindowType::Generic9x4, + InventoryKind::Generic9x5 => WindowType::Generic9x5, + InventoryKind::Generic9x6 => WindowType::Generic9x6, + InventoryKind::Generic3x3 => WindowType::Generic3x3, + InventoryKind::Anvil => WindowType::Anvil, + InventoryKind::Beacon => WindowType::Beacon, + InventoryKind::BlastFurnace => WindowType::BlastFurnace, + InventoryKind::BrewingStand => WindowType::BrewingStand, + InventoryKind::Crafting => WindowType::Crafting, + InventoryKind::Enchantment => WindowType::Enchantment, + InventoryKind::Furnace => WindowType::Furnace, + InventoryKind::Grindstone => WindowType::Grindstone, + InventoryKind::Hopper => WindowType::Hopper, + InventoryKind::Lectern => WindowType::Lectern, + InventoryKind::Loom => WindowType::Loom, + InventoryKind::Merchant => WindowType::Merchant, + InventoryKind::ShulkerBox => WindowType::ShulkerBox, + InventoryKind::Smithing => WindowType::Smithing, + InventoryKind::Smoker => WindowType::Smoker, + InventoryKind::Cartography => WindowType::Cartography, + InventoryKind::Stonecutter => WindowType::Stonecutter, + // arbitrarily chosen, because a player inventory technically does not have a window + // type + InventoryKind::Player => WindowType::Generic9x4, + } + } +} + +impl From for InventoryKind { + fn from(value: WindowType) -> Self { + match value { + WindowType::Generic9x1 => InventoryKind::Generic9x1, + WindowType::Generic9x2 => InventoryKind::Generic9x2, + WindowType::Generic9x3 => InventoryKind::Generic9x3, + WindowType::Generic9x4 => InventoryKind::Generic9x4, + WindowType::Generic9x5 => InventoryKind::Generic9x5, + WindowType::Generic9x6 => InventoryKind::Generic9x6, + WindowType::Generic3x3 => InventoryKind::Generic3x3, + WindowType::Anvil => InventoryKind::Anvil, + WindowType::Beacon => InventoryKind::Beacon, + WindowType::BlastFurnace => InventoryKind::BlastFurnace, + WindowType::BrewingStand => InventoryKind::BrewingStand, + WindowType::Crafting => InventoryKind::Crafting, + WindowType::Enchantment => InventoryKind::Enchantment, + WindowType::Furnace => InventoryKind::Furnace, + WindowType::Grindstone => InventoryKind::Grindstone, + WindowType::Hopper => InventoryKind::Hopper, + WindowType::Lectern => InventoryKind::Lectern, + WindowType::Loom => InventoryKind::Loom, + WindowType::Merchant => InventoryKind::Merchant, + WindowType::ShulkerBox => InventoryKind::ShulkerBox, + WindowType::Smithing => InventoryKind::Smithing, + WindowType::Smoker => InventoryKind::Smoker, + WindowType::Cartography => InventoryKind::Cartography, + WindowType::Stonecutter => InventoryKind::Stonecutter, + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Resource)] +pub struct InventorySettings { + pub validate_actions: bool, +} + +impl Default for InventorySettings { + fn default() -> Self { + Self { + validate_actions: true, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_convert_to_player_slot() { + assert_eq!(convert_to_player_slot_id(InventoryKind::Generic9x3, 27), 9); + assert_eq!(convert_to_player_slot_id(InventoryKind::Generic9x3, 36), 18); + assert_eq!(convert_to_player_slot_id(InventoryKind::Generic9x3, 54), 36); + assert_eq!(convert_to_player_slot_id(InventoryKind::Generic9x1, 9), 9); + } + + #[test] + fn test_convert_hotbar_slot_id() { + assert_eq!(PlayerInventory::hotbar_to_slot(0), 36); + assert_eq!(PlayerInventory::hotbar_to_slot(4), 40); + assert_eq!(PlayerInventory::hotbar_to_slot(8), 44); + } +} diff --git a/vendor/valence/crates/valence_inventory/src/player_inventory.rs b/vendor/valence/crates/valence_inventory/src/player_inventory.rs new file mode 100644 index 00000000..95e7ba73 --- /dev/null +++ b/vendor/valence/crates/valence_inventory/src/player_inventory.rs @@ -0,0 +1,24 @@ +use std::ops::RangeInclusive; + +pub struct PlayerInventory; + +impl PlayerInventory { + pub const SLOT_OFFHAND: u16 = 45; + pub const SLOT_HEAD: u16 = 5; + pub const SLOT_CHEST: u16 = 6; + pub const SLOT_LEGS: u16 = 7; + pub const SLOT_FEET: u16 = 8; + pub const SLOTS_CRAFT_INPUT: RangeInclusive = 1..=4; + pub const SLOT_CRAFT_RESULT: u16 = 0; + pub const SLOTS_HOTBAR: RangeInclusive = 36..=44; + pub const SLOTS_MAIN: RangeInclusive = 9..=44; + pub const MAIN_SIZE: u16 = *Self::SLOTS_MAIN.end() - *Self::SLOTS_MAIN.start() + 1; + + pub const fn hotbar_to_slot(hotbar: u8) -> u16 { + *Self::SLOTS_HOTBAR.start() + (hotbar as u16) + } + + pub const fn slot_to_hotbar(slot: u16) -> u8 { + (slot - *Self::SLOTS_HOTBAR.start()) as u8 + } +} diff --git a/vendor/valence/crates/valence_inventory/src/validate.rs b/vendor/valence/crates/valence_inventory/src/validate.rs new file mode 100644 index 00000000..a0b0d064 --- /dev/null +++ b/vendor/valence/crates/valence_inventory/src/validate.rs @@ -0,0 +1,826 @@ +use valence_server::protocol::anyhow::{self, bail, ensure}; +use valence_server::protocol::packets::play::click_slot_c2s::ClickMode; +use valence_server::protocol::packets::play::ClickSlotC2s; + +use super::{CursorItem, Inventory, InventoryWindow}; +use crate::player_inventory::PlayerInventory; + +/// Validates a click slot packet enforcing that all fields are valid. +pub(super) fn validate_click_slot_packet( + packet: &ClickSlotC2s, + player_inventory: &Inventory, + open_inventory: Option<&Inventory>, + cursor_item: &CursorItem, +) -> anyhow::Result<()> { + ensure!( + (packet.window_id == 0) == open_inventory.is_none(), + "window id and open inventory mismatch: window_id: {} open_inventory: {}", + packet.window_id, + open_inventory.is_some() + ); + + let max_slot = if let Some(open_inv) = open_inventory { + // when the window is split, we can only access the main slots of player's + // inventory + PlayerInventory::MAIN_SIZE + open_inv.slot_count() + } else { + player_inventory.slot_count() + }; + + // check all slot ids and item counts are valid + ensure!( + packet.slot_changes.iter().all(|s| { + if !(0..=max_slot).contains(&(s.idx as u16)) { + return false; + } + + if !s.stack.is_empty() { + let max_stack_size = s.stack.item.max_stack().max(s.stack.count); + if !(1..=max_stack_size).contains(&(s.stack.count)) { + return false; + } + } + + true + }), + "invalid slot ids or item counts" + ); + + // check carried item count is valid + if !packet.carried_item.is_empty() { + let carried_item = &packet.carried_item; + + let max_stack_size = carried_item.item.max_stack().max(carried_item.count); + ensure!( + (1..=max_stack_size).contains(&carried_item.count), + "invalid carried item count" + ); + } + + match packet.mode { + ClickMode::Click => { + ensure!((0..=1).contains(&packet.button), "invalid button"); + ensure!( + (0..=max_slot).contains(&(packet.slot_idx as u16)) || packet.slot_idx == -999, + "invalid slot index" + ) + } + ClickMode::ShiftClick => { + ensure!((0..=1).contains(&packet.button), "invalid button"); + ensure!( + packet.carried_item.is_empty(), + "carried item must be empty for a hotbar swap" + ); + ensure!( + (0..=max_slot).contains(&(packet.slot_idx as u16)), + "invalid slot index" + ) + } + ClickMode::Hotbar => { + ensure!(matches!(packet.button, 0..=8 | 40), "invalid button"); + ensure!( + packet.carried_item.is_empty(), + "carried item must be empty for a hotbar swap" + ); + } + ClickMode::CreativeMiddleClick => { + ensure!(packet.button == 2, "invalid button"); + ensure!( + (0..=max_slot).contains(&(packet.slot_idx as u16)), + "invalid slot index" + ) + } + ClickMode::DropKey => { + ensure!((0..=1).contains(&packet.button), "invalid button"); + ensure!( + packet.carried_item.is_empty(), + "carried item must be empty for an item drop" + ); + ensure!( + (0..=max_slot).contains(&(packet.slot_idx as u16)), + "invalid slot index" + ) + } + ClickMode::Drag => { + ensure!( + matches!(packet.button, 0..=2 | 4..=6 | 8..=10), + "invalid button" + ); + ensure!( + (0..=max_slot).contains(&(packet.slot_idx as u16)) || packet.slot_idx == -999, + "invalid slot index" + ) + } + ClickMode::DoubleClick => ensure!(packet.button == 0, "invalid button"), + } + + // Check that items aren't being duplicated, i.e. conservation of mass. + + let window = InventoryWindow { + player_inventory, + open_inventory, + }; + + match packet.mode { + ClickMode::Click => { + if packet.slot_idx == -999 { + // Clicked outside the window, so the client is dropping an item + ensure!( + packet.slot_changes.is_empty(), + "slot modifications must be empty" + ); + + // Clicked outside the window + let count_deltas = calculate_net_item_delta(packet, &window, cursor_item); + let expected_delta = match packet.button { + 1 => -1, + 0 => { + if !cursor_item.is_empty() { + -cursor_item.0.count as i32 + } else { + 0 + } + } + _ => unreachable!(), + }; + ensure!( + count_deltas == expected_delta, + "invalid item delta: expected {}, got {}", + expected_delta, + count_deltas + ); + } else { + ensure!( + packet.slot_changes.len() == 1, + "click must modify one slot, got {}", + packet.slot_changes.len() + ); + + let old_slot = window.slot(packet.slot_changes[0].idx as u16); + // TODO: make sure NBT is the same. + // Sometimes, the client will add nbt data to an item if it's missing, + // like "Damage" to a sword. + let should_swap: bool = packet.button == 0 + && match (!old_slot.is_empty(), !cursor_item.is_empty()) { + (true, true) => old_slot.item != cursor_item.item, + (true, false) => true, + (false, true) => cursor_item.count <= cursor_item.item.max_stack(), + (false, false) => false, + }; + + if should_swap { + // assert that a swap occurs + ensure!( + // There are some cases where the client will add NBT data that + // did not previously exist. + old_slot.item == packet.carried_item.item + && old_slot.count == packet.carried_item.count + && cursor_item.0 == packet.slot_changes[0].stack, + "swapped items must match" + ); + } else { + // assert that a merge occurs + let count_deltas = calculate_net_item_delta(packet, &window, cursor_item); + ensure!( + count_deltas == 0, + "invalid item delta for stack merge: {}", + count_deltas + ); + } + } + } + ClickMode::ShiftClick => { + ensure!( + (2..=3).contains(&packet.slot_changes.len()), + "shift click must modify 2 or 3 slots, got {}", + packet.slot_changes.len() + ); + + let count_deltas = calculate_net_item_delta(packet, &window, cursor_item); + ensure!( + count_deltas == 0, + "invalid item delta: expected 0, got {}", + count_deltas + ); + + let Some(item_kind) = packet + .slot_changes + .iter() + .find(|s| !s.stack.is_empty()) + .map(|s| s.stack.item) + else { + bail!("shift click must move an item"); + }; + + let old_slot_kind = window.slot(packet.slot_idx as u16).item; + ensure!( + old_slot_kind == item_kind, + "shift click must move the same item kind as modified slots" + ); + + // assert all moved items are the same kind + ensure!( + packet + .slot_changes + .iter() + .filter(|s| !s.stack.is_empty()) + .all(|s| s.stack.item == item_kind), + "shift click must move the same item kind" + ); + } + + ClickMode::Hotbar => { + ensure!( + packet.slot_changes.len() == 2, + "hotbar swap must modify two slots, got {}", + packet.slot_changes.len() + ); + + let count_deltas = calculate_net_item_delta(packet, &window, cursor_item); + ensure!( + count_deltas == 0, + "invalid item delta: expected 0, got {}", + count_deltas + ); + + // assert that a swap occurs + let old_slots = [ + window.slot(packet.slot_changes[0].idx as u16), + window.slot(packet.slot_changes[1].idx as u16), + ]; + ensure!( + old_slots + .iter() + .any(|s| *s == &packet.slot_changes[0].stack) + && old_slots + .iter() + .any(|s| *s == &packet.slot_changes[1].stack), + "swapped items must match" + ); + } + ClickMode::CreativeMiddleClick => {} + ClickMode::DropKey => { + ensure!( + packet.slot_changes.len() == 1, + "drop key must modify exactly one slot" + ); + ensure!( + packet.slot_idx == packet.slot_changes.first().map(|s| s.idx).unwrap_or(-2), + "slot index does not match modified slot" + ); + + let old_slot = window.slot(packet.slot_idx as u16); + let new_slot = &packet.slot_changes[0].stack; + let is_transmuting = match (!old_slot.is_empty(), !new_slot.is_empty()) { + // TODO: make sure NBT is the same. + // Sometimes, the client will add nbt data to an item if it's missing, like + // "Damage" to a sword. + (true, true) => old_slot.item != new_slot.item, + (_, false) => false, + (false, true) => true, + }; + ensure!(!is_transmuting, "transmuting items is not allowed"); + + let count_deltas = calculate_net_item_delta(packet, &window, cursor_item); + + let expected_delta = match packet.button { + 0 => -1, + 1 => { + if !old_slot.is_empty() { + -old_slot.count as i32 + } else { + 0 + } + } + _ => unreachable!(), + }; + ensure!( + count_deltas == expected_delta, + "invalid item delta: expected {}, got {}", + expected_delta, + count_deltas + ); + } + ClickMode::Drag => { + if matches!(packet.button, 2 | 6 | 10) { + let count_deltas = calculate_net_item_delta(packet, &window, cursor_item); + ensure!( + count_deltas == 0, + "invalid item delta: expected 0, got {}", + count_deltas + ); + } else { + ensure!(packet.slot_changes.is_empty() && packet.carried_item == cursor_item.0); + } + } + ClickMode::DoubleClick => { + let count_deltas = calculate_net_item_delta(packet, &window, cursor_item); + ensure!( + count_deltas == 0, + "invalid item delta: expected 0, got {}", + count_deltas + ); + } + } + + Ok(()) +} + +/// Calculate the total difference in item counts if the changes in this packet +/// were to be applied. +/// +/// Returns a positive number if items were added to the window, and a negative +/// number if items were removed from the window. +fn calculate_net_item_delta( + packet: &ClickSlotC2s, + window: &InventoryWindow, + cursor_item: &CursorItem, +) -> i32 { + let mut net_item_delta: i32 = 0; + + for slot in packet.slot_changes.iter() { + let old_slot = window.slot(slot.idx as u16); + let new_slot = &slot.stack; + + net_item_delta += match (!old_slot.is_empty(), !new_slot.is_empty()) { + (true, true) => new_slot.count as i32 - old_slot.count as i32, + (true, false) => -(old_slot.count as i32), + (false, true) => new_slot.count as i32, + (false, false) => 0, + }; + } + + net_item_delta += match (!cursor_item.is_empty(), !packet.carried_item.is_empty()) { + (true, true) => packet.carried_item.count as i32 - cursor_item.count as i32, + (true, false) => -(cursor_item.count as i32), + (false, true) => packet.carried_item.count as i32, + (false, false) => 0, + }; + + net_item_delta +} + +#[cfg(test)] +mod tests { + use valence_server::nbt::Compound; + use valence_server::nbt::Value::Int; + use valence_server::protocol::packets::play::click_slot_c2s::SlotChange; + use valence_server::protocol::VarInt; + use valence_server::{ItemKind, ItemStack}; + + use super::*; + use crate::InventoryKind; + + #[test] + fn net_item_delta_1() { + let drag_packet = ClickSlotC2s { + window_id: 2, + state_id: VarInt(14), + slot_idx: -999, + button: 2, + mode: ClickMode::Drag, + slot_changes: vec![ + SlotChange { + idx: 4, + stack: ItemStack::new(ItemKind::Diamond, 21, None), + }, + SlotChange { + idx: 3, + stack: ItemStack::new(ItemKind::Diamond, 21, None), + }, + SlotChange { + idx: 5, + stack: ItemStack::new(ItemKind::Diamond, 21, None), + }, + ] + .into(), + carried_item: ItemStack::new(ItemKind::Diamond, 1, None), + }; + + let player_inventory = Inventory::new(InventoryKind::Player); + let inventory = Inventory::new(InventoryKind::Generic9x1); + let window = InventoryWindow::new(&player_inventory, Some(&inventory)); + let cursor_item = CursorItem(ItemStack::new(ItemKind::Diamond, 64, None)); + + assert_eq!( + calculate_net_item_delta(&drag_packet, &window, &cursor_item), + 0 + ); + } + + #[test] + fn net_item_delta_2() { + let drag_packet = ClickSlotC2s { + window_id: 2, + state_id: VarInt(14), + slot_idx: -999, + button: 2, + mode: ClickMode::Click, + slot_changes: vec![ + SlotChange { + idx: 2, + stack: ItemStack::new(ItemKind::Diamond, 2, None), + }, + SlotChange { + idx: 3, + stack: ItemStack::new(ItemKind::IronIngot, 2, None), + }, + SlotChange { + idx: 4, + stack: ItemStack::new(ItemKind::GoldIngot, 2, None), + }, + SlotChange { + idx: 5, + stack: ItemStack::new(ItemKind::Emerald, 2, None), + }, + ] + .into(), + carried_item: ItemStack::new(ItemKind::OakWood, 2, None), + }; + + let player_inventory = Inventory::new(InventoryKind::Player); + let inventory = Inventory::new(InventoryKind::Generic9x1); + let window = InventoryWindow::new(&player_inventory, Some(&inventory)); + let cursor_item = CursorItem::default(); + + assert_eq!( + calculate_net_item_delta(&drag_packet, &window, &cursor_item), + 10 + ); + } + + #[test] + fn click_filled_slot_with_empty_cursor_success() { + let player_inventory = Inventory::new(InventoryKind::Player); + let mut inventory = Inventory::new(InventoryKind::Generic9x1); + inventory.set_slot(0, ItemStack::new(ItemKind::Diamond, 20, None)); + let cursor_item = CursorItem::default(); + let packet = ClickSlotC2s { + window_id: 1, + button: 0, + mode: ClickMode::Click, + state_id: VarInt(0), + slot_idx: 0, + slot_changes: vec![SlotChange { + idx: 0, + stack: ItemStack::EMPTY, + }] + .into(), + carried_item: inventory.slot(0).clone(), + }; + + validate_click_slot_packet(&packet, &player_inventory, Some(&inventory), &cursor_item) + .expect("packet should be valid"); + } + + #[test] + fn click_filled_slot_with_incorrect_nbt_and_empty_cursor_success() { + let player_inventory = Inventory::new(InventoryKind::Player); + let cursor_item = CursorItem(ItemStack::EMPTY); + + let mut inventory = Inventory::new(InventoryKind::Generic9x1); + // Insert an item with no NBT data that should have NBT Data. + inventory.set_slot(0, ItemStack::new(ItemKind::DiamondPickaxe, 1, None)); + + // Proper NBT Compound + let mut compound = Compound::new(); + compound.insert("Damage", Int(1)); + + let packet = ClickSlotC2s { + window_id: 1, + state_id: VarInt(0), + slot_idx: 0, + button: 0, + mode: ClickMode::Click, + slot_changes: vec![SlotChange { + idx: 0, + stack: ItemStack::EMPTY, + }] + .into(), + carried_item: ItemStack { + item: ItemKind::DiamondPickaxe, + count: 1, + nbt: Some(compound), + }, + }; + + validate_click_slot_packet(&packet, &player_inventory, Some(&inventory), &cursor_item) + .expect("packet should be valid"); + } + + #[test] + fn click_slot_with_filled_cursor_success() { + let player_inventory = Inventory::new(InventoryKind::Player); + let inventory1 = Inventory::new(InventoryKind::Generic9x1); + let mut inventory2 = Inventory::new(InventoryKind::Generic9x1); + inventory2.set_slot(0, ItemStack::new(ItemKind::Diamond, 10, None)); + let cursor_item = CursorItem(ItemStack::new(ItemKind::Diamond, 20, None)); + let packet1 = ClickSlotC2s { + window_id: 1, + button: 0, + mode: ClickMode::Click, + state_id: VarInt(0), + slot_idx: 0, + slot_changes: vec![SlotChange { + idx: 0, + stack: ItemStack::new(ItemKind::Diamond, 20, None), + }] + .into(), + carried_item: ItemStack::EMPTY, + }; + let packet2 = ClickSlotC2s { + window_id: 1, + button: 0, + mode: ClickMode::Click, + state_id: VarInt(0), + slot_idx: 0, + slot_changes: vec![SlotChange { + idx: 0, + stack: ItemStack::new(ItemKind::Diamond, 30, None), + }] + .into(), + carried_item: ItemStack::EMPTY, + }; + + validate_click_slot_packet(&packet1, &player_inventory, Some(&inventory1), &cursor_item) + .expect("packet should be valid"); + + validate_click_slot_packet(&packet2, &player_inventory, Some(&inventory2), &cursor_item) + .expect("packet should be valid"); + } + + #[test] + fn click_filled_slot_with_filled_cursor_stack_overflow_success() { + let player_inventory = Inventory::new(InventoryKind::Player); + let mut inventory = Inventory::new(InventoryKind::Generic9x1); + inventory.set_slot(0, ItemStack::new(ItemKind::Diamond, 20, None)); + let cursor_item = CursorItem(ItemStack::new(ItemKind::Diamond, 64, None)); + let packet = ClickSlotC2s { + window_id: 1, + button: 0, + mode: ClickMode::Click, + state_id: VarInt(0), + slot_idx: 0, + slot_changes: vec![SlotChange { + idx: 0, + stack: ItemStack::new(ItemKind::Diamond, 64, None), + }] + .into(), + carried_item: ItemStack::new(ItemKind::Diamond, 20, None), + }; + + validate_click_slot_packet(&packet, &player_inventory, Some(&inventory), &cursor_item) + .expect("packet should be valid"); + } + + #[test] + fn click_filled_slot_with_filled_cursor_different_item_success() { + let player_inventory = Inventory::new(InventoryKind::Player); + let mut inventory = Inventory::new(InventoryKind::Generic9x1); + inventory.set_slot(0, ItemStack::new(ItemKind::IronIngot, 2, None)); + let cursor_item = CursorItem(ItemStack::new(ItemKind::Diamond, 2, None)); + let packet = ClickSlotC2s { + window_id: 1, + button: 0, + mode: ClickMode::Click, + state_id: VarInt(0), + slot_idx: 0, + slot_changes: vec![SlotChange { + idx: 0, + stack: ItemStack::new(ItemKind::Diamond, 2, None), + }] + .into(), + carried_item: ItemStack::new(ItemKind::IronIngot, 2, None), + }; + + validate_click_slot_packet(&packet, &player_inventory, Some(&inventory), &cursor_item) + .expect("packet should be valid"); + } + + #[test] + fn click_slot_with_filled_cursor_failure() { + let player_inventory = Inventory::new(InventoryKind::Player); + let inventory1 = Inventory::new(InventoryKind::Generic9x1); + let mut inventory2 = Inventory::new(InventoryKind::Generic9x1); + inventory2.set_slot(0, ItemStack::new(ItemKind::Diamond, 10, None)); + let cursor_item = CursorItem(ItemStack::new(ItemKind::Diamond, 20, None)); + let packet1 = ClickSlotC2s { + window_id: 1, + button: 0, + mode: ClickMode::Click, + state_id: VarInt(0), + slot_idx: 0, + slot_changes: vec![SlotChange { + idx: 0, + stack: ItemStack::new(ItemKind::Diamond, 22, None), + }] + .into(), + carried_item: ItemStack::EMPTY, + }; + let packet2 = ClickSlotC2s { + window_id: 1, + button: 0, + mode: ClickMode::Click, + state_id: VarInt(0), + slot_idx: 0, + slot_changes: vec![SlotChange { + idx: 0, + stack: ItemStack::new(ItemKind::Diamond, 32, None), + }] + .into(), + carried_item: ItemStack::EMPTY, + }; + let packet3 = ClickSlotC2s { + window_id: 1, + button: 0, + mode: ClickMode::Click, + state_id: VarInt(0), + slot_idx: 0, + slot_changes: vec![ + SlotChange { + idx: 0, + stack: ItemStack::new(ItemKind::Diamond, 22, None), + }, + SlotChange { + idx: 1, + stack: ItemStack::new(ItemKind::Diamond, 22, None), + }, + ] + .into(), + carried_item: ItemStack::EMPTY, + }; + + validate_click_slot_packet(&packet1, &player_inventory, Some(&inventory1), &cursor_item) + .expect_err("packet 1 should fail item duplication check"); + + validate_click_slot_packet(&packet2, &player_inventory, Some(&inventory2), &cursor_item) + .expect_err("packet 2 should fail item duplication check"); + + validate_click_slot_packet(&packet3, &player_inventory, Some(&inventory1), &cursor_item) + .expect_err("packet 3 should fail item duplication check"); + } + + #[test] + fn disallow_item_transmutation() { + // no alchemy allowed - make sure that lead can't be turned into gold + + let mut player_inventory = Inventory::new(InventoryKind::Player); + player_inventory.set_slot(9, ItemStack::new(ItemKind::Lead, 2, None)); + let cursor_item = CursorItem::default(); + + let packets = vec![ + ClickSlotC2s { + window_id: 0, + button: 0, + mode: ClickMode::ShiftClick, + state_id: VarInt(0), + slot_idx: 9, + slot_changes: vec![ + SlotChange { + idx: 9, + stack: ItemStack::EMPTY, + }, + SlotChange { + idx: 36, + stack: ItemStack::new(ItemKind::GoldIngot, 2, None), + }, + ] + .into(), + carried_item: ItemStack::EMPTY, + }, + ClickSlotC2s { + window_id: 0, + button: 0, + mode: ClickMode::Hotbar, + state_id: VarInt(0), + slot_idx: 9, + slot_changes: vec![ + SlotChange { + idx: 9, + stack: ItemStack::EMPTY, + }, + SlotChange { + idx: 36, + stack: ItemStack::new(ItemKind::GoldIngot, 2, None), + }, + ] + .into(), + carried_item: ItemStack::EMPTY, + }, + ClickSlotC2s { + window_id: 0, + button: 0, + mode: ClickMode::Click, + state_id: VarInt(0), + slot_idx: 9, + slot_changes: vec![SlotChange { + idx: 9, + stack: ItemStack::EMPTY, + }] + .into(), + carried_item: ItemStack::new(ItemKind::GoldIngot, 2, None), + }, + ClickSlotC2s { + window_id: 0, + button: 0, + mode: ClickMode::DropKey, + state_id: VarInt(0), + slot_idx: 9, + slot_changes: vec![SlotChange { + idx: 9, + stack: ItemStack::new(ItemKind::GoldIngot, 1, None), + }] + .into(), + carried_item: ItemStack::EMPTY, + }, + ]; + + for (i, packet) in packets.iter().enumerate() { + validate_click_slot_packet(packet, &player_inventory, None, &cursor_item).expect_err( + &format!("packet {i} passed item duplication check when it should have failed"), + ); + } + } + + #[test] + fn allow_shift_click_overflow_to_new_stack() { + let mut player_inventory = Inventory::new(InventoryKind::Player); + player_inventory.set_slot(9, ItemStack::new(ItemKind::Diamond, 64, None)); + player_inventory.set_slot(36, ItemStack::new(ItemKind::Diamond, 32, None)); + let cursor_item = CursorItem::default(); + + let packet = ClickSlotC2s { + window_id: 0, + state_id: VarInt(2), + slot_idx: 9, + button: 0, + mode: ClickMode::ShiftClick, + slot_changes: vec![ + SlotChange { + idx: 37, + stack: ItemStack::new(ItemKind::Diamond, 32, None), + }, + SlotChange { + idx: 36, + stack: ItemStack::new(ItemKind::Diamond, 64, None), + }, + SlotChange { + idx: 9, + stack: ItemStack::EMPTY, + }, + ] + .into(), + carried_item: ItemStack::EMPTY, + }; + + validate_click_slot_packet(&packet, &player_inventory, None, &cursor_item) + .expect("packet should be valid"); + } + + #[test] + fn allow_pickup_overfull_stack_click() { + let mut player_inventory = Inventory::new(InventoryKind::Player); + player_inventory.set_slot(9, ItemStack::new(ItemKind::Apple, 100, None)); + let cursor_item = CursorItem::default(); + + let packet = ClickSlotC2s { + window_id: 0, + state_id: VarInt(2), + slot_idx: 9, + button: 0, + mode: ClickMode::Click, + slot_changes: vec![SlotChange { + idx: 9, + stack: ItemStack::EMPTY, + }] + .into(), + carried_item: ItemStack::new(ItemKind::Apple, 100, None), + }; + + validate_click_slot_packet(&packet, &player_inventory, None, &cursor_item) + .expect("packet should be valid"); + } + + #[test] + fn allow_place_overfull_stack_click() { + let player_inventory = Inventory::new(InventoryKind::Player); + let cursor_item = CursorItem(ItemStack::new(ItemKind::Apple, 100, None)); + + let packet = ClickSlotC2s { + window_id: 0, + state_id: VarInt(2), + slot_idx: 9, + button: 0, + mode: ClickMode::Click, + slot_changes: vec![SlotChange { + idx: 9, + stack: ItemStack::new(ItemKind::Apple, 64, None), + }] + .into(), + carried_item: ItemStack::new(ItemKind::Apple, 36, None), + }; + + validate_click_slot_packet(&packet, &player_inventory, None, &cursor_item) + .expect("packet should be valid"); + } +} diff --git a/vendor/valence/crates/valence_lang/Cargo.toml b/vendor/valence/crates/valence_lang/Cargo.toml new file mode 100644 index 00000000..e36fc949 --- /dev/null +++ b/vendor/valence/crates/valence_lang/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "valence_lang" +description = "Minecraft's languages and translation keys." +readme = "README.md" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[build-dependencies] +anyhow.workspace = true +heck.workspace = true +proc-macro2.workspace = true +quote.workspace = true +serde = { workspace = true, features = ["derive"] } +serde_json.workspace = true +valence_build_utils.workspace = true diff --git a/vendor/valence/crates/valence_lang/README.md b/vendor/valence/crates/valence_lang/README.md new file mode 100644 index 00000000..648333bc --- /dev/null +++ b/vendor/valence/crates/valence_lang/README.md @@ -0,0 +1,5 @@ +# valence_lang + +Contains code for managing Minecraft's languages and translation keys. + +Currently, this only contains Minecraft's translation keys as Rust constants. In the future it may be expanded to include language registries, functions to resolve translation keys at runtime, etc. diff --git a/vendor/valence/crates/valence_lang/build.rs b/vendor/valence/crates/valence_lang/build.rs new file mode 100644 index 00000000..c87311ff --- /dev/null +++ b/vendor/valence/crates/valence_lang/build.rs @@ -0,0 +1,46 @@ +use heck::ToShoutySnakeCase; +use proc_macro2::TokenStream; +use quote::quote; +use serde::Deserialize; +use valence_build_utils::{ident, rerun_if_changed, write_generated_file}; + +pub fn main() -> anyhow::Result<()> { + write_generated_file(build()?, "translation_keys.rs") +} + +fn build() -> anyhow::Result { + rerun_if_changed(["extracted/translation_keys.json"]); + + let translations = + serde_json::from_str::>(include_str!("extracted/translation_keys.json"))?; + + let translation_key_consts = translations + .iter() + .map(|translation| { + let const_id = ident(translation.key.to_shouty_snake_case()); + let key = &translation.key; + let english_translation = &translation.english_translation; + let doc = format!("\"{}\"", escape(english_translation)); + + quote! { + #[doc = #doc] + pub const #const_id: &str = #key; + } + }) + .collect::>(); + + Ok(quote! { + #(#translation_key_consts)* + }) +} + +#[derive(Deserialize, Clone, Debug)] +struct Translation { + key: String, + english_translation: String, +} + +/// Escapes characters that have special meaning inside docs. +fn escape(text: &str) -> String { + text.replace('[', "\\[").replace(']', "\\]") +} diff --git a/vendor/valence/crates/valence_lang/extracted/translation_keys.json b/vendor/valence/crates/valence_lang/extracted/translation_keys.json new file mode 100644 index 00000000..0608e361 --- /dev/null +++ b/vendor/valence/crates/valence_lang/extracted/translation_keys.json @@ -0,0 +1,24914 @@ +[ + { + "key": "options.damageTiltStrength.tooltip", + "english_translation": "The amount of camera shake caused by being hurt." + }, + { + "key": "block.minecraft.brown_terracotta", + "english_translation": "Brown Terracotta" + }, + { + "key": "entity.minecraft.area_effect_cloud", + "english_translation": "Area Effect Cloud" + }, + { + "key": "item.minecraft.gray_dye", + "english_translation": "Gray Dye" + }, + { + "key": "block.minecraft.terracotta", + "english_translation": "Terracotta" + }, + { + "key": "multiplayer.disconnect.flying", + "english_translation": "Flying is not enabled on this server" + }, + { + "key": "key.categories.creative", + "english_translation": "Creative Mode" + }, + { + "key": "item.minecraft.potion.effect.weakness", + "english_translation": "Potion of Weakness" + }, + { + "key": "selectWorld.backupWarning.experimental", + "english_translation": "This world uses experimental settings that could stop working at any time. We cannot guarantee it will load or work. Here be dragons!" + }, + { + "key": "block.minecraft.dark_prismarine_slab", + "english_translation": "Dark Prismarine Slab" + }, + { + "key": "subtitles.entity.mooshroom.milk", + "english_translation": "Mooshroom gets milked" + }, + { + "key": "block.minecraft.red_nether_brick_slab", + "english_translation": "Red Nether Brick Slab" + }, + { + "key": "block.minecraft.yellow_terracotta", + "english_translation": "Yellow Terracotta" + }, + { + "key": "entity.minecraft.creeper", + "english_translation": "Creeper" + }, + { + "key": "key.keyboard.world.1", + "english_translation": "World 1" + }, + { + "key": "key.keyboard.world.2", + "english_translation": "World 2" + }, + { + "key": "block.minecraft.banner.straight_cross.cyan", + "english_translation": "Cyan Cross" + }, + { + "key": "commands.schedule.created.function", + "english_translation": "Scheduled function '%s' in %s tick(s) at gametime %s" + }, + { + "key": "deathScreen.quit.confirm", + "english_translation": "Are you sure you want to quit?" + }, + { + "key": "options.onlyShowSecureChat.tooltip", + "english_translation": "Only display messages from other players that can be verified to have been sent by that player, and have not been modified." + }, + { + "key": "commands.data.modify.invalid_substring", + "english_translation": "Invalid substring indices: %s to %s" + }, + { + "key": "entity.minecraft.allay", + "english_translation": "Allay" + }, + { + "key": "commands.bossbar.remove.success", + "english_translation": "Removed custom bossbar %s" + }, + { + "key": "block.minecraft.sculk_sensor", + "english_translation": "Sculk Sensor" + }, + { + "key": "gamerule.disableElytraMovementCheck", + "english_translation": "Disable elytra movement check" + }, + { + "key": "advancements.nether.create_full_beacon.description", + "english_translation": "Bring a Beacon to full power" + }, + { + "key": "block.minecraft.banner.creeper.orange", + "english_translation": "Orange Creeper Charge" + }, + { + "key": "addServer.enterIp", + "english_translation": "Server Address" + }, + { + "key": "item.minecraft.charcoal", + "english_translation": "Charcoal" + }, + { + "key": "stat.minecraft.clean_shulker_box", + "english_translation": "Shulker Boxes Cleaned" + }, + { + "key": "item.minecraft.tipped_arrow.effect.night_vision", + "english_translation": "Arrow of Night Vision" + }, + { + "key": "block.minecraft.stone_brick_slab", + "english_translation": "Stone Brick Slab" + }, + { + "key": "key.keyboard.left", + "english_translation": "Left Arrow" + }, + { + "key": "block.minecraft.banner.mojang.cyan", + "english_translation": "Cyan Thing" + }, + { + "key": "subtitles.entity.iron_golem.hurt", + "english_translation": "Iron Golem hurts" + }, + { + "key": "selectWorld.loading_list", + "english_translation": "Loading world list" + }, + { + "key": "block.minecraft.white_stained_glass", + "english_translation": "White Stained Glass" + }, + { + "key": "item.minecraft.bowl", + "english_translation": "Bowl" + }, + { + "key": "item.minecraft.bone_meal", + "english_translation": "Bone Meal" + }, + { + "key": "block.minecraft.cherry_wall_sign", + "english_translation": "Cherry Wall Sign" + }, + { + "key": "mco.configure.world.subscription.timeleft", + "english_translation": "Time left" + }, + { + "key": "multiplayer.status.no_connection", + "english_translation": "(no connection)" + }, + { + "key": "subtitles.block.respawn_anchor.deplete", + "english_translation": "Respawn Anchor depletes" + }, + { + "key": "createWorld.customize.custom.useOceanRuins", + "english_translation": "Ocean Ruins" + }, + { + "key": "arguments.objective.readonly", + "english_translation": "Scoreboard objective '%s' is read-only" + }, + { + "key": "gui.banned.reason.spam_or_advertising", + "english_translation": "Spam or advertising" + }, + { + "key": "commands.team.leave.success.single", + "english_translation": "Removed %s from any team" + }, + { + "key": "advancements.end.elytra.title", + "english_translation": "Sky's the Limit" + }, + { + "key": "entity.minecraft.piglin_brute", + "english_translation": "Piglin Brute" + }, + { + "key": "subtitles.entity.wandering_trader.hurt", + "english_translation": "Wandering Trader hurts" + }, + { + "key": "block.minecraft.banner.diagonal_left.cyan", + "english_translation": "Cyan Per Bend Sinister" + }, + { + "key": "block.minecraft.banner.stripe_bottom.light_blue", + "english_translation": "Light Blue Base" + }, + { + "key": "menu.preparingSpawn", + "english_translation": "Preparing spawn area: %s%%" + }, + { + "key": "createWorld.customize.custom.biomeScaleWeight", + "english_translation": "Biome Scale Weight" + }, + { + "key": "block.minecraft.end_stone", + "english_translation": "End Stone" + }, + { + "key": "subtitles.entity.horse.armor", + "english_translation": "Horse armor equips" + }, + { + "key": "block.minecraft.potted_white_tulip", + "english_translation": "Potted White Tulip" + }, + { + "key": "block.minecraft.warped_door", + "english_translation": "Warped Door" + }, + { + "key": "chat.cannotSend", + "english_translation": "Cannot send chat message" + }, + { + "key": "mco.download.title", + "english_translation": "Downloading latest world" + }, + { + "key": "item.minecraft.splash_potion.effect.fire_resistance", + "english_translation": "Splash Potion of Fire Resistance" + }, + { + "key": "block.minecraft.banner.half_vertical_right.pink", + "english_translation": "Pink Per Pale Inverted" + }, + { + "key": "block.minecraft.banner.triangles_bottom.light_gray", + "english_translation": "Light Gray Base Indented" + }, + { + "key": "selectWorld.edit.export_worldgen_settings.success", + "english_translation": "Exported" + }, + { + "key": "item.minecraft.mourner_pottery_sherd", + "english_translation": "Mourner Pottery Sherd" + }, + { + "key": "stat.minecraft.damage_dealt", + "english_translation": "Damage Dealt" + }, + { + "key": "createWorld.customize.presets.list", + "english_translation": "Alternatively, here's some we made earlier!" + }, + { + "key": "block.minecraft.stripped_bamboo_block", + "english_translation": "Block of Stripped Bamboo" + }, + { + "key": "item.minecraft.shield.red", + "english_translation": "Red Shield" + }, + { + "key": "block.minecraft.quartz_pillar", + "english_translation": "Quartz Pillar" + }, + { + "key": "commands.bossbar.get.visible.hidden", + "english_translation": "Custom bossbar %s is currently hidden" + }, + { + "key": "title.32bit.deprecation.realms.check", + "english_translation": "Do not show this screen again" + }, + { + "key": "argument.pos3d.incomplete", + "english_translation": "Incomplete (expected 3 coordinates)" + }, + { + "key": "item.minecraft.diamond_sword", + "english_translation": "Diamond Sword" + }, + { + "key": "mco.backup.entry.gameMode", + "english_translation": "Game Mode" + }, + { + "key": "block.minecraft.oak_planks", + "english_translation": "Oak Planks" + }, + { + "key": "item.minecraft.amethyst_shard", + "english_translation": "Amethyst Shard" + }, + { + "key": "subtitles.entity.piglin.celebrate", + "english_translation": "Piglin celebrates" + }, + { + "key": "block.minecraft.structure_void", + "english_translation": "Structure Void" + }, + { + "key": "tutorial.socialInteractions.title", + "english_translation": "Social Interactions" + }, + { + "key": "block.minecraft.purple_shulker_box", + "english_translation": "Purple Shulker Box" + }, + { + "key": "commands.item.source.not_a_container", + "english_translation": "Source position %s, %s, %s is not a container" + }, + { + "key": "jigsaw_block.pool", + "english_translation": "Target Pool:" + }, + { + "key": "block.minecraft.potatoes", + "english_translation": "Potatoes" + }, + { + "key": "subtitles.entity.camel.step_sand", + "english_translation": "Camel sands" + }, + { + "key": "datapackFailure.safeMode", + "english_translation": "Safe Mode" + }, + { + "key": "block.minecraft.light_blue_bed", + "english_translation": "Light Blue Bed" + }, + { + "key": "subtitles.block.sniffer_egg.crack", + "english_translation": "Sniffer Egg cracks" + }, + { + "key": "item.modifiers.head", + "english_translation": "When on Head:" + }, + { + "key": "options.on.composed", + "english_translation": "%s: ON" + }, + { + "key": "advancements.adventure.honey_block_slide.title", + "english_translation": "Sticky Situation" + }, + { + "key": "commands.worldborder.damage.buffer.success", + "english_translation": "Set the world border damage buffer to %s block(s)" + }, + { + "key": "subtitles.entity.player.levelup", + "english_translation": "Player dings" + }, + { + "key": "block.minecraft.glass_pane", + "english_translation": "Glass Pane" + }, + { + "key": "block.minecraft.banner.diagonal_right.cyan", + "english_translation": "Cyan Per Bend" + }, + { + "key": "subtitles.entity.camel.sit", + "english_translation": "Camel sits down" + }, + { + "key": "block.minecraft.cut_copper_slab", + "english_translation": "Cut Copper Slab" + }, + { + "key": "gui.chatReport.report_sent_msg", + "english_translation": "We’ve successfully received your report. Thank you!\n\nOur team will review it as soon as possible." + }, + { + "key": "gui.socialInteractions.blocking_hint", + "english_translation": "Manage with Microsoft account" + }, + { + "key": "options.telemetry.button.tooltip", + "english_translation": "\"%s\" includes only the required data.\n\"%s\" includes optional, as well as the required data." + }, + { + "key": "trim_pattern.minecraft.coast", + "english_translation": "Coast Armor Trim" + }, + { + "key": "biome.minecraft.warped_forest", + "english_translation": "Warped Forest" + }, + { + "key": "item.minecraft.splash_potion.effect.slow_falling", + "english_translation": "Splash Potion of Slow Falling" + }, + { + "key": "item.minecraft.book", + "english_translation": "Book" + }, + { + "key": "block.minecraft.banner.gradient.brown", + "english_translation": "Brown Gradient" + }, + { + "key": "entity.minecraft.magma_cube", + "english_translation": "Magma Cube" + }, + { + "key": "block.minecraft.banner.curly_border.gray", + "english_translation": "Gray Bordure Indented" + }, + { + "key": "options.particles.all", + "english_translation": "All" + }, + { + "key": "block.minecraft.black_shulker_box", + "english_translation": "Black Shulker Box" + }, + { + "key": "subtitles.block.amethyst_block.chime", + "english_translation": "Amethyst chimes" + }, + { + "key": "advancements.nether.root.description", + "english_translation": "Bring summer clothes" + }, + { + "key": "block.minecraft.banner.straight_cross.purple", + "english_translation": "Purple Cross" + }, + { + "key": "multiplayer.texturePrompt.serverPrompt", + "english_translation": "%s\n\nMessage from server:\n%s" + }, + { + "key": "key.forward", + "english_translation": "Walk Forwards" + }, + { + "key": "mco.template.trailer.tooltip", + "english_translation": "Map trailer" + }, + { + "key": "gamerule.showDeathMessages", + "english_translation": "Show death messages" + }, + { + "key": "commands.enchant.success.single", + "english_translation": "Applied enchantment %s to %s's item" + }, + { + "key": "advancements.end.find_end_city.title", + "english_translation": "The City at the End of the Game" + }, + { + "key": "item.minecraft.bamboo_chest_raft", + "english_translation": "Bamboo Raft with Chest" + }, + { + "key": "block.minecraft.banner.square_top_left.blue", + "english_translation": "Blue Chief Dexter Canton" + }, + { + "key": "block.minecraft.banner.stripe_center.yellow", + "english_translation": "Yellow Pale" + }, + { + "key": "mco.configure.world.invite.profile.name", + "english_translation": "Name" + }, + { + "key": "entity.minecraft.evoker", + "english_translation": "Evoker" + }, + { + "key": "item.minecraft.firework_star.cyan", + "english_translation": "Cyan" + }, + { + "key": "block.minecraft.brick_slab", + "english_translation": "Brick Slab" + }, + { + "key": "mco.errorMessage.generic", + "english_translation": "An error occurred: " + }, + { + "key": "subtitles.entity.slime.hurt", + "english_translation": "Slime hurts" + }, + { + "key": "advancements.adventure.throw_trident.title", + "english_translation": "A Throwaway Joke" + }, + { + "key": "block.minecraft.deepslate_emerald_ore", + "english_translation": "Deepslate Emerald Ore" + }, + { + "key": "commands.jfr.stopped", + "english_translation": "JFR profiling stopped and dumped to %s" + }, + { + "key": "block.minecraft.crimson_wall_sign", + "english_translation": "Crimson Wall Sign" + }, + { + "key": "block.minecraft.bamboo_slab", + "english_translation": "Bamboo Slab" + }, + { + "key": "gamerule.reducedDebugInfo.description", + "english_translation": "Limits contents of debug screen." + }, + { + "key": "item.minecraft.apple", + "english_translation": "Apple" + }, + { + "key": "block.minecraft.brown_wool", + "english_translation": "Brown Wool" + }, + { + "key": "subtitles.entity.ghast.ambient", + "english_translation": "Ghast cries" + }, + { + "key": "arguments.function.tag.unknown", + "english_translation": "Unknown function tag '%s'" + }, + { + "key": "subtitles.entity.ravager.stunned", + "english_translation": "Ravager stunned" + }, + { + "key": "entity.minecraft.turtle", + "english_translation": "Turtle" + }, + { + "key": "subtitles.entity.bee.loop", + "english_translation": "Bee buzzes" + }, + { + "key": "commands.datapack.list.available.success", + "english_translation": "There are %s data pack(s) available: %s" + }, + { + "key": "advancements.story.cure_zombie_villager.title", + "english_translation": "Zombie Doctor" + }, + { + "key": "item.minecraft.bone", + "english_translation": "Bone" + }, + { + "key": "advancements.husbandry.netherite_hoe.description", + "english_translation": "Use a Netherite Ingot to upgrade a Hoe, and then reevaluate your life choices" + }, + { + "key": "selectWorld.edit.save", + "english_translation": "Save" + }, + { + "key": "argument.angle.incomplete", + "english_translation": "Incomplete (expected 1 angle)" + }, + { + "key": "effect.minecraft.speed", + "english_translation": "Speed" + }, + { + "key": "subtitles.entity.tadpole.death", + "english_translation": "Tadpole dies" + }, + { + "key": "block.minecraft.polished_andesite", + "english_translation": "Polished Andesite" + }, + { + "key": "subtitles.block.sweet_berry_bush.pick_berries", + "english_translation": "Berries pop" + }, + { + "key": "chat.editBox", + "english_translation": "chat" + }, + { + "key": "gui.chatReport.read_info", + "english_translation": "Learn About Reporting" + }, + { + "key": "item.minecraft.lapis_lazuli", + "english_translation": "Lapis Lazuli" + }, + { + "key": "subtitles.entity.piglin.ambient", + "english_translation": "Piglin snorts" + }, + { + "key": "multiplayer.status.version.narration", + "english_translation": "Server version: %s" + }, + { + "key": "multiplayer.disconnect.too_many_pending_chats", + "english_translation": "Too many unacknowledged chat messages" + }, + { + "key": "block.minecraft.banner.diagonal_right.orange", + "english_translation": "Orange Per Bend" + }, + { + "key": "mco.configure.world.buttons.switchminigame", + "english_translation": "Switch minigame" + }, + { + "key": "biome.minecraft.small_end_islands", + "english_translation": "Small End Islands" + }, + { + "key": "block.minecraft.banner.base.green", + "english_translation": "Fully Green Field" + }, + { + "key": "commands.experience.add.levels.success.single", + "english_translation": "Gave %s experience levels to %s" + }, + { + "key": "subtitles.entity.guardian.attack", + "english_translation": "Guardian shoots" + }, + { + "key": "commands.effect.clear.specific.success.single", + "english_translation": "Removed effect %s from %s" + }, + { + "key": "block.minecraft.banner.square_top_left.lime", + "english_translation": "Lime Chief Dexter Canton" + }, + { + "key": "stat.minecraft.walk_one_cm", + "english_translation": "Distance Walked" + }, + { + "key": "outOfMemory.title", + "english_translation": "Out of memory!" + }, + { + "key": "subtitles.entity.generic.death", + "english_translation": "Dying" + }, + { + "key": "block.minecraft.banner.square_bottom_left.gray", + "english_translation": "Gray Base Dexter Canton" + }, + { + "key": "commands.scoreboard.objectives.display.set", + "english_translation": "Set display slot %s to show objective %s" + }, + { + "key": "advancements.nether.explore_nether.description", + "english_translation": "Explore all Nether biomes" + }, + { + "key": "itemGroup.tools", + "english_translation": "Tools & Utilities" + }, + { + "key": "commands.bossbar.set.visibility.unchanged.visible", + "english_translation": "Nothing changed. The bossbar is already visible" + }, + { + "key": "pack.source.builtin", + "english_translation": "built-in" + }, + { + "key": "commands.perf.reportFailed", + "english_translation": "Failed to create debug report" + }, + { + "key": "block.minecraft.cyan_stained_glass", + "english_translation": "Cyan Stained Glass" + }, + { + "key": "narrator.joining", + "english_translation": "Joining" + }, + { + "key": "item.minecraft.bee_spawn_egg", + "english_translation": "Bee Spawn Egg" + }, + { + "key": "commands.place.structure.success", + "english_translation": "Generated structure \"%s\" at %s, %s, %s" + }, + { + "key": "enchantment.minecraft.luck_of_the_sea", + "english_translation": "Luck of the Sea" + }, + { + "key": "item.minecraft.fox_spawn_egg", + "english_translation": "Fox Spawn Egg" + }, + { + "key": "commands.reload.success", + "english_translation": "Reloading!" + }, + { + "key": "mco.connect.connecting", + "english_translation": "Connecting to the realm..." + }, + { + "key": "block.minecraft.spruce_slab", + "english_translation": "Spruce Slab" + }, + { + "key": "painting.minecraft.bust.title", + "english_translation": "Bust" + }, + { + "key": "subtitles.entity.boat.paddle_land", + "english_translation": "Rowing" + }, + { + "key": "painting.minecraft.wind.title", + "english_translation": "Wind" + }, + { + "key": "pack.dropConfirm", + "english_translation": "Do you want to add the following packs to Minecraft?" + }, + { + "key": "block.minecraft.banner.border.magenta", + "english_translation": "Magenta Bordure" + }, + { + "key": "gui.chatReport.discard.content", + "english_translation": "If you leave, you'll lose this report and your comments.\nAre you sure you want to leave?" + }, + { + "key": "block.minecraft.banner.creeper.red", + "english_translation": "Red Creeper Charge" + }, + { + "key": "entity.minecraft.tropical_fish", + "english_translation": "Tropical Fish" + }, + { + "key": "options.autoJump", + "english_translation": "Auto-Jump" + }, + { + "key": "event.minecraft.raid.raiders_remaining", + "english_translation": "Raiders Remaining: %s" + }, + { + "key": "subtitles.entity.piglin.admiring_item", + "english_translation": "Piglin admires item" + }, + { + "key": "block.minecraft.oak_trapdoor", + "english_translation": "Oak Trapdoor" + }, + { + "key": "options.framerate", + "english_translation": "%s fps" + }, + { + "key": "block.minecraft.glass", + "english_translation": "Glass" + }, + { + "key": "subtitles.entity.elder_guardian.hurt", + "english_translation": "Elder Guardian hurts" + }, + { + "key": "gui.chatReport.title", + "english_translation": "Report Player" + }, + { + "key": "container.hopper", + "english_translation": "Item Hopper" + }, + { + "key": "entity.minecraft.bee", + "english_translation": "Bee" + }, + { + "key": "block.minecraft.budding_amethyst", + "english_translation": "Budding Amethyst" + }, + { + "key": "arguments.item.tag.unknown", + "english_translation": "Unknown item tag '%s'" + }, + { + "key": "block.minecraft.white_bed", + "english_translation": "White Bed" + }, + { + "key": "createWorld.customize.custom.presets.title", + "english_translation": "Customize World Presets" + }, + { + "key": "commands.debug.function.success.single", + "english_translation": "Traced %s command(s) from function '%s' to output file %s" + }, + { + "key": "subtitles.entity.pillager.ambient", + "english_translation": "Pillager murmurs" + }, + { + "key": "block.minecraft.banner.rhombus.red", + "english_translation": "Red Lozenge" + }, + { + "key": "mco.notification.visitUrl.buttonText.default", + "english_translation": "Open link" + }, + { + "key": "stat.minecraft.damage_dealt_resisted", + "english_translation": "Damage Dealt (Resisted)" + }, + { + "key": "createWorld.customize.custom.defaults", + "english_translation": "Defaults" + }, + { + "key": "entity.minecraft.item_frame", + "english_translation": "Item Frame" + }, + { + "key": "block.minecraft.brain_coral_block", + "english_translation": "Brain Coral Block" + }, + { + "key": "item.minecraft.tropical_fish", + "english_translation": "Tropical Fish" + }, + { + "key": "stat.minecraft.mob_kills", + "english_translation": "Mob Kills" + }, + { + "key": "death.attack.fall.player", + "english_translation": "%1$s hit the ground too hard whilst trying to escape %2$s" + }, + { + "key": "mco.download.percent", + "english_translation": "%s %%" + }, + { + "key": "options.telemetry.state.minimal", + "english_translation": "Minimal" + }, + { + "key": "gui.socialInteractions.status_blocked_offline", + "english_translation": "Blocked - Offline" + }, + { + "key": "block.minecraft.banner.piglin.pink", + "english_translation": "Pink Snout" + }, + { + "key": "block.minecraft.banner.stripe_right.cyan", + "english_translation": "Cyan Pale Sinister" + }, + { + "key": "accessibility.onboarding.screen.title", + "english_translation": "Welcome to Minecraft!\n\nWould you like to enable the Narrator or visit the Accessibility Settings?" + }, + { + "key": "subtitles.entity.villager.work_toolsmith", + "english_translation": "Toolsmith works" + }, + { + "key": "block.minecraft.banner.border.white", + "english_translation": "White Bordure" + }, + { + "key": "item.minecraft.tipped_arrow.effect.harming", + "english_translation": "Arrow of Harming" + }, + { + "key": "stat.minecraft.animals_bred", + "english_translation": "Animals Bred" + }, + { + "key": "block.minecraft.dark_oak_slab", + "english_translation": "Dark Oak Slab" + }, + { + "key": "createWorld.customize.custom.riverSize", + "english_translation": "River Size" + }, + { + "key": "subtitles.block.respawn_anchor.ambient", + "english_translation": "Portal whooshes" + }, + { + "key": "block.minecraft.banner.triangle_bottom.light_blue", + "english_translation": "Light Blue Chevron" + }, + { + "key": "block.minecraft.cartography_table", + "english_translation": "Cartography Table" + }, + { + "key": "itemGroup.consumables", + "english_translation": "Consumables" + }, + { + "key": "permissions.requires.entity", + "english_translation": "An entity is required to run this command here" + }, + { + "key": "subtitles.block.bubble_column.whirlpool_ambient", + "english_translation": "Bubbles whirl" + }, + { + "key": "subtitles.entity.dolphin.ambient", + "english_translation": "Dolphin chirps" + }, + { + "key": "subtitles.entity.guardian.death", + "english_translation": "Guardian dies" + }, + { + "key": "entity.minecraft.bat", + "english_translation": "Bat" + }, + { + "key": "block.minecraft.stripped_birch_log", + "english_translation": "Stripped Birch Log" + }, + { + "key": "subtitles.entity.dolphin.death", + "english_translation": "Dolphin dies" + }, + { + "key": "death.attack.thrown.item", + "english_translation": "%1$s was pummeled by %2$s using %3$s" + }, + { + "key": "commands.enchant.success.multiple", + "english_translation": "Applied enchantment %s to %s entities" + }, + { + "key": "commands.advancement.grant.many.to.one.failure", + "english_translation": "Couldn't grant %s advancements to %s as they already have them" + }, + { + "key": "subtitles.entity.llama.spit", + "english_translation": "Llama spits" + }, + { + "key": "options.viewBobbing", + "english_translation": "View Bobbing" + }, + { + "key": "enchantment.minecraft.flame", + "english_translation": "Flame" + }, + { + "key": "commands.advancement.revoke.many.to.many.failure", + "english_translation": "Couldn't revoke %s advancements from %s players as they don't have them" + }, + { + "key": "advancements.adventure.hero_of_the_village.title", + "english_translation": "Hero of the Village" + }, + { + "key": "advancements.story.deflect_arrow.description", + "english_translation": "Deflect a projectile with a Shield" + }, + { + "key": "block.minecraft.pink_bed", + "english_translation": "Pink Bed" + }, + { + "key": "debug.creative_spectator.help", + "english_translation": "F3 + N = Cycle previous game mode <-> spectator" + }, + { + "key": "block.minecraft.glow_lichen", + "english_translation": "Glow Lichen" + }, + { + "key": "menu.options", + "english_translation": "Options..." + }, + { + "key": "block.minecraft.mangrove_hanging_sign", + "english_translation": "Mangrove Hanging Sign" + }, + { + "key": "stat_type.minecraft.killed.none", + "english_translation": "You have never killed %s" + }, + { + "key": "entity.minecraft.villager.butcher", + "english_translation": "Butcher" + }, + { + "key": "subtitles.entity.panda.death", + "english_translation": "Panda dies" + }, + { + "key": "block.minecraft.banner.bricks.black", + "english_translation": "Black Field Masoned" + }, + { + "key": "block.minecraft.banner.half_horizontal_bottom.light_gray", + "english_translation": "Light Gray Per Fess Inverted" + }, + { + "key": "block.minecraft.raw_copper_block", + "english_translation": "Block of Raw Copper" + }, + { + "key": "mco.configure.world.subscription.recurring.daysleft", + "english_translation": "Renewed automatically in" + }, + { + "key": "block.minecraft.packed_mud", + "english_translation": "Packed Mud" + }, + { + "key": "entity.minecraft.mule", + "english_translation": "Mule" + }, + { + "key": "gamerule.doMobSpawning.description", + "english_translation": "Some entities might have separate rules." + }, + { + "key": "block.minecraft.gray_shulker_box", + "english_translation": "Gray Shulker Box" + }, + { + "key": "block.minecraft.skeleton_skull", + "english_translation": "Skeleton Skull" + }, + { + "key": "gui.chatReport.more_comments", + "english_translation": "Please describe what happened:" + }, + { + "key": "subtitles.block.shulker_box.close", + "english_translation": "Shulker closes" + }, + { + "key": "team.visibility.hideForOwnTeam", + "english_translation": "Hide for own team" + }, + { + "key": "options.customizeTitle", + "english_translation": "Customize World Settings" + }, + { + "key": "selectWorld.data_read", + "english_translation": "Reading world data..." + }, + { + "key": "gui.stats", + "english_translation": "Statistics" + }, + { + "key": "gui.abuseReport.reason.description", + "english_translation": "Description:" + }, + { + "key": "item.minecraft.golden_pickaxe", + "english_translation": "Golden Pickaxe" + }, + { + "key": "block.minecraft.banner.stripe_downright.yellow", + "english_translation": "Yellow Bend" + }, + { + "key": "block.minecraft.banner.stripe_left.pink", + "english_translation": "Pink Pale Dexter" + }, + { + "key": "entity.minecraft.chicken", + "english_translation": "Chicken" + }, + { + "key": "subtitles.entity.wolf.death", + "english_translation": "Wolf dies" + }, + { + "key": "potion.withDuration", + "english_translation": "%s (%s)" + }, + { + "key": "argument.literal.incorrect", + "english_translation": "Expected literal %s" + }, + { + "key": "block.minecraft.lilac", + "english_translation": "Lilac" + }, + { + "key": "gamerule.doLimitedCrafting", + "english_translation": "Require recipe for crafting" + }, + { + "key": "mco.upload.done", + "english_translation": "Upload done" + }, + { + "key": "block.minecraft.banner.base.black", + "english_translation": "Fully Black Field" + }, + { + "key": "item.minecraft.tipped_arrow.effect.leaping", + "english_translation": "Arrow of Leaping" + }, + { + "key": "item.minecraft.burn_pottery_sherd", + "english_translation": "Burn Pottery Sherd" + }, + { + "key": "item.minecraft.snort_pottery_sherd", + "english_translation": "Snort Pottery Sherd" + }, + { + "key": "mco.connect.success", + "english_translation": "Done" + }, + { + "key": "block.minecraft.banner.triangles_top.purple", + "english_translation": "Purple Chief Indented" + }, + { + "key": "commands.bossbar.get.visible.visible", + "english_translation": "Custom bossbar %s is currently shown" + }, + { + "key": "block.minecraft.oxidized_cut_copper_slab", + "english_translation": "Oxidized Cut Copper Slab" + }, + { + "key": "commands.data.entity.query", + "english_translation": "%s has the following entity data: %s" + }, + { + "key": "block.minecraft.bricks", + "english_translation": "Bricks" + }, + { + "key": "block.minecraft.warped_nylium", + "english_translation": "Warped Nylium" + }, + { + "key": "stats.tooltip.type.statistic", + "english_translation": "Statistic" + }, + { + "key": "block.minecraft.diorite_slab", + "english_translation": "Diorite Slab" + }, + { + "key": "block.minecraft.banner.border.black", + "english_translation": "Black Bordure" + }, + { + "key": "block.minecraft.banner.square_bottom_right.brown", + "english_translation": "Brown Base Sinister Canton" + }, + { + "key": "block.minecraft.banner.triangles_bottom.brown", + "english_translation": "Brown Base Indented" + }, + { + "key": "mco.account.privacy.info", + "english_translation": "Read more about Mojang and privacy laws" + }, + { + "key": "menu.respawning", + "english_translation": "Respawning" + }, + { + "key": "container.crafting", + "english_translation": "Crafting" + }, + { + "key": "pack.incompatible", + "english_translation": "Incompatible" + }, + { + "key": "debug.pause_focus.on", + "english_translation": "Pause on lost focus: enabled" + }, + { + "key": "tutorial.open_inventory.description", + "english_translation": "Press %s" + }, + { + "key": "block.minecraft.dark_oak_planks", + "english_translation": "Dark Oak Planks" + }, + { + "key": "argument.pos.missing.int", + "english_translation": "Expected a block position" + }, + { + "key": "item.minecraft.pig_spawn_egg", + "english_translation": "Pig Spawn Egg" + }, + { + "key": "item.minecraft.skull_pottery_shard", + "english_translation": "Skull Pottery Shard" + }, + { + "key": "advancements.end.root.description", + "english_translation": "Or the beginning?" + }, + { + "key": "block.minecraft.melon_stem", + "english_translation": "Melon Stem" + }, + { + "key": "argument.long.low", + "english_translation": "Long must not be less than %s, found %s" + }, + { + "key": "color.minecraft.yellow", + "english_translation": "Yellow" + }, + { + "key": "block.minecraft.banner.half_horizontal.light_gray", + "english_translation": "Light Gray Per Fess" + }, + { + "key": "multiplayer.status.unknown", + "english_translation": "???" + }, + { + "key": "item.minecraft.iron_pickaxe", + "english_translation": "Iron Pickaxe" + }, + { + "key": "block.minecraft.mossy_cobblestone_stairs", + "english_translation": "Mossy Cobblestone Stairs" + }, + { + "key": "block.minecraft.cobbled_deepslate_wall", + "english_translation": "Cobbled Deepslate Wall" + }, + { + "key": "enchantment.minecraft.fire_aspect", + "english_translation": "Fire Aspect" + }, + { + "key": "commands.whitelist.alreadyOn", + "english_translation": "Whitelist is already turned on" + }, + { + "key": "subtitles.entity.iron_golem.attack", + "english_translation": "Iron Golem attacks" + }, + { + "key": "commands.bossbar.create.failed", + "english_translation": "A bossbar already exists with the ID '%s'" + }, + { + "key": "mco.configure.world.spawnMonsters", + "english_translation": "Spawn monsters" + }, + { + "key": "disconnect.loginFailedInfo", + "english_translation": "Failed to log in: %s" + }, + { + "key": "subtitles.entity.villager.work_armorer", + "english_translation": "Armorer works" + }, + { + "key": "multiplayer.requiredTexturePrompt.disconnect", + "english_translation": "Server requires a custom resource pack" + }, + { + "key": "block.minecraft.potted_orange_tulip", + "english_translation": "Potted Orange Tulip" + }, + { + "key": "subtitles.entity.shulker_bullet.hurt", + "english_translation": "Shulker Bullet breaks" + }, + { + "key": "block.minecraft.bubble_coral_fan", + "english_translation": "Bubble Coral Fan" + }, + { + "key": "block.minecraft.deepslate_coal_ore", + "english_translation": "Deepslate Coal Ore" + }, + { + "key": "block.minecraft.dead_fire_coral", + "english_translation": "Dead Fire Coral" + }, + { + "key": "block.minecraft.banner.gradient.light_gray", + "english_translation": "Light Gray Gradient" + }, + { + "key": "tutorial.socialInteractions.description", + "english_translation": "Press %s to open" + }, + { + "key": "block.minecraft.brain_coral_fan", + "english_translation": "Brain Coral Fan" + }, + { + "key": "argument.entity.notfound.player", + "english_translation": "No player was found" + }, + { + "key": "sleep.skipping_night", + "english_translation": "Sleeping through this night" + }, + { + "key": "telemetry.property.server_modded.title", + "english_translation": "Server Modded" + }, + { + "key": "entity.minecraft.zombie_villager", + "english_translation": "Zombie Villager" + }, + { + "key": "container.enchant.lapis.many", + "english_translation": "%s Lapis Lazuli" + }, + { + "key": "item.minecraft.wandering_trader_spawn_egg", + "english_translation": "Wandering Trader Spawn Egg" + }, + { + "key": "subtitles.entity.parrot.imitate.witch", + "english_translation": "Parrot giggles" + }, + { + "key": "multiplayer.disconnect.missing_tags", + "english_translation": "Incomplete set of tags received from server.\nPlease contact server operator." + }, + { + "key": "options.chat.height.unfocused", + "english_translation": "Unfocused Height" + }, + { + "key": "subtitles.entity.stray.ambient", + "english_translation": "Stray rattles" + }, + { + "key": "argument.block.property.novalue", + "english_translation": "Expected value for property '%s' on block %s" + }, + { + "key": "block.minecraft.bed.not_safe", + "english_translation": "You may not rest now; there are monsters nearby" + }, + { + "key": "commands.kill.success.single", + "english_translation": "Killed %s" + }, + { + "key": "options.chat.links", + "english_translation": "Web Links" + }, + { + "key": "block.minecraft.banner.straight_cross.light_blue", + "english_translation": "Light Blue Cross" + }, + { + "key": "block.minecraft.banner.diagonal_up_right.gray", + "english_translation": "Gray Per Bend Sinister Inverted" + }, + { + "key": "flat_world_preset.minecraft.desert", + "english_translation": "Desert" + }, + { + "key": "commands.place.template.failed", + "english_translation": "Failed to place template" + }, + { + "key": "advancements.end.find_end_city.description", + "english_translation": "Go on in, what could happen?" + }, + { + "key": "commands.drop.success.multiple", + "english_translation": "Dropped %s items" + }, + { + "key": "item.minecraft.cooked_salmon", + "english_translation": "Cooked Salmon" + }, + { + "key": "narrator.select", + "english_translation": "Selected: %s" + }, + { + "key": "selectWorld.gameMode.spectator.info", + "english_translation": "You can look but don't touch." + }, + { + "key": "block.minecraft.banner.globe.brown", + "english_translation": "Brown Globe" + }, + { + "key": "biome.minecraft.end_barrens", + "english_translation": "End Barrens" + }, + { + "key": "subtitles.block.anvil.land", + "english_translation": "Anvil landed" + }, + { + "key": "block.minecraft.banner.diagonal_up_left.pink", + "english_translation": "Pink Per Bend Inverted" + }, + { + "key": "item.minecraft.iron_axe", + "english_translation": "Iron Axe" + }, + { + "key": "block.minecraft.banner.border.green", + "english_translation": "Green Bordure" + }, + { + "key": "mco.selectServer.openserver", + "english_translation": "Open realm" + }, + { + "key": "item.minecraft.archer_pottery_sherd", + "english_translation": "Archer Pottery Sherd" + }, + { + "key": "block.minecraft.iron_door", + "english_translation": "Iron Door" + }, + { + "key": "commands.team.option.collisionRule.unchanged", + "english_translation": "Nothing changed. Collision rule is already that value" + }, + { + "key": "options.vsync", + "english_translation": "VSync" + }, + { + "key": "gamerule.commandModificationBlockLimit.description", + "english_translation": "Number of blocks that can be changed at once by one command, such as fill or clone." + }, + { + "key": "block.minecraft.piston", + "english_translation": "Piston" + }, + { + "key": "block.minecraft.mangrove_fence_gate", + "english_translation": "Mangrove Fence Gate" + }, + { + "key": "narration.button.usage.hovered", + "english_translation": "Left click to activate" + }, + { + "key": "container.enchant.level.requirement", + "english_translation": "Level Requirement: %s" + }, + { + "key": "gamerule.forgiveDeadPlayers.description", + "english_translation": "Angered neutral mobs stop being angry when the targeted player dies nearby." + }, + { + "key": "subtitles.entity.piglin_brute.angry", + "english_translation": "Piglin Brute snorts angrily" + }, + { + "key": "commands.attribute.failed.no_modifier", + "english_translation": "Attribute %s for entity %s has no modifier %s" + }, + { + "key": "gamerule.doTileDrops", + "english_translation": "Drop blocks" + }, + { + "key": "painting.minecraft.skull_and_roses.title", + "english_translation": "Skull and Roses" + }, + { + "key": "entity.minecraft.llama_spit", + "english_translation": "Llama Spit" + }, + { + "key": "structure_block.show_air", + "english_translation": "Show Invisible Blocks:" + }, + { + "key": "item.minecraft.lingering_potion.effect.weakness", + "english_translation": "Lingering Potion of Weakness" + }, + { + "key": "subtitles.block.iron_trapdoor.open", + "english_translation": "Trapdoor opens" + }, + { + "key": "options.accessibility.text_background.chat", + "english_translation": "Chat" + }, + { + "key": "chat.type.text.narrate", + "english_translation": "%s says %s" + }, + { + "key": "block.minecraft.grass_block", + "english_translation": "Grass Block" + }, + { + "key": "narration.tab_navigation.usage", + "english_translation": "Press Ctrl and Tab to switch between tabs" + }, + { + "key": "commands.enchant.failed.level", + "english_translation": "%s is higher than the maximum level of %s supported by that enchantment" + }, + { + "key": "options.graphics.fabulous", + "english_translation": "Fabulous!" + }, + { + "key": "chat.link.confirmTrusted", + "english_translation": "Do you want to open this link or copy it to your clipboard?" + }, + { + "key": "block.minecraft.brown_bed", + "english_translation": "Brown Bed" + }, + { + "key": "subtitles.entity.dolphin.ambient_water", + "english_translation": "Dolphin whistles" + }, + { + "key": "translation.test.complex", + "english_translation": "Prefix, %s%2$s again %s and %1$s lastly %s and also %1$s again!" + }, + { + "key": "block.minecraft.banner.square_top_right.red", + "english_translation": "Red Chief Sinister Canton" + }, + { + "key": "commands.setidletimeout.success", + "english_translation": "The player idle timeout is now %s minute(s)" + }, + { + "key": "title.multiplayer.disabled.banned.temporary", + "english_translation": "Your account is temporarily suspended from online play" + }, + { + "key": "commands.team.option.friendlyfire.enabled", + "english_translation": "Enabled friendly fire for team %s" + }, + { + "key": "item.minecraft.lodestone_compass", + "english_translation": "Lodestone Compass" + }, + { + "key": "block.minecraft.banner.gradient_up.white", + "english_translation": "White Base Gradient" + }, + { + "key": "block.minecraft.banner.small_stripes.yellow", + "english_translation": "Yellow Paly" + }, + { + "key": "painting.minecraft.graham.title", + "english_translation": "Graham" + }, + { + "key": "subtitles.entity.witch.drink", + "english_translation": "Witch drinks" + }, + { + "key": "commands.banip.failed", + "english_translation": "Nothing changed. That IP is already banned" + }, + { + "key": "narrator.ready_to_play", + "english_translation": "Ready to play" + }, + { + "key": "block.minecraft.banner.bricks.green", + "english_translation": "Green Field Masoned" + }, + { + "key": "key.right", + "english_translation": "Strafe Right" + }, + { + "key": "subtitles.entity.villager.yes", + "english_translation": "Villager agrees" + }, + { + "key": "gui.multiLineEditBox.character_limit", + "english_translation": "%s/%s" + }, + { + "key": "block.minecraft.infested_chiseled_stone_bricks", + "english_translation": "Infested Chiseled Stone Bricks" + }, + { + "key": "advancements.adventure.totem_of_undying.description", + "english_translation": "Use a Totem of Undying to cheat death" + }, + { + "key": "options.darknessEffectScale", + "english_translation": "Darkness Pulsing" + }, + { + "key": "death.attack.lava", + "english_translation": "%1$s tried to swim in lava" + }, + { + "key": "block.minecraft.jungle_wall_hanging_sign", + "english_translation": "Jungle Wall Hanging Sign" + }, + { + "key": "gamerule.drowningDamage", + "english_translation": "Deal drowning damage" + }, + { + "key": "block.minecraft.banner.triangle_top.cyan", + "english_translation": "Cyan Inverted Chevron" + }, + { + "key": "subtitles.entity.zombie.infect", + "english_translation": "Zombie infects" + }, + { + "key": "subtitles.entity.generic.splash", + "english_translation": "Splashing" + }, + { + "key": "event.minecraft.raid.victory", + "english_translation": "Victory" + }, + { + "key": "item.minecraft.firework_star.red", + "english_translation": "Red" + }, + { + "key": "death.attack.fireball.item", + "english_translation": "%1$s was fireballed by %2$s using %3$s" + }, + { + "key": "key.keyboard.keypad.equal", + "english_translation": "Keypad =" + }, + { + "key": "subtitles.block.pressure_plate.click", + "english_translation": "Pressure Plate clicks" + }, + { + "key": "subtitles.entity.husk.ambient", + "english_translation": "Husk groans" + }, + { + "key": "options.difficulty", + "english_translation": "Difficulty" + }, + { + "key": "argument.uuid.invalid", + "english_translation": "Invalid UUID" + }, + { + "key": "death.attack.inFire", + "english_translation": "%1$s went up in flames" + }, + { + "key": "commands.scoreboard.players.set.success.single", + "english_translation": "Set %s for %s to %s" + }, + { + "key": "entity.minecraft.skeleton", + "english_translation": "Skeleton" + }, + { + "key": "item.minecraft.blaze_spawn_egg", + "english_translation": "Blaze Spawn Egg" + }, + { + "key": "multiplayerWarning.message", + "english_translation": "Caution: Online play is offered by third-party servers that are not owned, operated, or supervised by Mojang Studios or Microsoft. During online play, you may be exposed to unmoderated chat messages or other types of user-generated content that may not be suitable for everyone." + }, + { + "key": "block.minecraft.banner.triangle_bottom.black", + "english_translation": "Black Chevron" + }, + { + "key": "commands.advancement.grant.criterion.to.one.success", + "english_translation": "Granted criterion '%s' of advancement %s to %s" + }, + { + "key": "block.minecraft.warped_slab", + "english_translation": "Warped Slab" + }, + { + "key": "item.modifiers.offhand", + "english_translation": "When in Off Hand:" + }, + { + "key": "multiplayer.status.incompatible", + "english_translation": "Incompatible version!" + }, + { + "key": "commands.drop.no_loot_table", + "english_translation": "Entity %s has no loot table" + }, + { + "key": "item.dyed", + "english_translation": "Dyed" + }, + { + "key": "subtitles.entity.wandering_trader.yes", + "english_translation": "Wandering Trader agrees" + }, + { + "key": "entity.minecraft.tnt_minecart", + "english_translation": "Minecart with TNT" + }, + { + "key": "key.mouse.left", + "english_translation": "Left Button" + }, + { + "key": "block.minecraft.banner.stripe_middle.orange", + "english_translation": "Orange Fess" + }, + { + "key": "mco.configure.world.spawnAnimals", + "english_translation": "Spawn animals" + }, + { + "key": "block.minecraft.magma_block", + "english_translation": "Magma Block" + }, + { + "key": "block.minecraft.lime_candle_cake", + "english_translation": "Cake with Lime Candle" + }, + { + "key": "item.minecraft.splash_potion.effect.awkward", + "english_translation": "Awkward Splash Potion" + }, + { + "key": "block.minecraft.decorated_pot", + "english_translation": "Decorated Pot" + }, + { + "key": "block.minecraft.spruce_door", + "english_translation": "Spruce Door" + }, + { + "key": "tutorial.find_tree.title", + "english_translation": "Find a tree" + }, + { + "key": "block.minecraft.pumpkin", + "english_translation": "Pumpkin" + }, + { + "key": "subtitles.entity.mule.death", + "english_translation": "Mule dies" + }, + { + "key": "subtitles.block.candle.crackle", + "english_translation": "Candle crackles" + }, + { + "key": "commands.ride.already_riding", + "english_translation": "%s is already riding %s" + }, + { + "key": "block.minecraft.banner.circle.pink", + "english_translation": "Pink Roundel" + }, + { + "key": "subtitles.entity.chicken.egg", + "english_translation": "Chicken plops" + }, + { + "key": "painting.minecraft.creebet.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "block.minecraft.sponge", + "english_translation": "Sponge" + }, + { + "key": "options.online.title", + "english_translation": "Online Options" + }, + { + "key": "subtitles.entity.zoglin.death", + "english_translation": "Zoglin dies" + }, + { + "key": "block.minecraft.light_gray_candle", + "english_translation": "Light Gray Candle" + }, + { + "key": "advancements.nether.create_beacon.description", + "english_translation": "Construct and place a Beacon" + }, + { + "key": "subtitles.entity.warden.death", + "english_translation": "Warden dies" + }, + { + "key": "options.sounds", + "english_translation": "Music & Sounds..." + }, + { + "key": "stat.minecraft.player_kills", + "english_translation": "Player Kills" + }, + { + "key": "telemetry.property.advancement_id.title", + "english_translation": "Advancement ID" + }, + { + "key": "item.minecraft.golden_boots", + "english_translation": "Golden Boots" + }, + { + "key": "key.keyboard.delete", + "english_translation": "Delete" + }, + { + "key": "commands.advancement.revoke.many.to.many.success", + "english_translation": "Revoked %s advancements from %s players" + }, + { + "key": "gui.chatSelection.selected", + "english_translation": "%s/%s message(s) selected" + }, + { + "key": "advancements.nether.all_effects.title", + "english_translation": "How Did We Get Here?" + }, + { + "key": "item.minecraft.birch_chest_boat", + "english_translation": "Birch Boat with Chest" + }, + { + "key": "subtitles.entity.evoker.prepare_summon", + "english_translation": "Evoker prepares summoning" + }, + { + "key": "block.minecraft.bamboo_door", + "english_translation": "Bamboo Door" + }, + { + "key": "block.minecraft.banner.stripe_downright.light_blue", + "english_translation": "Light Blue Bend" + }, + { + "key": "menu.working", + "english_translation": "Working..." + }, + { + "key": "advMode.mode.auto", + "english_translation": "Repeat" + }, + { + "key": "narrator.controls.reset", + "english_translation": "Reset %s button" + }, + { + "key": "gui.socialInteractions.tooltip.report.not_reportable", + "english_translation": "This player can't be reported, because their chat messages can't be verified on this server" + }, + { + "key": "mco.template.title.minigame", + "english_translation": "Minigames" + }, + { + "key": "dataPack.validation.working", + "english_translation": "Validating selected data packs..." + }, + { + "key": "argument.entity.options.y.description", + "english_translation": "y position" + }, + { + "key": "block.minecraft.cocoa", + "english_translation": "Cocoa" + }, + { + "key": "advancements.adventure.sleep_in_bed.description", + "english_translation": "Sleep in a Bed to change your respawn point" + }, + { + "key": "block.minecraft.banner.cross.purple", + "english_translation": "Purple Saltire" + }, + { + "key": "gui.hours", + "english_translation": "%s hour(s)" + }, + { + "key": "block.minecraft.andesite_stairs", + "english_translation": "Andesite Stairs" + }, + { + "key": "item.minecraft.carrot", + "english_translation": "Carrot" + }, + { + "key": "block.minecraft.banner.skull.orange", + "english_translation": "Orange Skull Charge" + }, + { + "key": "block.minecraft.red_sand", + "english_translation": "Red Sand" + }, + { + "key": "death.attack.witherSkull.item", + "english_translation": "%1$s was shot by a skull from %2$s using %3$s" + }, + { + "key": "block.minecraft.banner.half_horizontal.gray", + "english_translation": "Gray Per Fess" + }, + { + "key": "painting.minecraft.wasteland.title", + "english_translation": "Wasteland" + }, + { + "key": "advancements.nether.return_to_sender.description", + "english_translation": "Destroy a Ghast with a fireball" + }, + { + "key": "gamerule.doWardenSpawning", + "english_translation": "Spawn Wardens" + }, + { + "key": "item.minecraft.iron_ingot", + "english_translation": "Iron Ingot" + }, + { + "key": "painting.minecraft.sea.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "subtitles.entity.cat.death", + "english_translation": "Cat dies" + }, + { + "key": "item.minecraft.snowball", + "english_translation": "Snowball" + }, + { + "key": "block.minecraft.banner.curly_border.yellow", + "english_translation": "Yellow Bordure Indented" + }, + { + "key": "subtitles.entity.illusioner.prepare_blindness", + "english_translation": "Illusioner prepares blindness" + }, + { + "key": "disconnect.endOfStream", + "english_translation": "End of stream" + }, + { + "key": "jigsaw_block.levels", + "english_translation": "Levels: %s" + }, + { + "key": "commands.locate.structure.not_found", + "english_translation": "Could not find a structure of type \"%s\" nearby" + }, + { + "key": "block.minecraft.wet_sponge", + "english_translation": "Wet Sponge" + }, + { + "key": "stat.minecraft.open_chest", + "english_translation": "Chests Opened" + }, + { + "key": "container.repair.cost", + "english_translation": "Enchantment Cost: %1$s" + }, + { + "key": "subtitles.entity.witch.death", + "english_translation": "Witch dies" + }, + { + "key": "block.minecraft.banner.triangles_top.light_blue", + "english_translation": "Light Blue Chief Indented" + }, + { + "key": "item.minecraft.music_disc_mall", + "english_translation": "Music Disc" + }, + { + "key": "subtitles.entity.warden.ambient", + "english_translation": "Warden whines" + }, + { + "key": "block.minecraft.quartz_stairs", + "english_translation": "Quartz Stairs" + }, + { + "key": "argument.resource_tag.not_found", + "english_translation": "Can't find tag '%s' of type '%s'" + }, + { + "key": "commands.advancement.grant.many.to.one.success", + "english_translation": "Granted %s advancements to %s" + }, + { + "key": "connect.joining", + "english_translation": "Joining world..." + }, + { + "key": "block.minecraft.banner.square_top_left.purple", + "english_translation": "Purple Chief Dexter Canton" + }, + { + "key": "item.minecraft.enchanted_book", + "english_translation": "Enchanted Book" + }, + { + "key": "pack.selected.title", + "english_translation": "Selected" + }, + { + "key": "commands.team.option.name.success", + "english_translation": "Updated the name of team %s" + }, + { + "key": "selectWorld.gameMode.adventure.line2", + "english_translation": "be added or removed" + }, + { + "key": "item.minecraft.oak_boat", + "english_translation": "Oak Boat" + }, + { + "key": "selectWorld.gameMode.adventure.line1", + "english_translation": "Same as Survival Mode, but blocks can't" + }, + { + "key": "clear.failed.multiple", + "english_translation": "No items were found on %s players" + }, + { + "key": "selectWorld.warning.deprecated.title", + "english_translation": "Warning! These settings are using deprecated features" + }, + { + "key": "key.left", + "english_translation": "Strafe Left" + }, + { + "key": "block.minecraft.banner.triangles_top.magenta", + "english_translation": "Magenta Chief Indented" + }, + { + "key": "entity.minecraft.spawner_minecart", + "english_translation": "Minecart with Monster Spawner" + }, + { + "key": "item.minecraft.stone_sword", + "english_translation": "Stone Sword" + }, + { + "key": "block.minecraft.white_shulker_box", + "english_translation": "White Shulker Box" + }, + { + "key": "options.off.composed", + "english_translation": "%s: OFF" + }, + { + "key": "advancements.husbandry.breed_all_animals.title", + "english_translation": "Two by Two" + }, + { + "key": "block.minecraft.flowering_azalea", + "english_translation": "Flowering Azalea" + }, + { + "key": "block.minecraft.chiseled_nether_bricks", + "english_translation": "Chiseled Nether Bricks" + }, + { + "key": "block.minecraft.melon", + "english_translation": "Melon" + }, + { + "key": "block.minecraft.acacia_planks", + "english_translation": "Acacia Planks" + }, + { + "key": "item.minecraft.music_disc_stal", + "english_translation": "Music Disc" + }, + { + "key": "entity.minecraft.villager.mason", + "english_translation": "Mason" + }, + { + "key": "block.minecraft.banner.globe.light_gray", + "english_translation": "Light Gray Globe" + }, + { + "key": "item.minecraft.flower_banner_pattern", + "english_translation": "Banner Pattern" + }, + { + "key": "mco.configure.world.subscription.extend", + "english_translation": "Extend subscription" + }, + { + "key": "container.repair", + "english_translation": "Repair & Name" + }, + { + "key": "connect.negotiating", + "english_translation": "Negotiating..." + }, + { + "key": "filled_map.monument", + "english_translation": "Ocean Explorer Map" + }, + { + "key": "narration.button.usage.focused", + "english_translation": "Press Enter to activate" + }, + { + "key": "block.minecraft.chipped_anvil", + "english_translation": "Chipped Anvil" + }, + { + "key": "argument.entity.options.type.invalid", + "english_translation": "Invalid or unknown entity type '%s'" + }, + { + "key": "options.chat.scale", + "english_translation": "Chat Text Size" + }, + { + "key": "biome.minecraft.end_midlands", + "english_translation": "End Midlands" + }, + { + "key": "block.minecraft.infested_deepslate", + "english_translation": "Infested Deepslate" + }, + { + "key": "mco.reset.world.experience", + "english_translation": "Experiences" + }, + { + "key": "subtitles.entity.warden.listening_angry", + "english_translation": "Warden takes notice angrily" + }, + { + "key": "effect.minecraft.bad_omen", + "english_translation": "Bad Omen" + }, + { + "key": "optimizeWorld.stage.finished", + "english_translation": "Finishing up..." + }, + { + "key": "subtitles.entity.experience_orb.pickup", + "english_translation": "Experience gained" + }, + { + "key": "gui.chatReport.select_reason", + "english_translation": "Select Report Category" + }, + { + "key": "subtitles.entity.ender_pearl.throw", + "english_translation": "Ender Pearl flies" + }, + { + "key": "commands.experience.query.levels", + "english_translation": "%s has %s experience levels" + }, + { + "key": "debug.inspect.client.entity", + "english_translation": "Copied client-side entity data to clipboard" + }, + { + "key": "mco.brokenworld.minigame.title", + "english_translation": "This minigame is no longer supported" + }, + { + "key": "subtitles.entity.turtle.hurt_baby", + "english_translation": "Turtle baby hurts" + }, + { + "key": "block.minecraft.stripped_mangrove_log", + "english_translation": "Stripped Mangrove Log" + }, + { + "key": "block.minecraft.banner.circle.yellow", + "english_translation": "Yellow Roundel" + }, + { + "key": "block.minecraft.banner.triangle_bottom.green", + "english_translation": "Green Chevron" + }, + { + "key": "editGamerule.default", + "english_translation": "Default: %s" + }, + { + "key": "item.minecraft.firework_star.fade_to", + "english_translation": "Fade to" + }, + { + "key": "item.minecraft.music_disc_cat", + "english_translation": "Music Disc" + }, + { + "key": "block.minecraft.banner.gradient_up.orange", + "english_translation": "Orange Base Gradient" + }, + { + "key": "block.minecraft.black_stained_glass_pane", + "english_translation": "Black Stained Glass Pane" + }, + { + "key": "subtitles.entity.ghast.death", + "english_translation": "Ghast dies" + }, + { + "key": "subtitles.entity.cow.ambient", + "english_translation": "Cow moos" + }, + { + "key": "block.minecraft.oak_wood", + "english_translation": "Oak Wood" + }, + { + "key": "block.minecraft.powered_rail", + "english_translation": "Powered Rail" + }, + { + "key": "datapackFailure.safeMode.failed.title", + "english_translation": "Failed to load world in Safe Mode." + }, + { + "key": "argument.dimension.invalid", + "english_translation": "Unknown dimension '%s'" + }, + { + "key": "debug.dump_dynamic_textures", + "english_translation": "Saved dynamic textures to %s" + }, + { + "key": "argument.entity.selector.self", + "english_translation": "Current entity" + }, + { + "key": "commands.team.option.prefix.success", + "english_translation": "Team prefix set to %s" + }, + { + "key": "entity.minecraft.husk", + "english_translation": "Husk" + }, + { + "key": "commands.worldborder.center.success", + "english_translation": "Set the center of the world border to %s, %s" + }, + { + "key": "block.minecraft.banner.half_vertical_right.yellow", + "english_translation": "Yellow Per Pale Inverted" + }, + { + "key": "block.minecraft.banner.mojang.light_blue", + "english_translation": "Light Blue Thing" + }, + { + "key": "title.multiplayer.disabled", + "english_translation": "Multiplayer is disabled. Please check your Microsoft account settings." + }, + { + "key": "biome.minecraft.windswept_gravelly_hills", + "english_translation": "Windswept Gravelly Hills" + }, + { + "key": "block.minecraft.green_shulker_box", + "english_translation": "Green Shulker Box" + }, + { + "key": "entity.minecraft.wither_skeleton", + "english_translation": "Wither Skeleton" + }, + { + "key": "selectWorld.seedInfo", + "english_translation": "Leave blank for a random seed" + }, + { + "key": "commands.bossbar.set.name.success", + "english_translation": "Custom bossbar %s has been renamed" + }, + { + "key": "argument.integer.big", + "english_translation": "Integer must not be more than %s, found %s" + }, + { + "key": "commands.reload.failure", + "english_translation": "Reload failed; keeping old data" + }, + { + "key": "item.minecraft.dark_oak_chest_boat", + "english_translation": "Dark Oak Boat with Chest" + }, + { + "key": "block.minecraft.petrified_oak_slab", + "english_translation": "Petrified Oak Slab" + }, + { + "key": "block.minecraft.banner.square_bottom_left.light_gray", + "english_translation": "Light Gray Base Dexter Canton" + }, + { + "key": "selectWorld.gameMode.adventure", + "english_translation": "Adventure" + }, + { + "key": "effect.minecraft.levitation", + "english_translation": "Levitation" + }, + { + "key": "advancements.adventure.arbalistic.description", + "english_translation": "Kill five unique mobs with one crossbow shot" + }, + { + "key": "subtitles.item.honeycomb.wax_on", + "english_translation": "Wax on" + }, + { + "key": "subtitles.entity.item.break", + "english_translation": "Item breaks" + }, + { + "key": "subtitles.entity.tadpole.grow_up", + "english_translation": "Tadpole grows up" + }, + { + "key": "item.minecraft.chest_minecart", + "english_translation": "Minecart with Chest" + }, + { + "key": "commands.defaultgamemode.success", + "english_translation": "The default game mode is now %s" + }, + { + "key": "block.minecraft.banner.half_vertical.pink", + "english_translation": "Pink Per Pale" + }, + { + "key": "argument.component.invalid", + "english_translation": "Invalid chat component: %s" + }, + { + "key": "block.minecraft.zombie_head", + "english_translation": "Zombie Head" + }, + { + "key": "commands.tag.remove.success.multiple", + "english_translation": "Removed tag '%s' from %s entities" + }, + { + "key": "block.minecraft.warped_roots", + "english_translation": "Warped Roots" + }, + { + "key": "telemetry.property.client_modded.title", + "english_translation": "Client Modded" + }, + { + "key": "commands.recipe.take.success.single", + "english_translation": "Took %s recipes from %s" + }, + { + "key": "biome.minecraft.ocean", + "english_translation": "Ocean" + }, + { + "key": "block.minecraft.piglin_head", + "english_translation": "Piglin Head" + }, + { + "key": "options.attack.hotbar", + "english_translation": "Hotbar" + }, + { + "key": "block.minecraft.banner.bricks.white", + "english_translation": "White Field Masoned" + }, + { + "key": "commands.message.display.outgoing", + "english_translation": "You whisper to %s: %s" + }, + { + "key": "effect.minecraft.weakness", + "english_translation": "Weakness" + }, + { + "key": "arguments.swizzle.invalid", + "english_translation": "Invalid swizzle, expected combination of 'x', 'y' and 'z'" + }, + { + "key": "menu.multiplayer", + "english_translation": "Multiplayer" + }, + { + "key": "mco.news", + "english_translation": "Realms news" + }, + { + "key": "subtitles.entity.arrow.hit", + "english_translation": "Arrow hits" + }, + { + "key": "item.minecraft.music_disc_relic.desc", + "english_translation": "Aaron Cherof - Relic" + }, + { + "key": "options.prioritizeChunkUpdates.nearby", + "english_translation": "Fully Blocking" + }, + { + "key": "advancements.adventure.fall_from_world_height.title", + "english_translation": "Caves & Cliffs" + }, + { + "key": "block.minecraft.banner.gradient.yellow", + "english_translation": "Yellow Gradient" + }, + { + "key": "enchantment.minecraft.soul_speed", + "english_translation": "Soul Speed" + }, + { + "key": "subtitles.entity.warden.dig", + "english_translation": "Warden digs" + }, + { + "key": "block.minecraft.sand", + "english_translation": "Sand" + }, + { + "key": "item.minecraft.zombified_piglin_spawn_egg", + "english_translation": "Zombified Piglin Spawn Egg" + }, + { + "key": "advancements.adventure.read_power_from_chiseled_bookshelf.description", + "english_translation": "Read the power signal of a Chiseled Bookshelf using a Comparator" + }, + { + "key": "selectWorld.versionUnknown", + "english_translation": "unknown" + }, + { + "key": "subtitles.block.sniffer_egg.hatch", + "english_translation": "Sniffer Egg hatches" + }, + { + "key": "biome.minecraft.bamboo_jungle", + "english_translation": "Bamboo Jungle" + }, + { + "key": "structure_block.integrity", + "english_translation": "Structure Integrity and Seed" + }, + { + "key": "block.minecraft.stripped_oak_log", + "english_translation": "Stripped Oak Log" + }, + { + "key": "selectWorld.import_worldgen_settings.select_file", + "english_translation": "Select settings file (.json)" + }, + { + "key": "debug.show_hitboxes.off", + "english_translation": "Hitboxes: hidden" + }, + { + "key": "block.minecraft.smooth_quartz_stairs", + "english_translation": "Smooth Quartz Stairs" + }, + { + "key": "block.minecraft.ender_chest", + "english_translation": "Ender Chest" + }, + { + "key": "commands.data.get.invalid", + "english_translation": "Can't get %s; only numeric tags are allowed" + }, + { + "key": "options.mouseWheelSensitivity", + "english_translation": "Scroll Sensitivity" + }, + { + "key": "argument.double.low", + "english_translation": "Double must not be less than %s, found %s" + }, + { + "key": "subtitles.block.end_portal_frame.fill", + "english_translation": "Eye of Ender attaches" + }, + { + "key": "subtitles.entity.puffer_fish.flop", + "english_translation": "Pufferfish flops" + }, + { + "key": "block.minecraft.bamboo_mosaic_slab", + "english_translation": "Bamboo Mosaic Slab" + }, + { + "key": "dataPack.update_1_20.description", + "english_translation": "New features and content for Minecraft 1.20" + }, + { + "key": "block.minecraft.azalea_leaves", + "english_translation": "Azalea Leaves" + }, + { + "key": "effect.duration.infinite", + "english_translation": "āˆž" + }, + { + "key": "structure_block.size_success", + "english_translation": "Size successfully detected for '%s'" + }, + { + "key": "item.minecraft.potion.effect.poison", + "english_translation": "Potion of Poison" + }, + { + "key": "block.minecraft.banner.bricks.blue", + "english_translation": "Blue Field Masoned" + }, + { + "key": "advancements.husbandry.safely_harvest_honey.title", + "english_translation": "Bee Our Guest" + }, + { + "key": "mco.configure.world.restore.download.question.line2", + "english_translation": "Do you want to continue?" + }, + { + "key": "mco.configure.world.restore.download.question.line1", + "english_translation": "The world will be downloaded and added to your single player worlds." + }, + { + "key": "options.multiplayer.title", + "english_translation": "Multiplayer Settings..." + }, + { + "key": "mco.create.world.wait", + "english_translation": "Creating the realm..." + }, + { + "key": "key.keyboard.right.alt", + "english_translation": "Right Alt" + }, + { + "key": "stat.minecraft.damage_absorbed", + "english_translation": "Damage Absorbed" + }, + { + "key": "translation.test.none", + "english_translation": "Hello, world!" + }, + { + "key": "gamerule.doMobSpawning", + "english_translation": "Spawn mobs" + }, + { + "key": "commands.op.failed", + "english_translation": "Nothing changed. The player already is an operator" + }, + { + "key": "selectWorld.gameMode.hardcore.line2", + "english_translation": "difficulty, and one life only" + }, + { + "key": "selectWorld.gameMode.hardcore.line1", + "english_translation": "Same as Survival Mode, locked at hardest" + }, + { + "key": "block.minecraft.acacia_slab", + "english_translation": "Acacia Slab" + }, + { + "key": "commands.attribute.modifier.remove.success", + "english_translation": "Removed modifier %s from attribute %s for entity %s" + }, + { + "key": "item.minecraft.tipped_arrow.effect.slowness", + "english_translation": "Arrow of Slowness" + }, + { + "key": "subtitles.entity.dolphin.jump", + "english_translation": "Dolphin jumps" + }, + { + "key": "item.minecraft.ender_pearl", + "english_translation": "Ender Pearl" + }, + { + "key": "subtitles.entity.piglin_brute.hurt", + "english_translation": "Piglin Brute hurts" + }, + { + "key": "painting.minecraft.match.title", + "english_translation": "Match" + }, + { + "key": "multiplayer.status.player_count.narration", + "english_translation": "%s out of %s players online" + }, + { + "key": "block.minecraft.banner.triangles_bottom.yellow", + "english_translation": "Yellow Base Indented" + }, + { + "key": "subtitles.item.bucket.fill_fish", + "english_translation": "Fish captured" + }, + { + "key": "item.minecraft.music_disc_otherside.desc", + "english_translation": "Lena Raine - otherside" + }, + { + "key": "block.minecraft.banner.base.light_blue", + "english_translation": "Fully Light Blue Field" + }, + { + "key": "mco.configure.world.buttons.delete", + "english_translation": "Delete" + }, + { + "key": "subtitles.entity.fox.sniff", + "english_translation": "Fox sniffs" + }, + { + "key": "item.minecraft.music_disc_5.desc", + "english_translation": "Samuel ƅberg - 5" + }, + { + "key": "selectWorld.incompatible_series", + "english_translation": "Created by an incompatible version" + }, + { + "key": "soundCategory.voice", + "english_translation": "Voice/Speech" + }, + { + "key": "attribute.name.generic.knockback_resistance", + "english_translation": "Knockback Resistance" + }, + { + "key": "subtitles.entity.rabbit.attack", + "english_translation": "Rabbit attacks" + }, + { + "key": "createWorld.customize.custom.lowerLimitScale", + "english_translation": "Lower Limit Scale" + }, + { + "key": "subtitles.entity.wolf.shake", + "english_translation": "Wolf shakes" + }, + { + "key": "advancements.story.root.description", + "english_translation": "The heart and story of the game" + }, + { + "key": "commands.stop.stopping", + "english_translation": "Stopping the server" + }, + { + "key": "biome.minecraft.old_growth_spruce_taiga", + "english_translation": "Old Growth Spruce Taiga" + }, + { + "key": "multiplayer.texturePrompt.failure.line1", + "english_translation": "Server resource pack couldn't be applied" + }, + { + "key": "multiplayer.texturePrompt.failure.line2", + "english_translation": "Any functionality that requires custom resources might not work as expected" + }, + { + "key": "advancements.adventure.trade_at_world_height.title", + "english_translation": "Star Trader" + }, + { + "key": "gui.abuseReport.reason.self_harm_or_suicide", + "english_translation": "Imminent harm - Self-harm or suicide" + }, + { + "key": "block.minecraft.light_gray_concrete_powder", + "english_translation": "Light Gray Concrete Powder" + }, + { + "key": "item.minecraft.splash_potion.effect.mundane", + "english_translation": "Mundane Splash Potion" + }, + { + "key": "block.minecraft.banner.gradient.pink", + "english_translation": "Pink Gradient" + }, + { + "key": "block.minecraft.activator_rail", + "english_translation": "Activator Rail" + }, + { + "key": "commands.list.players", + "english_translation": "There are %s of a max of %s players online: %s" + }, + { + "key": "createWorld.customize.custom.biomeDepthWeight", + "english_translation": "Biome Depth Weight" + }, + { + "key": "multiplayer.status.motd.narration", + "english_translation": "Message of the day: %s" + }, + { + "key": "block.minecraft.red_sandstone_wall", + "english_translation": "Red Sandstone Wall" + }, + { + "key": "item.minecraft.diamond_axe", + "english_translation": "Diamond Axe" + }, + { + "key": "argument.pos.unloaded", + "english_translation": "That position is not loaded" + }, + { + "key": "block.minecraft.mangrove_planks", + "english_translation": "Mangrove Planks" + }, + { + "key": "commands.scoreboard.players.list.success", + "english_translation": "There are %s tracked entity/entities: %s" + }, + { + "key": "book.byAuthor", + "english_translation": "by %1$s" + }, + { + "key": "options.percent_value", + "english_translation": "%s: %s%%" + }, + { + "key": "advancements.nether.all_potions.description", + "english_translation": "Have every potion effect applied at the same time" + }, + { + "key": "item.minecraft.diamond_helmet", + "english_translation": "Diamond Helmet" + }, + { + "key": "item.minecraft.fire_charge", + "english_translation": "Fire Charge" + }, + { + "key": "subtitles.entity.parrot.imitate.illusioner", + "english_translation": "Parrot murmurs" + }, + { + "key": "subtitles.item.book.put", + "english_translation": "Book thumps" + }, + { + "key": "subtitles.entity.zombified_piglin.angry", + "english_translation": "Zombified Piglin grunts angrily" + }, + { + "key": "block.minecraft.birch_leaves", + "english_translation": "Birch Leaves" + }, + { + "key": "block.minecraft.banner.square_bottom_right.pink", + "english_translation": "Pink Base Sinister Canton" + }, + { + "key": "item.minecraft.diamond_pickaxe", + "english_translation": "Diamond Pickaxe" + }, + { + "key": "block.minecraft.sea_pickle", + "english_translation": "Sea Pickle" + }, + { + "key": "entity.minecraft.sheep", + "english_translation": "Sheep" + }, + { + "key": "block.minecraft.dark_oak_door", + "english_translation": "Dark Oak Door" + }, + { + "key": "subtitles.entity.player.hurt_drown", + "english_translation": "Player drowning" + }, + { + "key": "block.minecraft.light_gray_carpet", + "english_translation": "Light Gray Carpet" + }, + { + "key": "selectWorld.delete", + "english_translation": "Delete" + }, + { + "key": "subtitles.entity.item.pickup", + "english_translation": "Item plops" + }, + { + "key": "mco.terms.buttons.disagree", + "english_translation": "Don't agree" + }, + { + "key": "biome.minecraft.snowy_plains", + "english_translation": "Snowy Plains" + }, + { + "key": "resourcepack.progress", + "english_translation": "Downloading file (%s MB)..." + }, + { + "key": "block.minecraft.light_blue_wool", + "english_translation": "Light Blue Wool" + }, + { + "key": "item.minecraft.netherite_hoe", + "english_translation": "Netherite Hoe" + }, + { + "key": "subtitles.entity.player.hurt_on_fire", + "english_translation": "Player burns" + }, + { + "key": "options.modelPart.cape", + "english_translation": "Cape" + }, + { + "key": "commands.whitelist.disabled", + "english_translation": "Whitelist is now turned off" + }, + { + "key": "options.generic_value", + "english_translation": "%s: %s" + }, + { + "key": "subtitles.entity.panda.bite", + "english_translation": "Panda bites" + }, + { + "key": "block.minecraft.banner.square_bottom_right.yellow", + "english_translation": "Yellow Base Sinister Canton" + }, + { + "key": "subtitles.block.portal.ambient", + "english_translation": "Portal whooshes" + }, + { + "key": "subtitles.entity.parrot.death", + "english_translation": "Parrot dies" + }, + { + "key": "block.minecraft.trapped_chest", + "english_translation": "Trapped Chest" + }, + { + "key": "block.minecraft.banner.triangles_top.gray", + "english_translation": "Gray Chief Indented" + }, + { + "key": "subtitles.entity.illusioner.ambient", + "english_translation": "Illusioner murmurs" + }, + { + "key": "commands.whitelist.reloaded", + "english_translation": "Reloaded the whitelist" + }, + { + "key": "block.minecraft.mud_bricks", + "english_translation": "Mud Bricks" + }, + { + "key": "commands.data.merge.failed", + "english_translation": "Nothing changed. The specified properties already have these values" + }, + { + "key": "subtitles.entity.axolotl.attack", + "english_translation": "Axolotl attacks" + }, + { + "key": "block.minecraft.potted_warped_fungus", + "english_translation": "Potted Warped Fungus" + }, + { + "key": "biome.minecraft.river", + "english_translation": "River" + }, + { + "key": "createWorld.customize.custom.stretchY", + "english_translation": "Height Stretch" + }, + { + "key": "subtitles.block.conduit.ambient", + "english_translation": "Conduit pulses" + }, + { + "key": "subtitles.item.axe.strip", + "english_translation": "Axe strips" + }, + { + "key": "subtitles.block.beehive.drip", + "english_translation": "Honey drips" + }, + { + "key": "subtitles.entity.bat.ambient", + "english_translation": "Bat screeches" + }, + { + "key": "commands.tag.add.success.multiple", + "english_translation": "Added tag '%s' to %s entities" + }, + { + "key": "entity.minecraft.spectral_arrow", + "english_translation": "Spectral Arrow" + }, + { + "key": "selectWorld.deleteQuestion", + "english_translation": "Are you sure you want to delete this world?" + }, + { + "key": "block.minecraft.cherry_pressure_plate", + "english_translation": "Cherry Pressure Plate" + }, + { + "key": "selectWorld.edit.export_worldgen_settings.failure", + "english_translation": "Export failed" + }, + { + "key": "createWorld.customize.custom.depthNoiseScaleZ", + "english_translation": "Depth Noise Scale Z" + }, + { + "key": "item.minecraft.netherite_pickaxe", + "english_translation": "Netherite Pickaxe" + }, + { + "key": "block.minecraft.mangrove_wood", + "english_translation": "Mangrove Wood" + }, + { + "key": "item.minecraft.husk_spawn_egg", + "english_translation": "Husk Spawn Egg" + }, + { + "key": "commands.recipe.give.success.single", + "english_translation": "Unlocked %s recipes for %s" + }, + { + "key": "subtitles.block.generic.footsteps", + "english_translation": "Footsteps" + }, + { + "key": "block.minecraft.mangrove_wall_hanging_sign", + "english_translation": "Mangrove Wall Hanging Sign" + }, + { + "key": "commands.attribute.modifier.add.success", + "english_translation": "Added modifier %s to attribute %s for entity %s" + }, + { + "key": "block.minecraft.orange_tulip", + "english_translation": "Orange Tulip" + }, + { + "key": "item.minecraft.disc_fragment_5", + "english_translation": "Disc Fragment" + }, + { + "key": "commands.title.show.actionbar.multiple", + "english_translation": "Showing new actionbar title for %s players" + }, + { + "key": "block.minecraft.banner.stripe_bottom.red", + "english_translation": "Red Base" + }, + { + "key": "block.minecraft.netherite_block", + "english_translation": "Block of Netherite" + }, + { + "key": "commands.debug.started", + "english_translation": "Started tick profiling" + }, + { + "key": "block.minecraft.infested_cracked_stone_bricks", + "english_translation": "Infested Cracked Stone Bricks" + }, + { + "key": "filled_map.unknown", + "english_translation": "Unknown Map" + }, + { + "key": "item.minecraft.tipped_arrow.effect.thick", + "english_translation": "Tipped Arrow" + }, + { + "key": "subtitles.entity.guardian.ambient", + "english_translation": "Guardian moans" + }, + { + "key": "commands.team.list.teams.empty", + "english_translation": "There are no teams" + }, + { + "key": "item.minecraft.goat_spawn_egg", + "english_translation": "Goat Spawn Egg" + }, + { + "key": "block.minecraft.oak_hanging_sign", + "english_translation": "Oak Hanging Sign" + }, + { + "key": "block.minecraft.banner.piglin.light_gray", + "english_translation": "Light Gray Snout" + }, + { + "key": "subtitles.block.dispenser.dispense", + "english_translation": "Dispensed item" + }, + { + "key": "subtitles.block.sculk_sensor.clicking_stop", + "english_translation": "Sculk Sensor stops clicking" + }, + { + "key": "block.minecraft.banner.gradient_up.brown", + "english_translation": "Brown Base Gradient" + }, + { + "key": "stat.itemsButton", + "english_translation": "Items" + }, + { + "key": "block.minecraft.banner.stripe_downleft.brown", + "english_translation": "Brown Bend Sinister" + }, + { + "key": "subtitles.entity.panda.ambient", + "english_translation": "Panda pants" + }, + { + "key": "item.minecraft.lingering_potion.effect.fire_resistance", + "english_translation": "Lingering Potion of Fire Resistance" + }, + { + "key": "telemetry.property.render_distance.title", + "english_translation": "Render Distance" + }, + { + "key": "block.minecraft.repeater", + "english_translation": "Redstone Repeater" + }, + { + "key": "block.minecraft.tuff", + "english_translation": "Tuff" + }, + { + "key": "options.graphics.warning.accept", + "english_translation": "Continue Without Support" + }, + { + "key": "createWorld.customize.custom.depthNoiseScaleX", + "english_translation": "Depth Noise Scale X" + }, + { + "key": "subtitles.block.chorus_flower.grow", + "english_translation": "Chorus Flower grows" + }, + { + "key": "advancements.adventure.salvage_sherd.title", + "english_translation": "Respecting the Remnants" + }, + { + "key": "debug.chunk_boundaries.help", + "english_translation": "F3 + G = Show chunk boundaries" + }, + { + "key": "container.dispenser", + "english_translation": "Dispenser" + }, + { + "key": "painting.minecraft.creebet.title", + "english_translation": "Creebet" + }, + { + "key": "block.minecraft.potted_flowering_azalea_bush", + "english_translation": "Potted Flowering Azalea" + }, + { + "key": "subtitles.entity.turtle.ambient_land", + "english_translation": "Turtle chirps" + }, + { + "key": "container.chestDouble", + "english_translation": "Large Chest" + }, + { + "key": "flat_world_preset.minecraft.classic_flat", + "english_translation": "Classic Flat" + }, + { + "key": "advancements.husbandry.wax_on.title", + "english_translation": "Wax On" + }, + { + "key": "painting.minecraft.aztec2.title", + "english_translation": "de_aztec" + }, + { + "key": "gui.abuseReport.send.generic_error", + "english_translation": "Encountered an unexpected error while sending your report." + }, + { + "key": "item.minecraft.splash_potion.effect.weakness", + "english_translation": "Splash Potion of Weakness" + }, + { + "key": "multiplayer.disconnect.illegal_characters", + "english_translation": "Illegal characters in chat" + }, + { + "key": "subtitles.entity.bee.hurt", + "english_translation": "Bee hurts" + }, + { + "key": "subtitles.entity.warden.step", + "english_translation": "Warden steps" + }, + { + "key": "item.minecraft.ghast_tear", + "english_translation": "Ghast Tear" + }, + { + "key": "commands.worldborder.set.failed.big", + "english_translation": "World border cannot be bigger than %s blocks wide" + }, + { + "key": "block.minecraft.red_sandstone_stairs", + "english_translation": "Red Sandstone Stairs" + }, + { + "key": "commands.debug.notRunning", + "english_translation": "The tick profiler hasn't started" + }, + { + "key": "block.minecraft.banner.bricks.light_blue", + "english_translation": "Light Blue Field Masoned" + }, + { + "key": "block.minecraft.cobbled_deepslate", + "english_translation": "Cobbled Deepslate" + }, + { + "key": "argument.id.unknown", + "english_translation": "Unknown ID: %s" + }, + { + "key": "selectWorld.moreWorldOptions", + "english_translation": "More World Options..." + }, + { + "key": "painting.minecraft.stage.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "subtitles.entity.allay.item_given", + "english_translation": "Allay chortles" + }, + { + "key": "subtitles.entity.stray.hurt", + "english_translation": "Stray hurts" + }, + { + "key": "advancements.story.enter_the_end.title", + "english_translation": "The End?" + }, + { + "key": "block.minecraft.lime_banner", + "english_translation": "Lime Banner" + }, + { + "key": "selectWorld.edit.backupFailed", + "english_translation": "Backup failed" + }, + { + "key": "container.smoker", + "english_translation": "Smoker" + }, + { + "key": "block.minecraft.banner.half_vertical.light_blue", + "english_translation": "Light Blue Per Pale" + }, + { + "key": "block.minecraft.brown_carpet", + "english_translation": "Brown Carpet" + }, + { + "key": "quickplay.error.realm_connect", + "english_translation": "Could not connect to Realm" + }, + { + "key": "advancements.story.enter_the_nether.title", + "english_translation": "We Need to Go Deeper" + }, + { + "key": "block.minecraft.dark_oak_wall_hanging_sign", + "english_translation": "Dark Oak Wall Hanging Sign" + }, + { + "key": "selectWorld.bonusItems", + "english_translation": "Bonus Chest" + }, + { + "key": "block.minecraft.brain_coral_wall_fan", + "english_translation": "Brain Coral Wall Fan" + }, + { + "key": "mco.minigame.world.stopButton", + "english_translation": "End minigame" + }, + { + "key": "selectWorld.edit.openFolder", + "english_translation": "Open World Folder" + }, + { + "key": "block.minecraft.cake", + "english_translation": "Cake" + }, + { + "key": "entity.minecraft.frog", + "english_translation": "Frog" + }, + { + "key": "commands.worldborder.warning.distance.failed", + "english_translation": "Nothing changed. The world border warning is already that distance" + }, + { + "key": "mco.selectServer.popup", + "english_translation": "Realms is a safe, simple way to enjoy an online Minecraft world with up to ten friends at a time. It supports loads of minigames and plenty of custom worlds! Only the owner of the realm needs to pay." + }, + { + "key": "block.minecraft.end_stone_bricks", + "english_translation": "End Stone Bricks" + }, + { + "key": "mco.create.world.reset.title", + "english_translation": "Creating world..." + }, + { + "key": "fabric-registry-sync-v0.unknown-remote.subtitle.2", + "english_translation": " See the client logs for more details.\nThe following registry entry namespaces may be related:\n\n" + }, + { + "key": "fabric-registry-sync-v0.unknown-remote.subtitle.1", + "english_translation": "This is usually caused by a mismatched mod set between the client and server." + }, + { + "key": "stat_type.minecraft.killed", + "english_translation": "You killed %s %s" + }, + { + "key": "block.minecraft.banner.diagonal_right.gray", + "english_translation": "Gray Per Bend" + }, + { + "key": "item.minecraft.splash_potion", + "english_translation": "Splash Potion" + }, + { + "key": "block.minecraft.jungle_log", + "english_translation": "Jungle Log" + }, + { + "key": "argument.float.big", + "english_translation": "Float must not be more than %s, found %s" + }, + { + "key": "arguments.nbtpath.too_large", + "english_translation": "Resulting NBT too large" + }, + { + "key": "item.minecraft.mangrove_chest_boat", + "english_translation": "Mangrove Boat with Chest" + }, + { + "key": "block.minecraft.gray_glazed_terracotta", + "english_translation": "Gray Glazed Terracotta" + }, + { + "key": "gui.all", + "english_translation": "All" + }, + { + "key": "death.attack.stalagmite", + "english_translation": "%1$s was impaled on a stalagmite" + }, + { + "key": "subtitles.entity.witch.celebrate", + "english_translation": "Witch cheers" + }, + { + "key": "block.minecraft.chiseled_polished_blackstone", + "english_translation": "Chiseled Polished Blackstone" + }, + { + "key": "container.dropper", + "english_translation": "Dropper" + }, + { + "key": "commands.particle.success", + "english_translation": "Displaying particle %s" + }, + { + "key": "advancements.story.deflect_arrow.title", + "english_translation": "Not Today, Thank You" + }, + { + "key": "flat_world_preset.unknown", + "english_translation": "???" + }, + { + "key": "block.minecraft.black_terracotta", + "english_translation": "Black Terracotta" + }, + { + "key": "instrument.minecraft.admire_goat_horn", + "english_translation": "Admire" + }, + { + "key": "block.minecraft.lily_pad", + "english_translation": "Lily Pad" + }, + { + "key": "commands.data.block.invalid", + "english_translation": "The target block is not a block entity" + }, + { + "key": "trim_pattern.minecraft.rib", + "english_translation": "Rib Armor Trim" + }, + { + "key": "subtitles.entity.chicken.ambient", + "english_translation": "Chicken clucks" + }, + { + "key": "commands.forceload.added.none", + "english_translation": "No force loaded chunks were found in %s" + }, + { + "key": "item.minecraft.smithing_template.armor_trim.applies_to", + "english_translation": "Armor" + }, + { + "key": "advancements.husbandry.balanced_diet.description", + "english_translation": "Eat everything that is edible, even if it's not good for you" + }, + { + "key": "subtitles.block.bubble_column.bubble_pop", + "english_translation": "Bubbles pop" + }, + { + "key": "key.saveToolbarActivator", + "english_translation": "Save Hotbar Activator" + }, + { + "key": "item.minecraft.netherite_boots", + "english_translation": "Netherite Boots" + }, + { + "key": "argument.entity.options.nbt.description", + "english_translation": "Entities with NBT" + }, + { + "key": "block.minecraft.banner.square_bottom_left.pink", + "english_translation": "Pink Base Dexter Canton" + }, + { + "key": "block.minecraft.warped_trapdoor", + "english_translation": "Warped Trapdoor" + }, + { + "key": "advMode.triggering", + "english_translation": "Triggering" + }, + { + "key": "key.keyboard.right.shift", + "english_translation": "Right Shift" + }, + { + "key": "subtitles.entity.villager.work_fletcher", + "english_translation": "Fletcher works" + }, + { + "key": "enchantment.minecraft.vanishing_curse", + "english_translation": "Curse of Vanishing" + }, + { + "key": "options.mainHand", + "english_translation": "Main Hand" + }, + { + "key": "item.minecraft.pumpkin_seeds", + "english_translation": "Pumpkin Seeds" + }, + { + "key": "block.minecraft.nether_brick_wall", + "english_translation": "Nether Brick Wall" + }, + { + "key": "item.minecraft.plenty_pottery_sherd", + "english_translation": "Plenty Pottery Sherd" + }, + { + "key": "item.minecraft.firework_star.trail", + "english_translation": "Trail" + }, + { + "key": "block.minecraft.banner.creeper.magenta", + "english_translation": "Magenta Creeper Charge" + }, + { + "key": "advMode.allEntities", + "english_translation": "Use \"@e\" to target all entities" + }, + { + "key": "subtitles.entity.zombified_piglin.ambient", + "english_translation": "Zombified Piglin grunts" + }, + { + "key": "item.minecraft.armor_stand", + "english_translation": "Armor Stand" + }, + { + "key": "death.attack.fall", + "english_translation": "%1$s hit the ground too hard" + }, + { + "key": "disconnect.spam", + "english_translation": "Kicked for spamming" + }, + { + "key": "key.keyboard.insert", + "english_translation": "Insert" + }, + { + "key": "block.minecraft.banner.creeper.green", + "english_translation": "Green Creeper Charge" + }, + { + "key": "block.minecraft.dragon_wall_head", + "english_translation": "Dragon Wall Head" + }, + { + "key": "advancements.husbandry.breed_an_animal.title", + "english_translation": "The Parrots and the Bats" + }, + { + "key": "block.minecraft.cyan_glazed_terracotta", + "english_translation": "Cyan Glazed Terracotta" + }, + { + "key": "block.minecraft.potted_spruce_sapling", + "english_translation": "Potted Spruce Sapling" + }, + { + "key": "item.minecraft.cave_spider_spawn_egg", + "english_translation": "Cave Spider Spawn Egg" + }, + { + "key": "subtitles.entity.parrot.imitate.hoglin", + "english_translation": "Parrot growls" + }, + { + "key": "block.minecraft.banner.gradient.magenta", + "english_translation": "Magenta Gradient" + }, + { + "key": "block.minecraft.deepslate_tile_wall", + "english_translation": "Deepslate Tile Wall" + }, + { + "key": "multiplayer.status.request_handled", + "english_translation": "Status request has been handled" + }, + { + "key": "item.minecraft.splash_potion.effect.swiftness", + "english_translation": "Splash Potion of Swiftness" + }, + { + "key": "subtitles.entity.pig.saddle", + "english_translation": "Saddle equips" + }, + { + "key": "block.minecraft.banner.circle.magenta", + "english_translation": "Magenta Roundel" + }, + { + "key": "item.minecraft.trader_llama_spawn_egg", + "english_translation": "Trader Llama Spawn Egg" + }, + { + "key": "gui.abuseReport.error.title", + "english_translation": "Problem sending your report" + }, + { + "key": "commands.worldborder.warning.distance.success", + "english_translation": "Set the world border warning distance to %s block(s)" + }, + { + "key": "block.minecraft.banner.stripe_bottom.yellow", + "english_translation": "Yellow Base" + }, + { + "key": "block.minecraft.cut_sandstone_slab", + "english_translation": "Cut Sandstone Slab" + }, + { + "key": "options.accessibility.high_contrast.tooltip", + "english_translation": "Enhances the contrast of UI elements" + }, + { + "key": "block.minecraft.potted_cherry_sapling", + "english_translation": "Potted Cherry Sapling" + }, + { + "key": "block.minecraft.dark_oak_sapling", + "english_translation": "Dark Oak Sapling" + }, + { + "key": "block.minecraft.banner.cross.cyan", + "english_translation": "Cyan Saltire" + }, + { + "key": "selectServer.delete", + "english_translation": "Delete" + }, + { + "key": "commands.spreadplayers.success.entities", + "english_translation": "Spread %s player(s) around %s, %s with an average distance of %s blocks apart" + }, + { + "key": "biome.minecraft.deep_lukewarm_ocean", + "english_translation": "Deep Lukewarm Ocean" + }, + { + "key": "createWorld.customize.custom.preset.goodLuck", + "english_translation": "Good Luck" + }, + { + "key": "mco.download.downloading", + "english_translation": "Downloading" + }, + { + "key": "commands.execute.conditional.pass_count", + "english_translation": "Test passed, count: %s" + }, + { + "key": "block.minecraft.potted_poppy", + "english_translation": "Potted Poppy" + }, + { + "key": "advancements.nether.find_fortress.description", + "english_translation": "Break your way into a Nether Fortress" + }, + { + "key": "mco.selectServer.expires.day", + "english_translation": "Expires in a day" + }, + { + "key": "subtitles.entity.mooshroom.convert", + "english_translation": "Mooshroom transforms" + }, + { + "key": "subtitles.entity.sheep.hurt", + "english_translation": "Sheep hurts" + }, + { + "key": "subtitles.item.bottle.fill", + "english_translation": "Bottle fills" + }, + { + "key": "block.minecraft.dead_tube_coral_block", + "english_translation": "Dead Tube Coral Block" + }, + { + "key": "block.minecraft.banner.stripe_downright.magenta", + "english_translation": "Magenta Bend" + }, + { + "key": "block.minecraft.spruce_sapling", + "english_translation": "Spruce Sapling" + }, + { + "key": "block.minecraft.sticky_piston", + "english_translation": "Sticky Piston" + }, + { + "key": "item.minecraft.birch_boat", + "english_translation": "Birch Boat" + }, + { + "key": "subtitles.block.amethyst_block.resonate", + "english_translation": "Amethyst resonates" + }, + { + "key": "block.minecraft.banner.skull.pink", + "english_translation": "Pink Skull Charge" + }, + { + "key": "item.minecraft.wooden_sword", + "english_translation": "Wooden Sword" + }, + { + "key": "jigsaw_block.generate", + "english_translation": "Generate" + }, + { + "key": "commands.banlist.entry", + "english_translation": "%s was banned by %s: %s" + }, + { + "key": "gui.socialInteractions.search_empty", + "english_translation": "Couldn't find any players with that name" + }, + { + "key": "subtitles.entity.llama.chest", + "english_translation": "Llama Chest equips" + }, + { + "key": "mco.errorMessage.realmsService", + "english_translation": "An error occurred (%s):" + }, + { + "key": "painting.minecraft.pigscene.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "block.minecraft.magenta_concrete_powder", + "english_translation": "Magenta Concrete Powder" + }, + { + "key": "screenshot.success", + "english_translation": "Saved screenshot as %s" + }, + { + "key": "commands.effect.give.success.multiple", + "english_translation": "Applied effect %s to %s targets" + }, + { + "key": "advMode.mode.redstone", + "english_translation": "Impulse" + }, + { + "key": "block.minecraft.black_concrete", + "english_translation": "Black Concrete" + }, + { + "key": "block.minecraft.banner.globe.yellow", + "english_translation": "Yellow Globe" + }, + { + "key": "selectServer.title", + "english_translation": "Select Server" + }, + { + "key": "block.minecraft.prismarine_wall", + "english_translation": "Prismarine Wall" + }, + { + "key": "subtitles.entity.evoker.prepare_attack", + "english_translation": "Evoker prepares attack" + }, + { + "key": "block.minecraft.banner.diagonal_left.gray", + "english_translation": "Gray Per Bend Sinister" + }, + { + "key": "block.minecraft.banner.gradient_up.black", + "english_translation": "Black Base Gradient" + }, + { + "key": "block.minecraft.spruce_button", + "english_translation": "Spruce Button" + }, + { + "key": "commands.bossbar.set.players.success.none", + "english_translation": "Custom bossbar %s no longer has any players" + }, + { + "key": "options.fullscreen.unavailable", + "english_translation": "Setting unavailable" + }, + { + "key": "argument.scoreboardDisplaySlot.invalid", + "english_translation": "Unknown display slot '%s'" + }, + { + "key": "item.unbreakable", + "english_translation": "Unbreakable" + }, + { + "key": "telemetry.property.new_world.title", + "english_translation": "New World" + }, + { + "key": "block.minecraft.tinted_glass", + "english_translation": "Tinted Glass" + }, + { + "key": "block.minecraft.banner.triangle_bottom.pink", + "english_translation": "Pink Chevron" + }, + { + "key": "commands.team.join.success.multiple", + "english_translation": "Added %s members to team %s" + }, + { + "key": "death.attack.sonic_boom", + "english_translation": "%1$s was obliterated by a sonically-charged shriek" + }, + { + "key": "multiplayer.disconnect.invalid_entity_attacked", + "english_translation": "Attempting to attack an invalid entity" + }, + { + "key": "spectatorMenu.next_page", + "english_translation": "Next Page" + }, + { + "key": "block.minecraft.banner.skull.black", + "english_translation": "Black Skull Charge" + }, + { + "key": "block.minecraft.blue_ice", + "english_translation": "Blue Ice" + }, + { + "key": "demo.help.jump", + "english_translation": "Jump by pressing the %1$s key" + }, + { + "key": "subtitles.entity.ender_eye.death", + "english_translation": "Eye of Ender falls" + }, + { + "key": "lanServer.scanning", + "english_translation": "Scanning for games on your local network" + }, + { + "key": "parsing.double.expected", + "english_translation": "Expected double" + }, + { + "key": "commands.gamemode.success.self", + "english_translation": "Set own game mode to %s" + }, + { + "key": "mco.configure.world.slot.tooltip.minigame", + "english_translation": "Switch to minigame" + }, + { + "key": "menu.sendFeedback", + "english_translation": "Give Feedback" + }, + { + "key": "entity.minecraft.parrot", + "english_translation": "Parrot" + }, + { + "key": "gui.abuseReport.reason.non_consensual_intimate_imagery.description", + "english_translation": "Someone is talking about, sharing, or otherwise promoting private and intimate images." + }, + { + "key": "argument.entity.options.sort.irreversible", + "english_translation": "Invalid or unknown sort type '%s'" + }, + { + "key": "block.minecraft.acacia_log", + "english_translation": "Acacia Log" + }, + { + "key": "subtitles.entity.slime.squish", + "english_translation": "Slime squishes" + }, + { + "key": "subtitles.entity.donkey.death", + "english_translation": "Donkey dies" + }, + { + "key": "block.minecraft.orange_glazed_terracotta", + "english_translation": "Orange Glazed Terracotta" + }, + { + "key": "item.minecraft.shield.lime", + "english_translation": "Lime Shield" + }, + { + "key": "parsing.quote.expected.start", + "english_translation": "Expected quote to start a string" + }, + { + "key": "entity.minecraft.phantom", + "english_translation": "Phantom" + }, + { + "key": "item.minecraft.egg", + "english_translation": "Egg" + }, + { + "key": "commands.worldborder.set.failed.far", + "english_translation": "World border cannot be further out than %s blocks" + }, + { + "key": "item.minecraft.music_disc_blocks.desc", + "english_translation": "C418 - blocks" + }, + { + "key": "entity.minecraft.dolphin", + "english_translation": "Dolphin" + }, + { + "key": "biome.minecraft.plains", + "english_translation": "Plains" + }, + { + "key": "item.minecraft.honey_bottle", + "english_translation": "Honey Bottle" + }, + { + "key": "gui.entity_tooltip.type", + "english_translation": "Type: %s" + }, + { + "key": "block.minecraft.banner.creeper.black", + "english_translation": "Black Creeper Charge" + }, + { + "key": "commands.advancement.grant.criterion.to.one.failure", + "english_translation": "Couldn't grant criterion '%s' of advancement %s to %s as they already have it" + }, + { + "key": "block.minecraft.banner.bricks.lime", + "english_translation": "Lime Field Masoned" + }, + { + "key": "subtitles.entity.wandering_trader.drink_potion", + "english_translation": "Wandering Trader drinks potion" + }, + { + "key": "commands.scoreboard.objectives.list.empty", + "english_translation": "There are no objectives" + }, + { + "key": "item.minecraft.glow_berries", + "english_translation": "Glow Berries" + }, + { + "key": "block.minecraft.bed.occupied", + "english_translation": "This bed is occupied" + }, + { + "key": "structure_block.hover.load", + "english_translation": "Load: %s" + }, + { + "key": "item.minecraft.dragon_breath", + "english_translation": "Dragon's Breath" + }, + { + "key": "subtitles.block.bubble_column.whirlpool_inside", + "english_translation": "Bubbles zoom" + }, + { + "key": "chat.filtered", + "english_translation": "Filtered by the server." + }, + { + "key": "block.minecraft.banner.stripe_left.gray", + "english_translation": "Gray Pale Dexter" + }, + { + "key": "subtitles.entity.parrot.imitate.drowned", + "english_translation": "Parrot gurgles" + }, + { + "key": "block.minecraft.banner.rhombus.cyan", + "english_translation": "Cyan Lozenge" + }, + { + "key": "color.minecraft.lime", + "english_translation": "Lime" + }, + { + "key": "gamerule.category.updates", + "english_translation": "World Updates" + }, + { + "key": "block.minecraft.yellow_stained_glass_pane", + "english_translation": "Yellow Stained Glass Pane" + }, + { + "key": "block.minecraft.banner.stripe_downleft.light_gray", + "english_translation": "Light Gray Bend Sinister" + }, + { + "key": "commands.locate.biome.not_found", + "english_translation": "Could not find a biome of type \"%s\" within reasonable distance" + }, + { + "key": "attribute.modifier.equals.2", + "english_translation": "%s%% %s" + }, + { + "key": "attribute.modifier.equals.1", + "english_translation": "%s%% %s" + }, + { + "key": "attribute.modifier.equals.0", + "english_translation": "%s %s" + }, + { + "key": "block.minecraft.polished_blackstone_bricks", + "english_translation": "Polished Blackstone Bricks" + }, + { + "key": "options.accessibility.high_contrast.error.tooltip", + "english_translation": "High Contrast resource pack is not available" + }, + { + "key": "attribute.name.zombie.spawn_reinforcements", + "english_translation": "Zombie Reinforcements" + }, + { + "key": "subtitles.entity.panda.sneeze", + "english_translation": "Panda sneezes" + }, + { + "key": "block.minecraft.banner.gradient_up.green", + "english_translation": "Green Base Gradient" + }, + { + "key": "block.minecraft.banner.globe.lime", + "english_translation": "Lime Globe" + }, + { + "key": "telemetry.property.world_session_id.title", + "english_translation": "World Session ID" + }, + { + "key": "block.minecraft.warped_hanging_sign", + "english_translation": "Warped Hanging Sign" + }, + { + "key": "subtitles.entity.villager.work_fisherman", + "english_translation": "Fisherman works" + }, + { + "key": "enchantment.minecraft.fire_protection", + "english_translation": "Fire Protection" + }, + { + "key": "chat.type.advancement.goal", + "english_translation": "%s has reached the goal %s" + }, + { + "key": "block.minecraft.cherry_planks", + "english_translation": "Cherry Planks" + }, + { + "key": "argument.range.empty", + "english_translation": "Expected value or range of values" + }, + { + "key": "multiplayer.disconnect.server_shutdown", + "english_translation": "Server closed" + }, + { + "key": "multiplayer.disconnect.banned_ip.reason", + "english_translation": "Your IP address is banned from this server.\nReason: %s" + }, + { + "key": "key.use", + "english_translation": "Use Item/Place Block" + }, + { + "key": "resourcepack.downloading", + "english_translation": "Downloading Resource Pack" + }, + { + "key": "generator.single_biome_floating_islands", + "english_translation": "Floating Islands" + }, + { + "key": "commands.enchant.failed.itemless", + "english_translation": "%s is not holding any item" + }, + { + "key": "createWorld.customize.presets.share", + "english_translation": "Want to share your preset with someone? Use the box below!" + }, + { + "key": "sleep.not_possible", + "english_translation": "No amount of rest can pass this night" + }, + { + "key": "block.minecraft.brown_candle", + "english_translation": "Brown Candle" + }, + { + "key": "structure_block.show_boundingbox", + "english_translation": "Show Bounding Box:" + }, + { + "key": "gui.chatReport.discard.title", + "english_translation": "Discard report and comments?" + }, + { + "key": "stat.minecraft.clean_banner", + "english_translation": "Banners Cleaned" + }, + { + "key": "block.minecraft.banner.straight_cross.black", + "english_translation": "Black Cross" + }, + { + "key": "item.minecraft.firework_star.purple", + "english_translation": "Purple" + }, + { + "key": "item.minecraft.shield.yellow", + "english_translation": "Yellow Shield" + }, + { + "key": "key.keyboard.backspace", + "english_translation": "Backspace" + }, + { + "key": "block.minecraft.banner.stripe_middle.red", + "english_translation": "Red Fess" + }, + { + "key": "block.minecraft.stripped_birch_wood", + "english_translation": "Stripped Birch Wood" + }, + { + "key": "item.minecraft.firework_star.flicker", + "english_translation": "Twinkle" + }, + { + "key": "item.minecraft.creeper_banner_pattern.desc", + "english_translation": "Creeper Charge" + }, + { + "key": "gameMode.spectator", + "english_translation": "Spectator Mode" + }, + { + "key": "subtitles.entity.shulker.shoot", + "english_translation": "Shulker shoots" + }, + { + "key": "menu.modded", + "english_translation": " (Modded)" + }, + { + "key": "block.minecraft.banner.curly_border.cyan", + "english_translation": "Cyan Bordure Indented" + }, + { + "key": "subtitles.item.shears.shear", + "english_translation": "Shears click" + }, + { + "key": "stat.generalButton", + "english_translation": "General" + }, + { + "key": "block.minecraft.banner.square_top_right.light_blue", + "english_translation": "Light Blue Chief Sinister Canton" + }, + { + "key": "structure_block.hover.save", + "english_translation": "Save: %s" + }, + { + "key": "argument.angle.invalid", + "english_translation": "Invalid angle" + }, + { + "key": "item.minecraft.echo_shard", + "english_translation": "Echo Shard" + }, + { + "key": "block.minecraft.stonecutter", + "english_translation": "Stonecutter" + }, + { + "key": "painting.minecraft.earth.title", + "english_translation": "Earth" + }, + { + "key": "block.minecraft.jukebox", + "english_translation": "Jukebox" + }, + { + "key": "block.minecraft.potted_mangrove_propagule", + "english_translation": "Potted Mangrove Propagule" + }, + { + "key": "entity.minecraft.command_block_minecart", + "english_translation": "Minecart with Command Block" + }, + { + "key": "effect.minecraft.nausea", + "english_translation": "Nausea" + }, + { + "key": "block.minecraft.gold_block", + "english_translation": "Block of Gold" + }, + { + "key": "block.minecraft.lime_concrete_powder", + "english_translation": "Lime Concrete Powder" + }, + { + "key": "telemetry.property.platform.title", + "english_translation": "Platform" + }, + { + "key": "advancements.adventure.lightning_rod_with_villager_no_fire.title", + "english_translation": "Surge Protector" + }, + { + "key": "block.minecraft.banner.square_top_left.magenta", + "english_translation": "Magenta Chief Dexter Canton" + }, + { + "key": "subtitles.entity.zoglin.attack", + "english_translation": "Zoglin attacks" + }, + { + "key": "enchantment.minecraft.looting", + "english_translation": "Looting" + }, + { + "key": "key.chat", + "english_translation": "Open Chat" + }, + { + "key": "block.minecraft.ancient_debris", + "english_translation": "Ancient Debris" + }, + { + "key": "block.minecraft.banner.stripe_right.black", + "english_translation": "Black Pale Sinister" + }, + { + "key": "disconnect.kicked", + "english_translation": "Was kicked from the game" + }, + { + "key": "block.minecraft.banner.skull.green", + "english_translation": "Green Skull Charge" + }, + { + "key": "block.minecraft.banner.square_top_right.magenta", + "english_translation": "Magenta Chief Sinister Canton" + }, + { + "key": "advancements.nether.ride_strider_in_overworld_lava.description", + "english_translation": "Take a Strider for a loooong ride on a lava lake in the Overworld" + }, + { + "key": "gui.none", + "english_translation": "None" + }, + { + "key": "commands.schedule.cleared.failure", + "english_translation": "No schedules with id %s" + }, + { + "key": "block.minecraft.banner.diagonal_up_right.cyan", + "english_translation": "Cyan Per Bend Sinister Inverted" + }, + { + "key": "color.minecraft.blue", + "english_translation": "Blue" + }, + { + "key": "block.minecraft.banner.gradient_up.light_blue", + "english_translation": "Light Blue Base Gradient" + }, + { + "key": "enchantment.minecraft.efficiency", + "english_translation": "Efficiency" + }, + { + "key": "demo.help.later", + "english_translation": "Continue Playing!" + }, + { + "key": "block.minecraft.exposed_copper", + "english_translation": "Exposed Copper" + }, + { + "key": "selectWorld.edit.backupCreated", + "english_translation": "Backed up: %s" + }, + { + "key": "options.hideMatchedNames", + "english_translation": "Hide Matched Names" + }, + { + "key": "compliance.playtime.message", + "english_translation": "Excessive gaming may interfere with normal daily life" + }, + { + "key": "block.minecraft.banner.square_bottom_left.green", + "english_translation": "Green Base Dexter Canton" + }, + { + "key": "advancements.husbandry.plant_any_sniffer_seed.description", + "english_translation": "Plant any Sniffer seed" + }, + { + "key": "effect.minecraft.unluck", + "english_translation": "Bad Luck" + }, + { + "key": "commands.data.storage.modified", + "english_translation": "Modified storage %s" + }, + { + "key": "block.minecraft.dead_horn_coral_fan", + "english_translation": "Dead Horn Coral Fan" + }, + { + "key": "narrator.select.world_info", + "english_translation": "Selected %s, last played: %s, %s" + }, + { + "key": "mco.configure.world.subscription.days", + "english_translation": "days" + }, + { + "key": "subtitles.entity.vindicator.hurt", + "english_translation": "Vindicator hurts" + }, + { + "key": "block.minecraft.banner.globe.blue", + "english_translation": "Blue Globe" + }, + { + "key": "createWorld.customize.custom.preset.drought", + "english_translation": "Drought" + }, + { + "key": "block.minecraft.iron_trapdoor", + "english_translation": "Iron Trapdoor" + }, + { + "key": "item.minecraft.music_disc_11.desc", + "english_translation": "C418 - 11" + }, + { + "key": "item.minecraft.polar_bear_spawn_egg", + "english_translation": "Polar Bear Spawn Egg" + }, + { + "key": "arguments.item.overstacked", + "english_translation": "%s can only stack up to %s" + }, + { + "key": "block.minecraft.banner.diagonal_right.brown", + "english_translation": "Brown Per Bend" + }, + { + "key": "death.attack.fallingBlock", + "english_translation": "%1$s was squashed by a falling block" + }, + { + "key": "block.minecraft.banner.flower.magenta", + "english_translation": "Magenta Flower Charge" + }, + { + "key": "block.minecraft.black_glazed_terracotta", + "english_translation": "Black Glazed Terracotta" + }, + { + "key": "mco.invites.title", + "english_translation": "Pending Invites" + }, + { + "key": "mco.account.update", + "english_translation": "Update account" + }, + { + "key": "block.minecraft.light_blue_candle", + "english_translation": "Light Blue Candle" + }, + { + "key": "item.minecraft.firework_star", + "english_translation": "Firework Star" + }, + { + "key": "createWorld.customize.custom.mainNoiseScaleX", + "english_translation": "Main Noise Scale X" + }, + { + "key": "block.minecraft.cherry_trapdoor", + "english_translation": "Cherry Trapdoor" + }, + { + "key": "createWorld.customize.custom.mainNoiseScaleY", + "english_translation": "Main Noise Scale Y" + }, + { + "key": "createWorld.customize.custom.mainNoiseScaleZ", + "english_translation": "Main Noise Scale Z" + }, + { + "key": "key.categories.ui", + "english_translation": "Game Interface" + }, + { + "key": "options.gamma.min", + "english_translation": "Moody" + }, + { + "key": "mco.configure.world.subscription.unknown", + "english_translation": "Unknown" + }, + { + "key": "block.minecraft.banner.half_vertical.orange", + "english_translation": "Orange Per Pale" + }, + { + "key": "mco.minigame.world.startButton", + "english_translation": "Switch" + }, + { + "key": "commands.data.modify.invalid_index", + "english_translation": "Invalid list index: %s" + }, + { + "key": "block.minecraft.banner.square_bottom_left.black", + "english_translation": "Black Base Dexter Canton" + }, + { + "key": "block.minecraft.spruce_wall_hanging_sign", + "english_translation": "Spruce Wall Hanging Sign" + }, + { + "key": "biome.minecraft.wooded_badlands", + "english_translation": "Wooded Badlands" + }, + { + "key": "block.minecraft.cornflower", + "english_translation": "Cornflower" + }, + { + "key": "options.discrete_mouse_scroll", + "english_translation": "Discrete Scrolling" + }, + { + "key": "chat_screen.title", + "english_translation": "Chat screen" + }, + { + "key": "structure_block.mode_info.corner", + "english_translation": "Corner Mode - Placement and Size Marker" + }, + { + "key": "block.minecraft.bamboo_fence", + "english_translation": "Bamboo Fence" + }, + { + "key": "debug.inspect.client.block", + "english_translation": "Copied client-side block data to clipboard" + }, + { + "key": "dataPack.validation.failed", + "english_translation": "Data pack validation failed!" + }, + { + "key": "mco.activity.noactivity", + "english_translation": "No activity for the past %s day(s)" + }, + { + "key": "entity.minecraft.villager.weaponsmith", + "english_translation": "Weaponsmith" + }, + { + "key": "block.minecraft.purple_glazed_terracotta", + "english_translation": "Purple Glazed Terracotta" + }, + { + "key": "menu.paused", + "english_translation": "Game Paused" + }, + { + "key": "mco.selectServer.play", + "english_translation": "Play" + }, + { + "key": "block.minecraft.spawner.desc2", + "english_translation": "Sets Mob Type" + }, + { + "key": "block.minecraft.spawner.desc1", + "english_translation": "Interact with Spawn Egg:" + }, + { + "key": "subtitles.entity.magma_cube.hurt", + "english_translation": "Magma Cube hurts" + }, + { + "key": "advancements.story.cure_zombie_villager.description", + "english_translation": "Weaken and then cure a Zombie Villager" + }, + { + "key": "commands.trigger.failed.unprimed", + "english_translation": "You cannot trigger this objective yet" + }, + { + "key": "advancements.husbandry.complete_catalogue.title", + "english_translation": "A Complete Catalogue" + }, + { + "key": "selectWorld.unable_to_load", + "english_translation": "Unable to load worlds" + }, + { + "key": "subtitles.entity.goat.screaming.ambient", + "english_translation": "Goat bellows" + }, + { + "key": "options.language", + "english_translation": "Language..." + }, + { + "key": "block.minecraft.vine", + "english_translation": "Vines" + }, + { + "key": "block.minecraft.banner.diagonal_left.yellow", + "english_translation": "Yellow Per Bend Sinister" + }, + { + "key": "block.minecraft.orange_concrete", + "english_translation": "Orange Concrete" + }, + { + "key": "subtitles.entity.illusioner.mirror_move", + "english_translation": "Illusioner displaces" + }, + { + "key": "block.minecraft.infested_stone_bricks", + "english_translation": "Infested Stone Bricks" + }, + { + "key": "commands.playsound.failed", + "english_translation": "The sound is too far away to be heard" + }, + { + "key": "block.minecraft.banner.flower.lime", + "english_translation": "Lime Flower Charge" + }, + { + "key": "commands.whitelist.enabled", + "english_translation": "Whitelist is now turned on" + }, + { + "key": "block.minecraft.magenta_wool", + "english_translation": "Magenta Wool" + }, + { + "key": "entity.minecraft.villager.fletcher", + "english_translation": "Fletcher" + }, + { + "key": "debug.gamemodes.select_next", + "english_translation": "%s Next" + }, + { + "key": "subtitles.entity.goat.hurt", + "english_translation": "Goat hurts" + }, + { + "key": "block.minecraft.brown_concrete_powder", + "english_translation": "Brown Concrete Powder" + }, + { + "key": "subtitles.entity.wither_skeleton.ambient", + "english_translation": "Wither Skeleton rattles" + }, + { + "key": "trim_pattern.minecraft.silence", + "english_translation": "Silence Armor Trim" + }, + { + "key": "block.minecraft.acacia_trapdoor", + "english_translation": "Acacia Trapdoor" + }, + { + "key": "commands.spectate.success.stopped", + "english_translation": "No longer spectating an entity" + }, + { + "key": "block.minecraft.stripped_cherry_log", + "english_translation": "Stripped Cherry Log" + }, + { + "key": "createWorld.customize.custom.depthNoiseScaleExponent", + "english_translation": "Depth Noise Exponent" + }, + { + "key": "tutorial.move.description", + "english_translation": "Jump with %s" + }, + { + "key": "block.minecraft.amethyst_cluster", + "english_translation": "Amethyst Cluster" + }, + { + "key": "block.minecraft.banner.straight_cross.green", + "english_translation": "Green Cross" + }, + { + "key": "commands.bossbar.set.style.unchanged", + "english_translation": "Nothing changed. That's already the style of this bossbar" + }, + { + "key": "gui.days", + "english_translation": "%s day(s)" + }, + { + "key": "subtitles.block.fire.extinguish", + "english_translation": "Fire extinguished" + }, + { + "key": "resourcePack.vanilla.name", + "english_translation": "Default" + }, + { + "key": "mco.configure.world.slot", + "english_translation": "World %s" + }, + { + "key": "block.minecraft.waxed_cut_copper", + "english_translation": "Waxed Cut Copper" + }, + { + "key": "block.minecraft.birch_slab", + "english_translation": "Birch Slab" + }, + { + "key": "gui.chatSelection.fold", + "english_translation": "%s message(s) hidden" + }, + { + "key": "painting.minecraft.alban.title", + "english_translation": "Albanian" + }, + { + "key": "mco.upload.failed", + "english_translation": "Upload failed! (%s)" + }, + { + "key": "biome.minecraft.cold_ocean", + "english_translation": "Cold Ocean" + }, + { + "key": "block.minecraft.banner.half_horizontal_bottom.pink", + "english_translation": "Pink Per Fess Inverted" + }, + { + "key": "options.framerateLimit", + "english_translation": "Max Framerate" + }, + { + "key": "trim_material.minecraft.amethyst", + "english_translation": "Amethyst Material" + }, + { + "key": "narrator.button.difficulty_lock.unlocked", + "english_translation": "Unlocked" + }, + { + "key": "commands.datapack.list.available.none", + "english_translation": "There are no more data packs available" + }, + { + "key": "enchantment.minecraft.riptide", + "english_translation": "Riptide" + }, + { + "key": "selectWorld.warning.deprecated.question", + "english_translation": "Some features used are deprecated and will stop working in the future. Do you wish to proceed?" + }, + { + "key": "argument.nbt.array.mixed", + "english_translation": "Can't insert %s into %s" + }, + { + "key": "block.minecraft.banner.triangle_top.gray", + "english_translation": "Gray Inverted Chevron" + }, + { + "key": "commands.kill.success.multiple", + "english_translation": "Killed %s entities" + }, + { + "key": "block.minecraft.brown_concrete", + "english_translation": "Brown Concrete" + }, + { + "key": "disconnect.loginFailedInfo.userBanned", + "english_translation": "You are banned from playing online" + }, + { + "key": "block.minecraft.potted_bamboo", + "english_translation": "Potted Bamboo" + }, + { + "key": "block.minecraft.blackstone_wall", + "english_translation": "Blackstone Wall" + }, + { + "key": "advMode.command", + "english_translation": "Console Command" + }, + { + "key": "subtitles.entity.parrot.imitate.warden", + "english_translation": "Parrot whines" + }, + { + "key": "options.chat.line_spacing", + "english_translation": "Line Spacing" + }, + { + "key": "block.minecraft.banner.flower.blue", + "english_translation": "Blue Flower Charge" + }, + { + "key": "datapackFailure.title", + "english_translation": "Errors in currently selected data packs prevented the world from loading.\nYou can either try to load it with only the vanilla data pack (\"safe mode\"), or go back to the title screen and fix it manually." + }, + { + "key": "biome.minecraft.frozen_peaks", + "english_translation": "Frozen Peaks" + }, + { + "key": "key.keyboard.keypad.divide", + "english_translation": "Keypad /" + }, + { + "key": "block.minecraft.sugar_cane", + "english_translation": "Sugar Cane" + }, + { + "key": "item.color", + "english_translation": "Color: %s" + }, + { + "key": "block.minecraft.end_gateway", + "english_translation": "End Gateway" + }, + { + "key": "advancements.nether.summon_wither.description", + "english_translation": "Summon the Wither" + }, + { + "key": "block.minecraft.deepslate_copper_ore", + "english_translation": "Deepslate Copper Ore" + }, + { + "key": "item.minecraft.shelter_pottery_sherd", + "english_translation": "Shelter Pottery Sherd" + }, + { + "key": "resourcePack.server.name", + "english_translation": "World Specific Resources" + }, + { + "key": "block.minecraft.cracked_deepslate_bricks", + "english_translation": "Cracked Deepslate Bricks" + }, + { + "key": "subtitles.block.door.toggle", + "english_translation": "Door creaks" + }, + { + "key": "multiplayer.disconnect.outdated_client", + "english_translation": "Incompatible client! Please use %s" + }, + { + "key": "block.minecraft.horn_coral_wall_fan", + "english_translation": "Horn Coral Wall Fan" + }, + { + "key": "entity.minecraft.warden", + "english_translation": "Warden" + }, + { + "key": "mco.selectServer.mapOnlySupportedForVersion", + "english_translation": "This map is unsupported in %s" + }, + { + "key": "item.minecraft.golden_axe", + "english_translation": "Golden Axe" + }, + { + "key": "item.minecraft.skull_pottery_sherd", + "english_translation": "Skull Pottery Sherd" + }, + { + "key": "block.minecraft.deepslate_tiles", + "english_translation": "Deepslate Tiles" + }, + { + "key": "commands.execute.conditional.pass", + "english_translation": "Test passed" + }, + { + "key": "gui.abuseReport.reason.defamation_impersonation_false_information.description", + "english_translation": "Someone is damaging someone else's reputation, pretending to be someone they're not, or sharing false information with the aim to exploit or mislead others." + }, + { + "key": "block.minecraft.banner.gradient_up.cyan", + "english_translation": "Cyan Base Gradient" + }, + { + "key": "mco.backup.entry.undefined", + "english_translation": "Undefined Change" + }, + { + "key": "subtitles.entity.turtle.shamble_baby", + "english_translation": "Turtle baby shambles" + }, + { + "key": "biome.minecraft.snowy_slopes", + "english_translation": "Snowy Slopes" + }, + { + "key": "death.attack.fallingStalactite", + "english_translation": "%1$s was skewered by a falling stalactite" + }, + { + "key": "block.minecraft.blue_concrete", + "english_translation": "Blue Concrete" + }, + { + "key": "block.minecraft.banner.creeper.white", + "english_translation": "White Creeper Charge" + }, + { + "key": "selectWorld.import_worldgen_settings", + "english_translation": "Import Settings" + }, + { + "key": "block.minecraft.banner.triangles_bottom.lime", + "english_translation": "Lime Base Indented" + }, + { + "key": "item.minecraft.smithing_template.ingredients", + "english_translation": "Ingredients:" + }, + { + "key": "mco.terms.title", + "english_translation": "Realms Terms of Service" + }, + { + "key": "item.minecraft.light_gray_dye", + "english_translation": "Light Gray Dye" + }, + { + "key": "block.minecraft.banner.border.brown", + "english_translation": "Brown Bordure" + }, + { + "key": "block.minecraft.fire_coral_wall_fan", + "english_translation": "Fire Coral Wall Fan" + }, + { + "key": "block.minecraft.dispenser", + "english_translation": "Dispenser" + }, + { + "key": "subtitles.item.armor.equip", + "english_translation": "Gear equips" + }, + { + "key": "biome.minecraft.meadow", + "english_translation": "Meadow" + }, + { + "key": "subtitles.entity.parrot.imitate.skeleton", + "english_translation": "Parrot rattles" + }, + { + "key": "argument.entity.toomany", + "english_translation": "Only one entity is allowed, but the provided selector allows more than one" + }, + { + "key": "item.minecraft.heartbreak_pottery_shard", + "english_translation": "Heartbreak Pottery Shard" + }, + { + "key": "commands.playsound.success.single", + "english_translation": "Played sound %s to %s" + }, + { + "key": "subtitles.entity.ravager.celebrate", + "english_translation": "Ravager cheers" + }, + { + "key": "lanServer.start", + "english_translation": "Start LAN World" + }, + { + "key": "subtitles.entity.player.attack.sweep", + "english_translation": "Sweeping attack" + }, + { + "key": "block.minecraft.emerald_ore", + "english_translation": "Emerald Ore" + }, + { + "key": "mco.template.select.narrate.version", + "english_translation": "version %s" + }, + { + "key": "subtitles.entity.elder_guardian.ambient", + "english_translation": "Elder Guardian moans" + }, + { + "key": "advancements.nether.brew_potion.description", + "english_translation": "Brew a Potion" + }, + { + "key": "chat.disabled.launcher", + "english_translation": "Chat disabled by launcher option. Cannot send message." + }, + { + "key": "subtitles.entity.magma_cube.squish", + "english_translation": "Magma Cube squishes" + }, + { + "key": "block.minecraft.dead_tube_coral_wall_fan", + "english_translation": "Dead Tube Coral Wall Fan" + }, + { + "key": "subtitles.block.beehive.exit", + "english_translation": "Bee leaves hive" + }, + { + "key": "options.gamma.max", + "english_translation": "Bright" + }, + { + "key": "block.minecraft.polished_blackstone_pressure_plate", + "english_translation": "Polished Blackstone Pressure Plate" + }, + { + "key": "commands.enchant.failed.entity", + "english_translation": "%s is not a valid entity for this command" + }, + { + "key": "subtitles.block.chest.open", + "english_translation": "Chest opens" + }, + { + "key": "block.minecraft.banner.border.orange", + "english_translation": "Orange Bordure" + }, + { + "key": "subtitles.entity.husk.converted_to_zombie", + "english_translation": "Husk converts to Zombie" + }, + { + "key": "subtitles.entity.pig.death", + "english_translation": "Pig dies" + }, + { + "key": "argument.id.invalid", + "english_translation": "Invalid ID" + }, + { + "key": "block.minecraft.purple_bed", + "english_translation": "Purple Bed" + }, + { + "key": "options.credits_and_attribution", + "english_translation": "Credits & Attribution..." + }, + { + "key": "mco.create.world.subtitle", + "english_translation": "Optionally, select what world to put on your new realm" + }, + { + "key": "options.screenEffectScale", + "english_translation": "Distortion Effects" + }, + { + "key": "block.minecraft.banner.flower.purple", + "english_translation": "Purple Flower Charge" + }, + { + "key": "mco.configure.world.edit.subscreen.inspiration", + "english_translation": "Some settings are disabled since your current world is an inspiration" + }, + { + "key": "entity.minecraft.small_fireball", + "english_translation": "Small Fireball" + }, + { + "key": "advancements.toast.goal", + "english_translation": "Goal Reached!" + }, + { + "key": "block.minecraft.banner.circle.light_blue", + "english_translation": "Light Blue Roundel" + }, + { + "key": "item.minecraft.bundle", + "english_translation": "Bundle" + }, + { + "key": "block.minecraft.banner.stripe_top.red", + "english_translation": "Red Chief" + }, + { + "key": "key.categories.movement", + "english_translation": "Movement" + }, + { + "key": "block.minecraft.magenta_glazed_terracotta", + "english_translation": "Magenta Glazed Terracotta" + }, + { + "key": "subtitles.entity.puffer_fish.hurt", + "english_translation": "Pufferfish hurts" + }, + { + "key": "advancements.adventure.lightning_rod_with_villager_no_fire.description", + "english_translation": "Protect a Villager from an undesired shock without starting a fire" + }, + { + "key": "commands.bossbar.set.players.unchanged", + "english_translation": "Nothing changed. Those players are already on the bossbar with nobody to add or remove" + }, + { + "key": "block.minecraft.moving_piston", + "english_translation": "Moving Piston" + }, + { + "key": "subtitles.entity.squid.ambient", + "english_translation": "Squid swims" + }, + { + "key": "block.minecraft.fire", + "english_translation": "Fire" + }, + { + "key": "block.minecraft.banner.stripe_downleft.yellow", + "english_translation": "Yellow Bend Sinister" + }, + { + "key": "block.minecraft.birch_door", + "english_translation": "Birch Door" + }, + { + "key": "block.minecraft.cyan_shulker_box", + "english_translation": "Cyan Shulker Box" + }, + { + "key": "advancements.nether.obtain_blaze_rod.description", + "english_translation": "Relieve a Blaze of its rod" + }, + { + "key": "block.minecraft.smooth_sandstone_stairs", + "english_translation": "Smooth Sandstone Stairs" + }, + { + "key": "subtitles.entity.spider.death", + "english_translation": "Spider dies" + }, + { + "key": "block.minecraft.lime_glazed_terracotta", + "english_translation": "Lime Glazed Terracotta" + }, + { + "key": "subtitles.entity.ender_dragon.death", + "english_translation": "Dragon dies" + }, + { + "key": "key.keyboard.down", + "english_translation": "Down Arrow" + }, + { + "key": "stat.minecraft.open_barrel", + "english_translation": "Barrels Opened" + }, + { + "key": "debug.creative_spectator.error", + "english_translation": "Unable to switch game mode; no permission" + }, + { + "key": "mco.brokenworld.nonowner.title", + "english_translation": "World is out of date" + }, + { + "key": "block.minecraft.heavy_weighted_pressure_plate", + "english_translation": "Heavy Weighted Pressure Plate" + }, + { + "key": "telemetry.property.frame_rate_samples.title", + "english_translation": "Frame Rate Samples (FPS)" + }, + { + "key": "block.minecraft.banner.half_vertical.gray", + "english_translation": "Gray Per Pale" + }, + { + "key": "gui.socialInteractions.search_hint", + "english_translation": "Search..." + }, + { + "key": "entity.minecraft.cod", + "english_translation": "Cod" + }, + { + "key": "argument.entity.options.sort.description", + "english_translation": "Sort the entities" + }, + { + "key": "commands.banlist.list", + "english_translation": "There are %s ban(s):" + }, + { + "key": "entity.minecraft.hoglin", + "english_translation": "Hoglin" + }, + { + "key": "biome.minecraft.basalt_deltas", + "english_translation": "Basalt Deltas" + }, + { + "key": "block.minecraft.banner.stripe_right.green", + "english_translation": "Green Pale Sinister" + }, + { + "key": "argument.block.tag.disallowed", + "english_translation": "Tags aren't allowed here, only actual blocks" + }, + { + "key": "options.videoTitle", + "english_translation": "Video Settings" + }, + { + "key": "entity.minecraft.cow", + "english_translation": "Cow" + }, + { + "key": "generator.minecraft.debug_all_block_states", + "english_translation": "Debug Mode" + }, + { + "key": "block.minecraft.pink_glazed_terracotta", + "english_translation": "Pink Glazed Terracotta" + }, + { + "key": "painting.minecraft.bust.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "telemetry.property.ticks_since_load.title", + "english_translation": "Time Since Load (Ticks)" + }, + { + "key": "subtitles.entity.hoglin.retreat", + "english_translation": "Hoglin retreats" + }, + { + "key": "commands.forceload.removed.single", + "english_translation": "Unmarked chunk %s in %s for force loading" + }, + { + "key": "block.minecraft.light_blue_carpet", + "english_translation": "Light Blue Carpet" + }, + { + "key": "subtitles.entity.axolotl.death", + "english_translation": "Axolotl dies" + }, + { + "key": "chat.disabled.chain_broken", + "english_translation": "Chat disabled due to broken chain. Please try reconnecting." + }, + { + "key": "enchantment.minecraft.piercing", + "english_translation": "Piercing" + }, + { + "key": "entity.minecraft.ravager", + "english_translation": "Ravager" + }, + { + "key": "mco.configure.world.invited", + "english_translation": "Invited" + }, + { + "key": "options.glintStrength.tooltip", + "english_translation": "Controls how transparent the visual glint is on enchanted items." + }, + { + "key": "death.attack.thrown", + "english_translation": "%1$s was pummeled by %2$s" + }, + { + "key": "entity.minecraft.tnt", + "english_translation": "Primed TNT" + }, + { + "key": "item.minecraft.potion.effect.slowness", + "english_translation": "Potion of Slowness" + }, + { + "key": "block.minecraft.mossy_stone_brick_slab", + "english_translation": "Mossy Stone Brick Slab" + }, + { + "key": "createWorld.customize.custom.useLavaOceans", + "english_translation": "Lava Oceans" + }, + { + "key": "biome.minecraft.stony_peaks", + "english_translation": "Stony Peaks" + }, + { + "key": "color.minecraft.light_gray", + "english_translation": "Light Gray" + }, + { + "key": "subtitles.entity.slime.death", + "english_translation": "Slime dies" + }, + { + "key": "subtitles.entity.firework_rocket.blast", + "english_translation": "Firework blasts" + }, + { + "key": "addServer.title", + "english_translation": "Edit Server Info" + }, + { + "key": "key.keyboard.grave.accent", + "english_translation": "`" + }, + { + "key": "block.minecraft.lime_candle", + "english_translation": "Lime Candle" + }, + { + "key": "subtitles.particle.soul_escape", + "english_translation": "Soul escapes" + }, + { + "key": "mco.selectServer.expired", + "english_translation": "Expired realm" + }, + { + "key": "color.minecraft.white", + "english_translation": "White" + }, + { + "key": "commands.datapack.enable.failed", + "english_translation": "Pack '%s' is already enabled!" + }, + { + "key": "block.minecraft.enchanting_table", + "english_translation": "Enchanting Table" + }, + { + "key": "block.minecraft.barrel", + "english_translation": "Barrel" + }, + { + "key": "narrator.button.language", + "english_translation": "Language" + }, + { + "key": "gui.recipebook.toggleRecipes.blastable", + "english_translation": "Showing Blastable" + }, + { + "key": "mco.configure.world.leave.question.line2", + "english_translation": "Are you sure you want to continue?" + }, + { + "key": "mco.configure.world.leave.question.line1", + "english_translation": "If you leave this realm you won't see it unless you are invited again" + }, + { + "key": "subtitles.item.crossbow.charge", + "english_translation": "Crossbow charges up" + }, + { + "key": "block.minecraft.chain", + "english_translation": "Chain" + }, + { + "key": "painting.minecraft.plant.title", + "english_translation": "ParadistrƤd" + }, + { + "key": "item.minecraft.potion.effect.regeneration", + "english_translation": "Potion of Regeneration" + }, + { + "key": "subtitles.entity.villager.death", + "english_translation": "Villager dies" + }, + { + "key": "subtitles.entity.phantom.bite", + "english_translation": "Phantom bites" + }, + { + "key": "block.minecraft.banner.triangle_top.red", + "english_translation": "Red Inverted Chevron" + }, + { + "key": "stat.minecraft.interact_with_smithing_table", + "english_translation": "Interactions with Smithing Table" + }, + { + "key": "item.minecraft.tipped_arrow.effect.fire_resistance", + "english_translation": "Arrow of Fire Resistance" + }, + { + "key": "block.minecraft.cave_vines_plant", + "english_translation": "Cave Vines Plant" + }, + { + "key": "subtitles.entity.glow_item_frame.remove_item", + "english_translation": "Glow Item Frame empties" + }, + { + "key": "block.minecraft.quartz_block", + "english_translation": "Block of Quartz" + }, + { + "key": "subtitles.block.shulker_box.open", + "english_translation": "Shulker opens" + }, + { + "key": "commands.bossbar.set.max.unchanged", + "english_translation": "Nothing changed. That's already the max of this bossbar" + }, + { + "key": "block.minecraft.banner.gradient.gray", + "english_translation": "Gray Gradient" + }, + { + "key": "key.mouse", + "english_translation": "Button %1$s" + }, + { + "key": "block.minecraft.cut_copper_stairs", + "english_translation": "Cut Copper Stairs" + }, + { + "key": "block.minecraft.banner.triangles_bottom.blue", + "english_translation": "Blue Base Indented" + }, + { + "key": "block.minecraft.stripped_dark_oak_wood", + "english_translation": "Stripped Dark Oak Wood" + }, + { + "key": "commands.worldborder.warning.time.success", + "english_translation": "Set the world border warning time to %s second(s)" + }, + { + "key": "block.minecraft.banner.border.pink", + "english_translation": "Pink Bordure" + }, + { + "key": "mco.configure.world.restore.question.line2", + "english_translation": "Are you sure you want to continue?" + }, + { + "key": "subtitles.entity.strider.idle", + "english_translation": "Strider chirps" + }, + { + "key": "mco.configure.world.restore.question.line1", + "english_translation": "Your world will be restored to date '%s' (%s)" + }, + { + "key": "dataPack.update_1_20.name", + "english_translation": "Update 1.20" + }, + { + "key": "selectWorld.edit.resetIcon", + "english_translation": "Reset Icon" + }, + { + "key": "disconnect.genericReason", + "english_translation": "%s" + }, + { + "key": "block.minecraft.bamboo_mosaic_stairs", + "english_translation": "Bamboo Mosaic Stairs" + }, + { + "key": "biome.minecraft.flower_forest", + "english_translation": "Flower Forest" + }, + { + "key": "subtitles.chiseled_bookshelf.take", + "english_translation": "Book taken" + }, + { + "key": "stat.minecraft.bell_ring", + "english_translation": "Bells Rung" + }, + { + "key": "subtitles.entity.bat.hurt", + "english_translation": "Bat hurts" + }, + { + "key": "subtitles.entity.squid.death", + "english_translation": "Squid dies" + }, + { + "key": "menu.playdemo", + "english_translation": "Play Demo World" + }, + { + "key": "fabric-registry-sync-v0.unknown-remote.footer", + "english_translation": "And %s more..." + }, + { + "key": "block.minecraft.big_dripleaf_stem", + "english_translation": "Big Dripleaf Stem" + }, + { + "key": "options.allowServerListing.tooltip", + "english_translation": "Servers may list online players as part of their public status.\nWith this option off your name will not show up in such lists." + }, + { + "key": "block.minecraft.stone_pressure_plate", + "english_translation": "Stone Pressure Plate" + }, + { + "key": "biome.minecraft.mangrove_swamp", + "english_translation": "Mangrove Swamp" + }, + { + "key": "block.minecraft.bamboo_button", + "english_translation": "Bamboo Button" + }, + { + "key": "block.minecraft.banner.straight_cross.white", + "english_translation": "White Cross" + }, + { + "key": "advancements.husbandry.breed_an_animal.description", + "english_translation": "Breed two animals together" + }, + { + "key": "block.minecraft.banner.mojang.yellow", + "english_translation": "Yellow Thing" + }, + { + "key": "narrator.loading", + "english_translation": "Loading: %s" + }, + { + "key": "block.minecraft.campfire", + "english_translation": "Campfire" + }, + { + "key": "argument.entity.options.distance.negative", + "english_translation": "Distance cannot be negative" + }, + { + "key": "item.minecraft.oak_chest_boat", + "english_translation": "Oak Boat with Chest" + }, + { + "key": "demo.help.inventory", + "english_translation": "Use the %1$s key to open your inventory" + }, + { + "key": "gui.abuseReport.reason.imminent_harm.description", + "english_translation": "Someone is threatening to harm you or someone else in real life." + }, + { + "key": "subtitles.entity.skeleton_horse.death", + "english_translation": "Skeleton Horse dies" + }, + { + "key": "block.minecraft.spawner", + "english_translation": "Monster Spawner" + }, + { + "key": "commands.enchant.failed", + "english_translation": "Nothing changed. Targets either have no item in their hands or the enchantment could not be applied" + }, + { + "key": "parsing.long.invalid", + "english_translation": "Invalid long '%s'" + }, + { + "key": "mco.selectServer.buy", + "english_translation": "Buy a realm!" + }, + { + "key": "block.minecraft.spruce_wall_sign", + "english_translation": "Spruce Wall Sign" + }, + { + "key": "block.minecraft.banner.gradient_up.red", + "english_translation": "Red Base Gradient" + }, + { + "key": "gamerule.category.drops", + "english_translation": "Drops" + }, + { + "key": "item.minecraft.music_disc_pigstep.desc", + "english_translation": "Lena Raine - Pigstep" + }, + { + "key": "subtitles.entity.zombie_horse.hurt", + "english_translation": "Zombie Horse hurts" + }, + { + "key": "advancements.adventure.arbalistic.title", + "english_translation": "Arbalistic" + }, + { + "key": "subtitles.entity.glow_squid.squirt", + "english_translation": "Glow Squid shoots ink" + }, + { + "key": "item.minecraft.splash_potion.effect.slowness", + "english_translation": "Splash Potion of Slowness" + }, + { + "key": "painting.minecraft.sunset.title", + "english_translation": "sunset_dense" + }, + { + "key": "item.minecraft.music_disc_mall.desc", + "english_translation": "C418 - mall" + }, + { + "key": "item.minecraft.shield.blue", + "english_translation": "Blue Shield" + }, + { + "key": "death.attack.player", + "english_translation": "%1$s was slain by %2$s" + }, + { + "key": "createWorld.customize.custom.confirm2", + "english_translation": "settings and cannot be undone." + }, + { + "key": "mco.worldSlot.minigame", + "english_translation": "Minigame" + }, + { + "key": "createWorld.customize.custom.confirm1", + "english_translation": "This will overwrite your current" + }, + { + "key": "block.minecraft.cherry_button", + "english_translation": "Cherry Button" + }, + { + "key": "block.minecraft.andesite_wall", + "english_translation": "Andesite Wall" + }, + { + "key": "options.gamma", + "english_translation": "Brightness" + }, + { + "key": "subtitles.entity.warden.roar", + "english_translation": "Warden roars" + }, + { + "key": "advancements.adventure.fall_from_world_height.description", + "english_translation": "Free fall from the top of the world (build limit) to the bottom of the world and survive" + }, + { + "key": "parsing.int.invalid", + "english_translation": "Invalid integer '%s'" + }, + { + "key": "chat.tag.system_single_player", + "english_translation": "Server message." + }, + { + "key": "commands.data.get.unknown", + "english_translation": "Can't get %s; tag doesn't exist" + }, + { + "key": "advancements.story.follow_ender_eye.description", + "english_translation": "Follow an Eye of Ender" + }, + { + "key": "block.minecraft.birch_trapdoor", + "english_translation": "Birch Trapdoor" + }, + { + "key": "gamerule.logAdminCommands", + "english_translation": "Broadcast admin commands" + }, + { + "key": "item.minecraft.blue_dye", + "english_translation": "Blue Dye" + }, + { + "key": "block.minecraft.moss_block", + "english_translation": "Moss Block" + }, + { + "key": "block.minecraft.banner.stripe_top.pink", + "english_translation": "Pink Chief" + }, + { + "key": "block.minecraft.torch", + "english_translation": "Torch" + }, + { + "key": "advancements.story.smelt_iron.title", + "english_translation": "Acquire Hardware" + }, + { + "key": "block.minecraft.light_gray_shulker_box", + "english_translation": "Light Gray Shulker Box" + }, + { + "key": "block.minecraft.orange_candle_cake", + "english_translation": "Cake with Orange Candle" + }, + { + "key": "color.minecraft.green", + "english_translation": "Green" + }, + { + "key": "advancements.story.enchant_item.title", + "english_translation": "Enchanter" + }, + { + "key": "mco.upload.select.world.subtitle", + "english_translation": "Please select a singleplayer world to upload" + }, + { + "key": "recipe.notFound", + "english_translation": "Unknown recipe: %s" + }, + { + "key": "options.difficulty.easy", + "english_translation": "Easy" + }, + { + "key": "advMode.mode.redstoneTriggered", + "english_translation": "Needs Redstone" + }, + { + "key": "options.darknessEffectScale.tooltip", + "english_translation": "Controls how much the Darkness effect pulses when a Warden or Sculk Shrieker gives it to you." + }, + { + "key": "subtitles.entity.parrot.imitate.silverfish", + "english_translation": "Parrot hisses" + }, + { + "key": "language.code", + "english_translation": "en_us" + }, + { + "key": "commands.teammsg.failed.noteam", + "english_translation": "You must be on a team to message your team" + }, + { + "key": "block.minecraft.banner.stripe_middle.cyan", + "english_translation": "Cyan Fess" + }, + { + "key": "painting.minecraft.void.title", + "english_translation": "The void" + }, + { + "key": "block.minecraft.dark_oak_button", + "english_translation": "Dark Oak Button" + }, + { + "key": "block.minecraft.large_amethyst_bud", + "english_translation": "Large Amethyst Bud" + }, + { + "key": "trim_pattern.minecraft.spire", + "english_translation": "Spire Armor Trim" + }, + { + "key": "item.minecraft.golden_helmet", + "english_translation": "Golden Helmet" + }, + { + "key": "block.minecraft.soul_lantern", + "english_translation": "Soul Lantern" + }, + { + "key": "block.minecraft.banner.stripe_bottom.pink", + "english_translation": "Pink Base" + }, + { + "key": "commands.team.option.seeFriendlyInvisibles.alreadyDisabled", + "english_translation": "Nothing changed. That team already can't see invisible teammates" + }, + { + "key": "block.minecraft.chiseled_stone_bricks", + "english_translation": "Chiseled Stone Bricks" + }, + { + "key": "block.minecraft.bamboo_planks", + "english_translation": "Bamboo Planks" + }, + { + "key": "block.minecraft.banner.small_stripes.purple", + "english_translation": "Purple Paly" + }, + { + "key": "gamerule.category.chat", + "english_translation": "Chat" + }, + { + "key": "block.minecraft.banner.stripe_right.white", + "english_translation": "White Pale Sinister" + }, + { + "key": "block.minecraft.potted_warped_roots", + "english_translation": "Potted Warped Roots" + }, + { + "key": "painting.minecraft.wind.author", + "english_translation": "Mojang" + }, + { + "key": "entity.minecraft.cat", + "english_translation": "Cat" + }, + { + "key": "item.minecraft.lingering_potion.effect.night_vision", + "english_translation": "Lingering Potion of Night Vision" + }, + { + "key": "argument.entity.selector.randomPlayer", + "english_translation": "Random player" + }, + { + "key": "commands.bossbar.set.players.success.some", + "english_translation": "Custom bossbar %s now has %s player(s): %s" + }, + { + "key": "gamerule.playersSleepingPercentage", + "english_translation": "Sleep percentage" + }, + { + "key": "commands.clear.success.multiple", + "english_translation": "Removed %s item(s) from %s players" + }, + { + "key": "block.minecraft.warped_sign", + "english_translation": "Warped Sign" + }, + { + "key": "block.minecraft.banner.stripe_top.brown", + "english_translation": "Brown Chief" + }, + { + "key": "death.attack.sonic_boom.player", + "english_translation": "%1$s was obliterated by a sonically-charged shriek whilst trying to escape %2$s" + }, + { + "key": "block.minecraft.bamboo", + "english_translation": "Bamboo" + }, + { + "key": "death.attack.thorns.item", + "english_translation": "%1$s was killed by %3$s trying to hurt %2$s" + }, + { + "key": "item.minecraft.cooked_porkchop", + "english_translation": "Cooked Porkchop" + }, + { + "key": "commands.experience.set.points.success.single", + "english_translation": "Set %s experience points on %s" + }, + { + "key": "subtitles.entity.llama.ambient", + "english_translation": "Llama bleats" + }, + { + "key": "block.minecraft.banner.square_bottom_left.red", + "english_translation": "Red Base Dexter Canton" + }, + { + "key": "block.minecraft.sculk", + "english_translation": "Sculk" + }, + { + "key": "painting.minecraft.water.title", + "english_translation": "Water" + }, + { + "key": "selectWorld.gameMode.creative.line1", + "english_translation": "Unlimited resources, free flying and" + }, + { + "key": "block.minecraft.potted_dandelion", + "english_translation": "Potted Dandelion" + }, + { + "key": "options.chat.visibility.full", + "english_translation": "Shown" + }, + { + "key": "advancements.adventure.shoot_arrow.title", + "english_translation": "Take Aim" + }, + { + "key": "mco.configure.world.buttons.subscription", + "english_translation": "Subscription" + }, + { + "key": "subtitles.entity.parrot.imitate.creeper", + "english_translation": "Parrot hisses" + }, + { + "key": "advancements.adventure.adventuring_time.title", + "english_translation": "Adventuring Time" + }, + { + "key": "gui.abuseReport.reason.non_consensual_intimate_imagery", + "english_translation": "Non-consensual intimate imagery" + }, + { + "key": "commands.advancement.grant.many.to.many.failure", + "english_translation": "Couldn't grant %s advancements to %s players as they already have them" + }, + { + "key": "selectWorld.mapFeatures.info", + "english_translation": "Villages, Shipwrecks, etc." + }, + { + "key": "entity.minecraft.tropical_fish.type.snooper", + "english_translation": "Snooper" + }, + { + "key": "item.minecraft.firework_star.shape.small_ball", + "english_translation": "Small Ball" + }, + { + "key": "entity.minecraft.interaction", + "english_translation": "Interaction" + }, + { + "key": "item.minecraft.firework_star.light_blue", + "english_translation": "Light Blue" + }, + { + "key": "effect.minecraft.strength", + "english_translation": "Strength" + }, + { + "key": "block.minecraft.banner.stripe_downright.blue", + "english_translation": "Blue Bend" + }, + { + "key": "item.minecraft.tipped_arrow.effect.water_breathing", + "english_translation": "Arrow of Water Breathing" + }, + { + "key": "block.minecraft.lectern", + "english_translation": "Lectern" + }, + { + "key": "selectWorld.gameMode.creative.line2", + "english_translation": "destroy blocks instantly" + }, + { + "key": "selectWorld.allowCommands", + "english_translation": "Allow Cheats" + }, + { + "key": "advancements.nether.all_potions.title", + "english_translation": "A Furious Cocktail" + }, + { + "key": "painting.minecraft.fire.author", + "english_translation": "Mojang" + }, + { + "key": "block.minecraft.dead_fire_coral_fan", + "english_translation": "Dead Fire Coral Fan" + }, + { + "key": "subtitles.entity.pillager.hurt", + "english_translation": "Pillager hurts" + }, + { + "key": "parsing.long.expected", + "english_translation": "Expected long" + }, + { + "key": "item.minecraft.prize_pottery_shard", + "english_translation": "Prize Pottery Shard" + }, + { + "key": "options.mipmapLevels", + "english_translation": "Mipmap Levels" + }, + { + "key": "block.minecraft.banner.rhombus.purple", + "english_translation": "Purple Lozenge" + }, + { + "key": "createWorld.customize.custom.useStrongholds", + "english_translation": "Strongholds" + }, + { + "key": "block.minecraft.red_stained_glass_pane", + "english_translation": "Red Stained Glass Pane" + }, + { + "key": "commands.data.block.modified", + "english_translation": "Modified block data of %s, %s, %s" + }, + { + "key": "commands.bossbar.unknown", + "english_translation": "No bossbar exists with the ID '%s'" + }, + { + "key": "block.minecraft.smooth_sandstone_slab", + "english_translation": "Smooth Sandstone Slab" + }, + { + "key": "entity.minecraft.tropical_fish.predefined.0", + "english_translation": "Anemone" + }, + { + "key": "commands.advancement.grant.many.to.many.success", + "english_translation": "Granted %s advancements to %s players" + }, + { + "key": "subtitles.entity.fox.hurt", + "english_translation": "Fox hurts" + }, + { + "key": "advancements.adventure.trade.title", + "english_translation": "What a Deal!" + }, + { + "key": "block.minecraft.orange_banner", + "english_translation": "Orange Banner" + }, + { + "key": "entity.minecraft.tropical_fish.predefined.9", + "english_translation": "Goatfish" + }, + { + "key": "block.minecraft.stripped_oak_wood", + "english_translation": "Stripped Oak Wood" + }, + { + "key": "entity.minecraft.salmon", + "english_translation": "Salmon" + }, + { + "key": "stat.minecraft.interact_with_crafting_table", + "english_translation": "Interactions with Crafting Table" + }, + { + "key": "entity.minecraft.tropical_fish.predefined.3", + "english_translation": "Butterflyfish" + }, + { + "key": "entity.minecraft.tropical_fish.predefined.4", + "english_translation": "Cichlid" + }, + { + "key": "entity.minecraft.tropical_fish.predefined.1", + "english_translation": "Black Tang" + }, + { + "key": "entity.minecraft.tropical_fish.predefined.2", + "english_translation": "Blue Tang" + }, + { + "key": "entity.minecraft.tropical_fish.predefined.7", + "english_translation": "Dottyback" + }, + { + "key": "entity.minecraft.tropical_fish.predefined.8", + "english_translation": "Emperor Red Snapper" + }, + { + "key": "block.minecraft.mangrove_roots", + "english_translation": "Mangrove Roots" + }, + { + "key": "entity.minecraft.tropical_fish.predefined.5", + "english_translation": "Clownfish" + }, + { + "key": "team.collision.pushOwnTeam", + "english_translation": "Push own team" + }, + { + "key": "entity.minecraft.tropical_fish.predefined.6", + "english_translation": "Cotton Candy Betta" + }, + { + "key": "multiplayer.disconnect.slow_login", + "english_translation": "Took too long to log in" + }, + { + "key": "block.minecraft.banner.stripe_top.yellow", + "english_translation": "Yellow Chief" + }, + { + "key": "block.minecraft.redstone_ore", + "english_translation": "Redstone Ore" + }, + { + "key": "subtitles.item.shovel.flatten", + "english_translation": "Shovel flattens" + }, + { + "key": "filled_map.scale", + "english_translation": "Scaling at 1:%s" + }, + { + "key": "block.minecraft.banner.stripe_left.red", + "english_translation": "Red Pale Dexter" + }, + { + "key": "commands.scoreboard.players.enable.failed", + "english_translation": "Nothing changed. That trigger is already enabled" + }, + { + "key": "block.minecraft.banner.stripe_downright.lime", + "english_translation": "Lime Bend" + }, + { + "key": "subtitles.block.frogspawn.hatch", + "english_translation": "Tadpole hatches" + }, + { + "key": "connect.failed", + "english_translation": "Failed to connect to the server" + }, + { + "key": "disconnect.disconnected", + "english_translation": "Disconnected by Server" + }, + { + "key": "block.minecraft.warped_hyphae", + "english_translation": "Warped Hyphae" + }, + { + "key": "enchantment.minecraft.knockback", + "english_translation": "Knockback" + }, + { + "key": "subtitles.entity.elder_guardian.flop", + "english_translation": "Elder Guardian flops" + }, + { + "key": "block.minecraft.dark_oak_fence_gate", + "english_translation": "Dark Oak Fence Gate" + }, + { + "key": "item.minecraft.splash_potion.effect.healing", + "english_translation": "Splash Potion of Healing" + }, + { + "key": "subtitles.entity.piglin.retreat", + "english_translation": "Piglin retreats" + }, + { + "key": "block.minecraft.torchflower", + "english_translation": "Torchflower" + }, + { + "key": "subtitles.entity.ravager.death", + "english_translation": "Ravager dies" + }, + { + "key": "subtitles.item.firecharge.use", + "english_translation": "Fireball whooshes" + }, + { + "key": "block.minecraft.warped_stairs", + "english_translation": "Warped Stairs" + }, + { + "key": "entity.minecraft.camel", + "english_translation": "Camel" + }, + { + "key": "item.minecraft.minecart", + "english_translation": "Minecart" + }, + { + "key": "advancements.adventure.kill_all_mobs.title", + "english_translation": "Monsters Hunted" + }, + { + "key": "optimizeWorld.stage.upgrading", + "english_translation": "Upgrading all chunks..." + }, + { + "key": "mco.backup.generate.world", + "english_translation": "Generate world" + }, + { + "key": "painting.minecraft.stage.title", + "english_translation": "The Stage Is Set" + }, + { + "key": "item.minecraft.jungle_boat", + "english_translation": "Jungle Boat" + }, + { + "key": "block.minecraft.waxed_oxidized_cut_copper", + "english_translation": "Waxed Oxidized Cut Copper" + }, + { + "key": "commands.banlist.none", + "english_translation": "There are no bans" + }, + { + "key": "tutorial.punch_tree.title", + "english_translation": "Destroy the tree" + }, + { + "key": "painting.minecraft.match.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "key.sprint", + "english_translation": "Sprint" + }, + { + "key": "subtitles.block.button.click", + "english_translation": "Button clicks" + }, + { + "key": "trim_material.minecraft.redstone", + "english_translation": "Redstone Material" + }, + { + "key": "subtitles.item.chorus_fruit.teleport", + "english_translation": "Player teleports" + }, + { + "key": "commands.scoreboard.players.remove.success.single", + "english_translation": "Removed %s from %s for %s (now %s)" + }, + { + "key": "item.minecraft.guardian_spawn_egg", + "english_translation": "Guardian Spawn Egg" + }, + { + "key": "lanServer.port.invalid.new", + "english_translation": "Not a valid port.\nLeave the edit box empty or enter a number between %s and %s." + }, + { + "key": "advancements.story.mine_stone.description", + "english_translation": "Mine Stone with your new Pickaxe" + }, + { + "key": "chat.disabled.missingProfileKey", + "english_translation": "Chat disabled due to missing profile public key. Please try reconnecting." + }, + { + "key": "painting.minecraft.pointer.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "block.minecraft.banner.base.white", + "english_translation": "Fully White Field" + }, + { + "key": "mco.configure.world.slot.tooltip", + "english_translation": "Switch to world" + }, + { + "key": "block.minecraft.banner.cross.black", + "english_translation": "Black Saltire" + }, + { + "key": "block.minecraft.banner.curly_border.purple", + "english_translation": "Purple Bordure Indented" + }, + { + "key": "block.minecraft.banner.diagonal_up_right.orange", + "english_translation": "Orange Per Bend Sinister Inverted" + }, + { + "key": "item.minecraft.clay_ball", + "english_translation": "Clay Ball" + }, + { + "key": "item.minecraft.rabbit_hide", + "english_translation": "Rabbit Hide" + }, + { + "key": "color.minecraft.black", + "english_translation": "Black" + }, + { + "key": "item.minecraft.netherite_leggings", + "english_translation": "Netherite Leggings" + }, + { + "key": "block.minecraft.banner.small_stripes.light_blue", + "english_translation": "Light Blue Paly" + }, + { + "key": "death.attack.dragonBreath.player", + "english_translation": "%1$s was roasted in dragon's breath by %2$s" + }, + { + "key": "advancements.adventure.two_birds_one_arrow.description", + "english_translation": "Kill two Phantoms with a piercing Arrow" + }, + { + "key": "jigsaw_block.joint.rollable", + "english_translation": "Rollable" + }, + { + "key": "subtitles.entity.cow.milk", + "english_translation": "Cow gets milked" + }, + { + "key": "block.minecraft.light_gray_wool", + "english_translation": "Light Gray Wool" + }, + { + "key": "advancements.nether.return_to_sender.title", + "english_translation": "Return to Sender" + }, + { + "key": "block.minecraft.lime_stained_glass", + "english_translation": "Lime Stained Glass" + }, + { + "key": "block.minecraft.banner.half_horizontal.pink", + "english_translation": "Pink Per Fess" + }, + { + "key": "item.minecraft.pufferfish_bucket", + "english_translation": "Bucket of Pufferfish" + }, + { + "key": "advancements.husbandry.complete_catalogue.description", + "english_translation": "Tame all Cat variants!" + }, + { + "key": "sleep.players_sleeping", + "english_translation": "%s/%s players sleeping" + }, + { + "key": "block.minecraft.banner.triangles_top.pink", + "english_translation": "Pink Chief Indented" + }, + { + "key": "block.minecraft.polished_blackstone", + "english_translation": "Polished Blackstone" + }, + { + "key": "subtitles.entity.vindicator.death", + "english_translation": "Vindicator dies" + }, + { + "key": "advancements.end.dragon_egg.description", + "english_translation": "Hold the Dragon Egg" + }, + { + "key": "debug.pause.help", + "english_translation": "F3 + Esc = Pause without pause menu (if pausing is possible)" + }, + { + "key": "spectatorMenu.teleport", + "english_translation": "Teleport to Player" + }, + { + "key": "commands.trigger.failed.invalid", + "english_translation": "You can only trigger objectives that are 'trigger' type" + }, + { + "key": "block.minecraft.banner.square_bottom_right.gray", + "english_translation": "Gray Base Sinister Canton" + }, + { + "key": "advancements.adventure.very_very_frightening.title", + "english_translation": "Very Very Frightening" + }, + { + "key": "item.minecraft.tnt_minecart", + "english_translation": "Minecart with TNT" + }, + { + "key": "argument.block.property.invalid", + "english_translation": "Block %s does not accept '%s' for %s property" + }, + { + "key": "selectWorld.versionWarning", + "english_translation": "This world was last played in version %s and loading it in this version could cause corruption!" + }, + { + "key": "death.attack.lava.player", + "english_translation": "%1$s tried to swim in lava to escape %2$s" + }, + { + "key": "subtitles.item.trident.hit", + "english_translation": "Trident stabs" + }, + { + "key": "key.keyboard.enter", + "english_translation": "Enter" + }, + { + "key": "advancements.story.enter_the_end.description", + "english_translation": "Enter the End Portal" + }, + { + "key": "advMode.notEnabled", + "english_translation": "Command blocks are not enabled on this server" + }, + { + "key": "book.pageIndicator", + "english_translation": "Page %1$s of %2$s" + }, + { + "key": "block.minecraft.purple_terracotta", + "english_translation": "Purple Terracotta" + }, + { + "key": "subtitles.entity.squid.hurt", + "english_translation": "Squid hurts" + }, + { + "key": "block.minecraft.banner.small_stripes.green", + "english_translation": "Green Paly" + }, + { + "key": "item.minecraft.redstone", + "english_translation": "Redstone Dust" + }, + { + "key": "advancements.adventure.trim_with_all_exclusive_armor_patterns.description", + "english_translation": "Apply these smithing templates at least once: Spire, Snout, Rib, Ward, Silence, Vex, Tide, Wayfinder" + }, + { + "key": "block.minecraft.crimson_wall_hanging_sign", + "english_translation": "Crimson Wall Hanging Sign" + }, + { + "key": "demo.help.fullWrapped", + "english_translation": "This demo will last 5 in-game days (about 1 hour and 40 minutes of real time). Check the advancements for hints! Have fun!" + }, + { + "key": "commands.perf.alreadyRunning", + "english_translation": "The performance profiler is already started" + }, + { + "key": "biome.minecraft.deep_dark", + "english_translation": "Deep Dark" + }, + { + "key": "block.minecraft.oak_sapling", + "english_translation": "Oak Sapling" + }, + { + "key": "commands.ride.mount.failure.wrong_dimension", + "english_translation": "Can't mount entity in different dimension" + }, + { + "key": "effect.minecraft.darkness", + "english_translation": "Darkness" + }, + { + "key": "key.loadToolbarActivator", + "english_translation": "Load Hotbar Activator" + }, + { + "key": "attribute.name.generic.armor", + "english_translation": "Armor" + }, + { + "key": "attribute.name.generic.follow_range", + "english_translation": "Mob Follow Range" + }, + { + "key": "argument.range.ints", + "english_translation": "Only whole numbers allowed, not decimals" + }, + { + "key": "options.title", + "english_translation": "Options" + }, + { + "key": "biome.minecraft.savanna", + "english_translation": "Savanna" + }, + { + "key": "block.minecraft.yellow_carpet", + "english_translation": "Yellow Carpet" + }, + { + "key": "block.minecraft.banner.stripe_center.cyan", + "english_translation": "Cyan Pale" + }, + { + "key": "subtitles.entity.warden.sonic_charge", + "english_translation": "Warden charges" + }, + { + "key": "commands.team.leave.success.multiple", + "english_translation": "Removed %s members from any team" + }, + { + "key": "createWorld.customize.custom.biomeScaleOffset", + "english_translation": "Biome Scale Offset" + }, + { + "key": "advancements.end.kill_dragon.description", + "english_translation": "Good luck" + }, + { + "key": "subtitles.entity.ender_eye.launch", + "english_translation": "Eye of Ender shoots" + }, + { + "key": "subtitles.entity.fox.eat", + "english_translation": "Fox eats" + }, + { + "key": "inventory.hotbarInfo", + "english_translation": "Save hotbar with %1$s+%2$s" + }, + { + "key": "painting.minecraft.void.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "block.minecraft.green_terracotta", + "english_translation": "Green Terracotta" + }, + { + "key": "options.prioritizeChunkUpdates.nearby.tooltip", + "english_translation": "Nearby chunks are always compiled immediately. This may impact game performance when blocks are placed or destroyed." + }, + { + "key": "subtitles.entity.warden.nearby_close", + "english_translation": "Warden approaches" + }, + { + "key": "block.minecraft.chorus_flower", + "english_translation": "Chorus Flower" + }, + { + "key": "item.minecraft.scute", + "english_translation": "Scute" + }, + { + "key": "mco.create.world", + "english_translation": "Create" + }, + { + "key": "subtitles.entity.camel.dash", + "english_translation": "Camel yeets" + }, + { + "key": "item.minecraft.popped_chorus_fruit", + "english_translation": "Popped Chorus Fruit" + }, + { + "key": "item.minecraft.lingering_potion.effect.swiftness", + "english_translation": "Lingering Potion of Swiftness" + }, + { + "key": "stat.minecraft.inspect_hopper", + "english_translation": "Hoppers Searched" + }, + { + "key": "block.minecraft.bubble_column", + "english_translation": "Bubble Column" + }, + { + "key": "jigsaw_block.joint_label", + "english_translation": "Joint Type:" + }, + { + "key": "addServer.resourcePack.prompt", + "english_translation": "Prompt" + }, + { + "key": "advancements.husbandry.tactical_fishing.title", + "english_translation": "Tactical Fishing" + }, + { + "key": "block.minecraft.waxed_weathered_cut_copper_slab", + "english_translation": "Waxed Weathered Cut Copper Slab" + }, + { + "key": "item.minecraft.brewer_pottery_sherd", + "english_translation": "Brewer Pottery Sherd" + }, + { + "key": "arguments.operation.div0", + "english_translation": "Cannot divide by zero" + }, + { + "key": "key.keyboard.f22", + "english_translation": "F22" + }, + { + "key": "mco.configure.world.status", + "english_translation": "Status" + }, + { + "key": "key.keyboard.f23", + "english_translation": "F23" + }, + { + "key": "key.keyboard.f20", + "english_translation": "F20" + }, + { + "key": "key.keyboard.f21", + "english_translation": "F21" + }, + { + "key": "block.minecraft.banner.mojang.purple", + "english_translation": "Purple Thing" + }, + { + "key": "advancements.adventure.summon_iron_golem.title", + "english_translation": "Hired Help" + }, + { + "key": "block.minecraft.banner.half_horizontal_bottom.gray", + "english_translation": "Gray Per Fess Inverted" + }, + { + "key": "commands.schedule.same_tick", + "english_translation": "Can't schedule for current tick" + }, + { + "key": "commands.spreadplayers.success.teams", + "english_translation": "Spread %s team(s) around %s, %s with an average distance of %s blocks apart" + }, + { + "key": "key.keyboard.f24", + "english_translation": "F24" + }, + { + "key": "subtitles.entity.allay.ambient_with_item", + "english_translation": "Allay seeks" + }, + { + "key": "key.keyboard.f25", + "english_translation": "F25" + }, + { + "key": "filled_map.locked", + "english_translation": "Locked" + }, + { + "key": "mco.connect.failed", + "english_translation": "Failed to connect to the realm" + }, + { + "key": "selectWorld.mapType", + "english_translation": "World Type" + }, + { + "key": "death.attack.outOfWorld.player", + "english_translation": "%1$s didn't want to live in the same world as %2$s" + }, + { + "key": "gui.narrate.slider", + "english_translation": "%s slider" + }, + { + "key": "selectWorld.access_failure", + "english_translation": "Failed to access world" + }, + { + "key": "multiplayer.downloadingTerrain", + "english_translation": "Loading terrain..." + }, + { + "key": "block.minecraft.banner.small_stripes.red", + "english_translation": "Red Paly" + }, + { + "key": "block.minecraft.deepslate_redstone_ore", + "english_translation": "Deepslate Redstone Ore" + }, + { + "key": "argument.rotation.incomplete", + "english_translation": "Incomplete (expected 2 coordinates)" + }, + { + "key": "gamerule.category.spawning", + "english_translation": "Spawning" + }, + { + "key": "subtitles.entity.witch.throw", + "english_translation": "Witch throws" + }, + { + "key": "block.minecraft.tall_seagrass", + "english_translation": "Tall Seagrass" + }, + { + "key": "createWorld.customize.custom.useDungeons", + "english_translation": "Dungeons" + }, + { + "key": "painting.minecraft.fire.title", + "english_translation": "Fire" + }, + { + "key": "commands.clone.failed", + "english_translation": "No blocks were cloned" + }, + { + "key": "item.minecraft.axolotl_bucket", + "english_translation": "Bucket of Axolotl" + }, + { + "key": "block.minecraft.banner.stripe_right.red", + "english_translation": "Red Pale Sinister" + }, + { + "key": "subtitles.item.trident.hit_ground", + "english_translation": "Trident vibrates" + }, + { + "key": "advMode.setCommand", + "english_translation": "Set Console Command for Block" + }, + { + "key": "block.minecraft.mangrove_pressure_plate", + "english_translation": "Mangrove Pressure Plate" + }, + { + "key": "commands.save.alreadyOff", + "english_translation": "Saving is already turned off" + }, + { + "key": "item.minecraft.melon_seeds", + "english_translation": "Melon Seeds" + }, + { + "key": "commands.whitelist.list", + "english_translation": "There are %s whitelisted player(s): %s" + }, + { + "key": "block.minecraft.white_glazed_terracotta", + "english_translation": "White Glazed Terracotta" + }, + { + "key": "multiplayer.disconnect.incompatible", + "english_translation": "Incompatible client! Please use %s" + }, + { + "key": "subtitles.entity.snow_golem.hurt", + "english_translation": "Snow Golem hurts" + }, + { + "key": "block.minecraft.nether_bricks", + "english_translation": "Nether Bricks" + }, + { + "key": "subtitles.entity.piglin.angry", + "english_translation": "Piglin snorts angrily" + }, + { + "key": "block.minecraft.banner.diagonal_right.yellow", + "english_translation": "Yellow Per Bend" + }, + { + "key": "key.keyboard.f11", + "english_translation": "F11" + }, + { + "key": "key.keyboard.f12", + "english_translation": "F12" + }, + { + "key": "key.keyboard.f10", + "english_translation": "F10" + }, + { + "key": "options.accessibility.text_background", + "english_translation": "Text Background" + }, + { + "key": "item.minecraft.rabbit", + "english_translation": "Raw Rabbit" + }, + { + "key": "block.minecraft.mushroom_stem", + "english_translation": "Mushroom Stem" + }, + { + "key": "painting.minecraft.bomb.title", + "english_translation": "Target Successfully Bombed" + }, + { + "key": "item.minecraft.tipped_arrow.effect.weakness", + "english_translation": "Arrow of Weakness" + }, + { + "key": "block.minecraft.light_blue_glazed_terracotta", + "english_translation": "Light Blue Glazed Terracotta" + }, + { + "key": "commands.place.feature.success", + "english_translation": "Placed \"%s\" at %s, %s, %s" + }, + { + "key": "advancements.nether.use_lodestone.description", + "english_translation": "Use a Compass on a Lodestone" + }, + { + "key": "block.minecraft.crying_obsidian", + "english_translation": "Crying Obsidian" + }, + { + "key": "options.allowServerListing", + "english_translation": "Allow Server Listings" + }, + { + "key": "key.keyboard.f15", + "english_translation": "F15" + }, + { + "key": "item.minecraft.music_disc_mellohi.desc", + "english_translation": "C418 - mellohi" + }, + { + "key": "key.keyboard.f16", + "english_translation": "F16" + }, + { + "key": "key.keyboard.f13", + "english_translation": "F13" + }, + { + "key": "key.keyboard.f14", + "english_translation": "F14" + }, + { + "key": "key.keyboard.f19", + "english_translation": "F19" + }, + { + "key": "key.keyboard.f17", + "english_translation": "F17" + }, + { + "key": "options.autoSuggestCommands", + "english_translation": "Command Suggestions" + }, + { + "key": "key.keyboard.f18", + "english_translation": "F18" + }, + { + "key": "item.minecraft.creeper_banner_pattern", + "english_translation": "Banner Pattern" + }, + { + "key": "painting.minecraft.skull_and_roses.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "block.minecraft.polished_blackstone_brick_slab", + "english_translation": "Polished Blackstone Brick Slab" + }, + { + "key": "commands.playsound.success.multiple", + "english_translation": "Played sound %s to %s players" + }, + { + "key": "advancements.nether.fast_travel.description", + "english_translation": "Use the Nether to travel 7 km in the Overworld" + }, + { + "key": "subtitles.item.trident.return", + "english_translation": "Trident returns" + }, + { + "key": "block.minecraft.deepslate_diamond_ore", + "english_translation": "Deepslate Diamond Ore" + }, + { + "key": "book.editTitle", + "english_translation": "Enter Book Title:" + }, + { + "key": "subtitles.entity.mule.chest", + "english_translation": "Mule Chest equips" + }, + { + "key": "pack.source.fabricmod", + "english_translation": "Fabric mod" + }, + { + "key": "block.minecraft.waxed_oxidized_cut_copper_stairs", + "english_translation": "Waxed Oxidized Cut Copper Stairs" + }, + { + "key": "mco.template.button.select", + "english_translation": "Select" + }, + { + "key": "selectWorld.edit", + "english_translation": "Edit" + }, + { + "key": "death.attack.sonic_boom.item", + "english_translation": "%1$s was obliterated by a sonically-charged shriek whilst trying to escape %2$s wielding %3$s" + }, + { + "key": "block.minecraft.banner.stripe_top.white", + "english_translation": "White Chief" + }, + { + "key": "subtitles.entity.drowned.swim", + "english_translation": "Drowned swims" + }, + { + "key": "commands.title.show.title.multiple", + "english_translation": "Showing new title for %s players" + }, + { + "key": "block.minecraft.banner.creeper.light_blue", + "english_translation": "Light Blue Creeper Charge" + }, + { + "key": "commands.damage.invulnerable", + "english_translation": "Target is invulnerable to the given damage type" + }, + { + "key": "item.minecraft.zombie_horse_spawn_egg", + "english_translation": "Zombie Horse Spawn Egg" + }, + { + "key": "telemetry.event.world_unloaded.title", + "english_translation": "World Unloaded" + }, + { + "key": "gui.abuseReport.reason.harassment_or_bullying", + "english_translation": "Harassment or bullying" + }, + { + "key": "commands.spawnpoint.success.multiple", + "english_translation": "Set spawn point to %s, %s, %s [%s] in %s for %s players" + }, + { + "key": "mco.configure.world.subscription.remaining.months", + "english_translation": "%1$s month(s)" + }, + { + "key": "commands.bossbar.set.color.success", + "english_translation": "Custom bossbar %s has changed color" + }, + { + "key": "biome.minecraft.desert", + "english_translation": "Desert" + }, + { + "key": "commands.item.target.no_changes", + "english_translation": "No targets accepted item into slot %s" + }, + { + "key": "mco.gui.ok", + "english_translation": "Ok" + }, + { + "key": "pack.source.builtinMod", + "english_translation": "built-in: %s" + }, + { + "key": "item.minecraft.spider_eye", + "english_translation": "Spider Eye" + }, + { + "key": "stat.minecraft.treasure_fished", + "english_translation": "Treasure Fished" + }, + { + "key": "commands.clone.toobig", + "english_translation": "Too many blocks in the specified area (maximum %s, specified %s)" + }, + { + "key": "block.minecraft.stripped_warped_stem", + "english_translation": "Stripped Warped Stem" + }, + { + "key": "item.minecraft.glow_squid_spawn_egg", + "english_translation": "Glow Squid Spawn Egg" + }, + { + "key": "item.minecraft.smithing_template", + "english_translation": "Smithing Template" + }, + { + "key": "block.minecraft.black_concrete_powder", + "english_translation": "Black Concrete Powder" + }, + { + "key": "block.minecraft.banner.diagonal_up_left.blue", + "english_translation": "Blue Per Bend Inverted" + }, + { + "key": "difficulty.lock.title", + "english_translation": "Lock World Difficulty" + }, + { + "key": "options.difficulty.online", + "english_translation": "Server Difficulty" + }, + { + "key": "argument.color.invalid", + "english_translation": "Unknown color '%s'" + }, + { + "key": "menu.game", + "english_translation": "Game Menu" + }, + { + "key": "block.minecraft.banner.stripe_center.white", + "english_translation": "White Pale" + }, + { + "key": "entity.minecraft.villager.shepherd", + "english_translation": "Shepherd" + }, + { + "key": "block.minecraft.obsidian", + "english_translation": "Obsidian" + }, + { + "key": "attribute.name.horse.jump_strength", + "english_translation": "Horse Jump Strength" + }, + { + "key": "item.minecraft.evoker_spawn_egg", + "english_translation": "Evoker Spawn Egg" + }, + { + "key": "title.32bit.deprecation", + "english_translation": "32-bit system detected: this may prevent you from playing in the future as a 64-bit system will be required!" + }, + { + "key": "resourcePack.title", + "english_translation": "Select Resource Packs" + }, + { + "key": "block.minecraft.beehive", + "english_translation": "Beehive" + }, + { + "key": "item.minecraft.diamond_boots", + "english_translation": "Diamond Boots" + }, + { + "key": "key.keyboard.print.screen", + "english_translation": "Print Screen" + }, + { + "key": "item.minecraft.acacia_boat", + "english_translation": "Acacia Boat" + }, + { + "key": "entity.minecraft.vindicator", + "english_translation": "Vindicator" + }, + { + "key": "tutorial.find_tree.description", + "english_translation": "Punch it to collect wood" + }, + { + "key": "mco.template.select.none", + "english_translation": "Oops, it looks like this content category is currently empty.\nPlease check back later for new content, or if you're a creator,\n%s." + }, + { + "key": "effect.minecraft.saturation", + "english_translation": "Saturation" + }, + { + "key": "commands.effect.clear.everything.success.single", + "english_translation": "Removed every effect from %s" + }, + { + "key": "block.minecraft.orange_terracotta", + "english_translation": "Orange Terracotta" + }, + { + "key": "multiplayer.status.online", + "english_translation": "Online" + }, + { + "key": "subtitles.entity.sniffer.step", + "english_translation": "Sniffer steps" + }, + { + "key": "argument.resource_tag.invalid_type", + "english_translation": "Tag '%s' has wrong type '%s' (expected '%s')" + }, + { + "key": "mco.template.name", + "english_translation": "Template" + }, + { + "key": "subtitles.block.chest.locked", + "english_translation": "Chest locked" + }, + { + "key": "item.minecraft.mourner_pottery_shard", + "english_translation": "Mourner Pottery Shard" + }, + { + "key": "potion.whenDrank", + "english_translation": "When Applied:" + }, + { + "key": "block.minecraft.warped_wall_hanging_sign", + "english_translation": "Warped Wall Hanging Sign" + }, + { + "key": "subtitles.entity.ghast.hurt", + "english_translation": "Ghast hurts" + }, + { + "key": "block.minecraft.verdant_froglight", + "english_translation": "Verdant Froglight" + }, + { + "key": "advancements.adventure.sleep_in_bed.title", + "english_translation": "Sweet Dreams" + }, + { + "key": "subtitles.block.conduit.deactivate", + "english_translation": "Conduit deactivates" + }, + { + "key": "block.minecraft.bamboo_mosaic", + "english_translation": "Bamboo Mosaic" + }, + { + "key": "block.minecraft.kelp_plant", + "english_translation": "Kelp Plant" + }, + { + "key": "controls.keybinds", + "english_translation": "Key Binds..." + }, + { + "key": "key.keyboard.right.control", + "english_translation": "Right Control" + }, + { + "key": "tutorial.look.title", + "english_translation": "Look around" + }, + { + "key": "block.minecraft.orange_stained_glass", + "english_translation": "Orange Stained Glass" + }, + { + "key": "advancements.adventure.craft_decorated_pot_using_only_sherds.description", + "english_translation": "Make a Decorated Pot out of 4 Pottery Sherds" + }, + { + "key": "block.minecraft.attached_pumpkin_stem", + "english_translation": "Attached Pumpkin Stem" + }, + { + "key": "options.accessibility.panorama_speed", + "english_translation": "Panorama Scroll Speed" + }, + { + "key": "block.minecraft.banner.diagonal_up_left.lime", + "english_translation": "Lime Per Bend Inverted" + }, + { + "key": "advMode.randomPlayer", + "english_translation": "Use \"@r\" to target random player" + }, + { + "key": "block.minecraft.acacia_sign", + "english_translation": "Acacia Sign" + }, + { + "key": "subtitles.entity.player.attack.weak", + "english_translation": "Weak attack" + }, + { + "key": "item.minecraft.splash_potion.effect.invisibility", + "english_translation": "Splash Potion of Invisibility" + }, + { + "key": "block.minecraft.soul_torch", + "english_translation": "Soul Torch" + }, + { + "key": "enchantment.minecraft.punch", + "english_translation": "Punch" + }, + { + "key": "key.keyboard.page.down", + "english_translation": "Page Down" + }, + { + "key": "subtitles.entity.puffer_fish.death", + "english_translation": "Pufferfish dies" + }, + { + "key": "block.minecraft.cherry_sign", + "english_translation": "Cherry Sign" + }, + { + "key": "death.fell.accident.ladder", + "english_translation": "%1$s fell off a ladder" + }, + { + "key": "mco.backup.button.reset", + "english_translation": "Reset world" + }, + { + "key": "mco.selectServer.expiredSubscribe", + "english_translation": "Subscribe" + }, + { + "key": "block.minecraft.red_concrete", + "english_translation": "Red Concrete" + }, + { + "key": "debug.chunk_boundaries.off", + "english_translation": "Chunk borders: hidden" + }, + { + "key": "gamerule.commandModificationBlockLimit", + "english_translation": "Command Modification Block Limit" + }, + { + "key": "gui.banned.reason.imminent_harm_to_person_or_property", + "english_translation": "Intent to cause real-life harm to persons or property" + }, + { + "key": "block.minecraft.cactus", + "english_translation": "Cactus" + }, + { + "key": "chat.type.team.hover", + "english_translation": "Message Team" + }, + { + "key": "block.minecraft.dark_oak_wall_sign", + "english_translation": "Dark Oak Wall Sign" + }, + { + "key": "container.upgrade.error_tooltip", + "english_translation": "Item can't be upgraded this way" + }, + { + "key": "subtitles.entity.glow_item_frame.break", + "english_translation": "Glow Item Frame breaks" + }, + { + "key": "block.minecraft.red_nether_brick_stairs", + "english_translation": "Red Nether Brick Stairs" + }, + { + "key": "block.minecraft.diamond_ore", + "english_translation": "Diamond Ore" + }, + { + "key": "commands.kick.success", + "english_translation": "Kicked %s: %s" + }, + { + "key": "key.keyboard.keypad.subtract", + "english_translation": "Keypad -" + }, + { + "key": "block.minecraft.potted_torchflower", + "english_translation": "Potted Torchflower" + }, + { + "key": "commands.forceload.toobig", + "english_translation": "Too many chunks in the specified area (maximum %s, specified %s)" + }, + { + "key": "item.minecraft.leather", + "english_translation": "Leather" + }, + { + "key": "key.categories.inventory", + "english_translation": "Inventory" + }, + { + "key": "painting.minecraft.pool.title", + "english_translation": "The Pool" + }, + { + "key": "multiplayer.disconnect.duplicate_login", + "english_translation": "You logged in from another location" + }, + { + "key": "createWorld.customize.custom.presets", + "english_translation": "Presets" + }, + { + "key": "options.particles.decreased", + "english_translation": "Decreased" + }, + { + "key": "block.minecraft.banner.stripe_left.orange", + "english_translation": "Orange Pale Dexter" + }, + { + "key": "optimizeWorld.confirm.title", + "english_translation": "Optimize World" + }, + { + "key": "merchant.level.4", + "english_translation": "Expert" + }, + { + "key": "merchant.level.5", + "english_translation": "Master" + }, + { + "key": "merchant.level.2", + "english_translation": "Apprentice" + }, + { + "key": "merchant.level.3", + "english_translation": "Journeyman" + }, + { + "key": "block.minecraft.banner.stripe_middle.lime", + "english_translation": "Lime Fess" + }, + { + "key": "merchant.level.1", + "english_translation": "Novice" + }, + { + "key": "commands.item.target.not_a_container", + "english_translation": "Target position %s, %s, %s is not a container" + }, + { + "key": "block.minecraft.warped_fungus", + "english_translation": "Warped Fungus" + }, + { + "key": "deathScreen.spectate", + "english_translation": "Spectate World" + }, + { + "key": "item.minecraft.firework_star.shape.creeper", + "english_translation": "Creeper-shaped" + }, + { + "key": "block.minecraft.birch_log", + "english_translation": "Birch Log" + }, + { + "key": "predicate.unknown", + "english_translation": "Unknown predicate: %s" + }, + { + "key": "block.minecraft.waxed_oxidized_cut_copper_slab", + "english_translation": "Waxed Oxidized Cut Copper Slab" + }, + { + "key": "advancements.adventure.whos_the_pillager_now.title", + "english_translation": "Who's the Pillager Now?" + }, + { + "key": "subtitles.block.sculk_shrieker.shriek", + "english_translation": "Sculk Shrieker shrieks" + }, + { + "key": "block.minecraft.diorite", + "english_translation": "Diorite" + }, + { + "key": "subtitles.entity.glow_squid.death", + "english_translation": "Glow Squid dies" + }, + { + "key": "mco.minigame.world.changeButton", + "english_translation": "Select another minigame" + }, + { + "key": "debug.clear_chat.help", + "english_translation": "F3 + D = Clear chat" + }, + { + "key": "item.minecraft.parrot_spawn_egg", + "english_translation": "Parrot Spawn Egg" + }, + { + "key": "options.fullscreen.current", + "english_translation": "Current" + }, + { + "key": "stat.minecraft.junk_fished", + "english_translation": "Junk Fished" + }, + { + "key": "subtitles.entity.skeleton.ambient", + "english_translation": "Skeleton rattles" + }, + { + "key": "commands.whitelist.none", + "english_translation": "There are no whitelisted players" + }, + { + "key": "block.minecraft.banner.base.orange", + "english_translation": "Fully Orange Field" + }, + { + "key": "selectWorld.backupWarning.customized", + "english_translation": "Unfortunately, we do not support customized worlds in this version of Minecraft. We can still load this world and keep everything the way it was, but any newly generated terrain will no longer be customized. We're sorry for the inconvenience!" + }, + { + "key": "trim_pattern.minecraft.dune", + "english_translation": "Dune Armor Trim" + }, + { + "key": "advancements.story.mine_stone.title", + "english_translation": "Stone Age" + }, + { + "key": "advancements.husbandry.allay_deliver_item_to_player.title", + "english_translation": "You've Got a Friend in Me" + }, + { + "key": "mco.upload.cancelled", + "english_translation": "Upload cancelled" + }, + { + "key": "entity.minecraft.tropical_fish.type.kob", + "english_translation": "Kob" + }, + { + "key": "block.minecraft.composter", + "english_translation": "Composter" + }, + { + "key": "death.attack.onFire", + "english_translation": "%1$s burned to death" + }, + { + "key": "item.minecraft.iron_shovel", + "english_translation": "Iron Shovel" + }, + { + "key": "block.minecraft.stripped_warped_hyphae", + "english_translation": "Stripped Warped Hyphae" + }, + { + "key": "chat.copy.click", + "english_translation": "Click to Copy to Clipboard" + }, + { + "key": "item.minecraft.wooden_hoe", + "english_translation": "Wooden Hoe" + }, + { + "key": "enchantment.minecraft.blast_protection", + "english_translation": "Blast Protection" + }, + { + "key": "entity.minecraft.squid", + "english_translation": "Squid" + }, + { + "key": "container.enchant.level.many", + "english_translation": "%s Enchantment Levels" + }, + { + "key": "item.minecraft.smithing_template.armor_trim.base_slot_description", + "english_translation": "Add a piece of armor" + }, + { + "key": "item.minecraft.lingering_potion.effect.strength", + "english_translation": "Lingering Potion of Strength" + }, + { + "key": "advancements.nether.distract_piglin.description", + "english_translation": "Distract Piglins with gold" + }, + { + "key": "block.minecraft.banner.diagonal_left.orange", + "english_translation": "Orange Per Bend Sinister" + }, + { + "key": "narration.slider.usage.focused", + "english_translation": "Press left or right keyboard buttons to change value" + }, + { + "key": "commands.team.add.duplicate", + "english_translation": "A team already exists by that name" + }, + { + "key": "mco.configure.world.spawn_toggle.message.npc", + "english_translation": "Turning this option off will REMOVE ALL existing entities of that type, like Villagers" + }, + { + "key": "commands.scoreboard.players.reset.all.single", + "english_translation": "Reset all scores for %s" + }, + { + "key": "multiplayer.disconnect.banned_ip.expiration", + "english_translation": "\nYour ban will be removed on %s" + }, + { + "key": "structure_block.button.load", + "english_translation": "LOAD" + }, + { + "key": "block.minecraft.bubble_coral", + "english_translation": "Bubble Coral" + }, + { + "key": "commands.banip.success", + "english_translation": "Banned IP %s: %s" + }, + { + "key": "item.minecraft.tipped_arrow.effect.invisibility", + "english_translation": "Arrow of Invisibility" + }, + { + "key": "subtitles.item.lodestone_compass.lock", + "english_translation": "Lodestone Compass locks onto Lodestone" + }, + { + "key": "biome.minecraft.jungle", + "english_translation": "Jungle" + }, + { + "key": "item.minecraft.glow_ink_sac", + "english_translation": "Glow Ink Sac" + }, + { + "key": "entity.minecraft.piglin", + "english_translation": "Piglin" + }, + { + "key": "block.minecraft.banner.stripe_top.green", + "english_translation": "Green Chief" + }, + { + "key": "item.minecraft.lingering_potion.effect.poison", + "english_translation": "Lingering Potion of Poison" + }, + { + "key": "block.minecraft.banner.base.lime", + "english_translation": "Fully Lime Field" + }, + { + "key": "selectWorld.createDemo", + "english_translation": "Play New Demo World" + }, + { + "key": "subtitles.entity.mule.eat", + "english_translation": "Mule eats" + }, + { + "key": "gui.recipebook.toggleRecipes.craftable", + "english_translation": "Showing Craftable" + }, + { + "key": "stat.minecraft.pot_flower", + "english_translation": "Plants Potted" + }, + { + "key": "block.minecraft.banner.square_bottom_right.light_blue", + "english_translation": "Light Blue Base Sinister Canton" + }, + { + "key": "block.minecraft.banner.triangle_top.pink", + "english_translation": "Pink Inverted Chevron" + }, + { + "key": "item.minecraft.iron_leggings", + "english_translation": "Iron Leggings" + }, + { + "key": "block.minecraft.light_blue_shulker_box", + "english_translation": "Light Blue Shulker Box" + }, + { + "key": "block.minecraft.yellow_shulker_box", + "english_translation": "Yellow Shulker Box" + }, + { + "key": "options.graphics.fast.tooltip", + "english_translation": "Fast graphics reduces the amount of visible rain and snow.\nTransparency effects are disabled for various blocks such as leaves." + }, + { + "key": "itemGroup.combat", + "english_translation": "Combat" + }, + { + "key": "chat.square_brackets", + "english_translation": "[%s]" + }, + { + "key": "entity.minecraft.tropical_fish.type.betty", + "english_translation": "Betty" + }, + { + "key": "block.minecraft.deepslate_brick_stairs", + "english_translation": "Deepslate Brick Stairs" + }, + { + "key": "item.minecraft.potion.effect.night_vision", + "english_translation": "Potion of Night Vision" + }, + { + "key": "mco.configure.world.edit.subscreen.experience", + "english_translation": "Some settings are disabled since your current world is an experience" + }, + { + "key": "selectServer.deleteQuestion", + "english_translation": "Are you sure you want to remove this server?" + }, + { + "key": "mco.configure.world.resourcepack.question.line1", + "english_translation": "You need a custom resource pack to play on this realm" + }, + { + "key": "mco.reset.world.resetting.screen.title", + "english_translation": "Resetting world..." + }, + { + "key": "mco.configure.world.resourcepack.question.line2", + "english_translation": "Do you want to download it and play?" + }, + { + "key": "advancements.adventure.root.title", + "english_translation": "Adventure" + }, + { + "key": "subtitles.entity.generic.explode", + "english_translation": "Explosion" + }, + { + "key": "multiplayer.disconnect.not_whitelisted", + "english_translation": "You are not white-listed on this server!" + }, + { + "key": "block.minecraft.banner.stripe_center.purple", + "english_translation": "Purple Pale" + }, + { + "key": "block.minecraft.chiseled_red_sandstone", + "english_translation": "Chiseled Red Sandstone" + }, + { + "key": "debug.gamemodes.error", + "english_translation": "Unable to open game mode switcher; no permission" + }, + { + "key": "commands.worldborder.set.immediate", + "english_translation": "Set the world border to %s block(s) wide" + }, + { + "key": "team.visibility.never", + "english_translation": "Never" + }, + { + "key": "subtitles.entity.glow_item_frame.place", + "english_translation": "Glow Item Frame placed" + }, + { + "key": "commands.locate.structure.invalid", + "english_translation": "There is no structure with type \"%s\"" + }, + { + "key": "painting.minecraft.skeleton.title", + "english_translation": "Mortal Coil" + }, + { + "key": "subtitles.entity.shulker.close", + "english_translation": "Shulker closes" + }, + { + "key": "block.minecraft.banner.half_horizontal_bottom.yellow", + "english_translation": "Yellow Per Fess Inverted" + }, + { + "key": "commands.title.show.subtitle.single", + "english_translation": "Showing new subtitle for %s" + }, + { + "key": "block.minecraft.banner.base.blue", + "english_translation": "Fully Blue Field" + }, + { + "key": "block.minecraft.banner.stripe_left.lime", + "english_translation": "Lime Pale Dexter" + }, + { + "key": "block.minecraft.banner.triangle_bottom.brown", + "english_translation": "Brown Chevron" + }, + { + "key": "stat_type.minecraft.killed_by.none", + "english_translation": "You have never been killed by %s" + }, + { + "key": "subtitles.block.bell.resonate", + "english_translation": "Bell resonates" + }, + { + "key": "block.minecraft.banner.half_vertical_right.orange", + "english_translation": "Orange Per Pale Inverted" + }, + { + "key": "block.minecraft.snow_block", + "english_translation": "Snow Block" + }, + { + "key": "structure_block.mode_info.load", + "english_translation": "Load Mode - Load from File" + }, + { + "key": "item.minecraft.end_crystal", + "english_translation": "End Crystal" + }, + { + "key": "subtitles.item.spyglass.stop_using", + "english_translation": "Spyglass retracts" + }, + { + "key": "container.cartography_table", + "english_translation": "Cartography Table" + }, + { + "key": "block.minecraft.purple_carpet", + "english_translation": "Purple Carpet" + }, + { + "key": "block.minecraft.lava", + "english_translation": "Lava" + }, + { + "key": "parsing.float.expected", + "english_translation": "Expected float" + }, + { + "key": "subtitles.entity.horse.eat", + "english_translation": "Horse eats" + }, + { + "key": "trim_material.minecraft.diamond", + "english_translation": "Diamond Material" + }, + { + "key": "debug.copy_location.message", + "english_translation": "Copied location to clipboard" + }, + { + "key": "block.minecraft.beetroots", + "english_translation": "Beetroots" + }, + { + "key": "telemetry.property.operating_system.title", + "english_translation": "Operating System" + }, + { + "key": "commands.data.modify.expected_list", + "english_translation": "Expected list, got: %s" + }, + { + "key": "entity.not_summonable", + "english_translation": "Can't summon entity of type %s" + }, + { + "key": "subtitles.entity.goat.milk", + "english_translation": "Goat gets milked" + }, + { + "key": "gui.socialInteractions.tab_blocked", + "english_translation": "Blocked" + }, + { + "key": "subtitles.entity.drowned.ambient_water", + "english_translation": "Drowned gurgles" + }, + { + "key": "block.minecraft.banner.triangles_bottom.gray", + "english_translation": "Gray Base Indented" + }, + { + "key": "subtitles.entity.potion.throw", + "english_translation": "Bottle thrown" + }, + { + "key": "commands.place.structure.invalid", + "english_translation": "There is no structure with type \"%s\"" + }, + { + "key": "block.minecraft.barrier", + "english_translation": "Barrier" + }, + { + "key": "item.minecraft.leather_boots", + "english_translation": "Leather Boots" + }, + { + "key": "block.minecraft.waxed_cut_copper_stairs", + "english_translation": "Waxed Cut Copper Stairs" + }, + { + "key": "mco.terms.sentence.2", + "english_translation": "Terms of Service" + }, + { + "key": "mco.terms.sentence.1", + "english_translation": "I agree to the Minecraft Realms" + }, + { + "key": "options.framerateLimit.max", + "english_translation": "Unlimited" + }, + { + "key": "block.minecraft.banner.half_horizontal_bottom.red", + "english_translation": "Red Per Fess Inverted" + }, + { + "key": "subtitles.block.honey_block.slide", + "english_translation": "Sliding down a honey block" + }, + { + "key": "block.minecraft.banner.border.purple", + "english_translation": "Purple Bordure" + }, + { + "key": "commands.worldborder.set.failed.nochange", + "english_translation": "Nothing changed. The world border is already that size" + }, + { + "key": "item.minecraft.powder_snow_bucket", + "english_translation": "Powder Snow Bucket" + }, + { + "key": "block.minecraft.suspicious_sand", + "english_translation": "Suspicious Sand" + }, + { + "key": "block.minecraft.banner.stripe_left.blue", + "english_translation": "Blue Pale Dexter" + }, + { + "key": "block.minecraft.blackstone", + "english_translation": "Blackstone" + }, + { + "key": "subtitles.entity.hoglin.ambient", + "english_translation": "Hoglin growls" + }, + { + "key": "block.minecraft.warped_wart_block", + "english_translation": "Warped Wart Block" + }, + { + "key": "itemGroup.crafting", + "english_translation": "Crafting" + }, + { + "key": "telemetry.event.world_unloaded.description", + "english_translation": "This event is paired with the World Loaded event to calculate how long the world session has lasted.\nThe duration (in seconds and ticks) is measured when a world session has ended (quitting to title, disconnecting from a server)." + }, + { + "key": "language.name", + "english_translation": "English" + }, + { + "key": "block.minecraft.banner.piglin.cyan", + "english_translation": "Cyan Snout" + }, + { + "key": "subtitles.entity.cod.hurt", + "english_translation": "Cod hurts" + }, + { + "key": "block.minecraft.banner.straight_cross.magenta", + "english_translation": "Magenta Cross" + }, + { + "key": "block.minecraft.tube_coral_wall_fan", + "english_translation": "Tube Coral Wall Fan" + }, + { + "key": "subtitles.block.water.ambient", + "english_translation": "Water flows" + }, + { + "key": "entity.minecraft.dragon_fireball", + "english_translation": "Dragon Fireball" + }, + { + "key": "block.minecraft.red_terracotta", + "english_translation": "Red Terracotta" + }, + { + "key": "block.minecraft.polished_blackstone_button", + "english_translation": "Polished Blackstone Button" + }, + { + "key": "entity.minecraft.tropical_fish.type.spotty", + "english_translation": "Spotty" + }, + { + "key": "block.minecraft.coal_block", + "english_translation": "Block of Coal" + }, + { + "key": "block.minecraft.banner.creeper.yellow", + "english_translation": "Yellow Creeper Charge" + }, + { + "key": "painting.minecraft.wasteland.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "subtitles.entity.llama.step", + "english_translation": "Llama steps" + }, + { + "key": "createWorld.customize.custom.useVillages", + "english_translation": "Villages" + }, + { + "key": "death.attack.trident.item", + "english_translation": "%1$s was impaled by %2$s with %3$s" + }, + { + "key": "block.minecraft.banner.stripe_center.light_blue", + "english_translation": "Light Blue Pale" + }, + { + "key": "commands.tag.list.single.empty", + "english_translation": "%s has no tags" + }, + { + "key": "subtitles.entity.piglin.hurt", + "english_translation": "Piglin hurts" + }, + { + "key": "entity.minecraft.axolotl", + "english_translation": "Axolotl" + }, + { + "key": "item.minecraft.raw_gold", + "english_translation": "Raw Gold" + }, + { + "key": "block.minecraft.white_wool", + "english_translation": "White Wool" + }, + { + "key": "block.minecraft.dark_oak_fence", + "english_translation": "Dark Oak Fence" + }, + { + "key": "commands.fill.toobig", + "english_translation": "Too many blocks in the specified area (maximum %s, specified %s)" + }, + { + "key": "multiplayer.disconnect.banned", + "english_translation": "You are banned from this server" + }, + { + "key": "item.minecraft.potion.effect.harming", + "english_translation": "Potion of Harming" + }, + { + "key": "item.minecraft.cookie", + "english_translation": "Cookie" + }, + { + "key": "block.minecraft.banner.square_bottom_right.blue", + "english_translation": "Blue Base Sinister Canton" + }, + { + "key": "block.minecraft.banner.square_top_right.blue", + "english_translation": "Blue Chief Sinister Canton" + }, + { + "key": "createWorld.customize.custom.biomeSize", + "english_translation": "Biome Size" + }, + { + "key": "item.minecraft.leather_leggings", + "english_translation": "Leather Pants" + }, + { + "key": "mco.configure.world.buttons.settings", + "english_translation": "Settings" + }, + { + "key": "block.minecraft.dried_kelp_block", + "english_translation": "Dried Kelp Block" + }, + { + "key": "mco.configure.world.buttons.resetworld", + "english_translation": "Reset world" + }, + { + "key": "block.minecraft.sunflower", + "english_translation": "Sunflower" + }, + { + "key": "block.minecraft.banner.square_bottom_right.black", + "english_translation": "Black Base Sinister Canton" + }, + { + "key": "block.minecraft.redstone_wire", + "english_translation": "Redstone Wire" + }, + { + "key": "item.minecraft.blade_pottery_sherd", + "english_translation": "Blade Pottery Sherd" + }, + { + "key": "block.minecraft.banner.triangles_bottom.black", + "english_translation": "Black Base Indented" + }, + { + "key": "advancements.husbandry.safely_harvest_honey.description", + "english_translation": "Use a Campfire to collect Honey from a Beehive using a Glass Bottle without aggravating the Bees" + }, + { + "key": "menu.returnToMenu", + "english_translation": "Save and Quit to Title" + }, + { + "key": "commands.function.success.multiple.result", + "english_translation": "Executed %s functions" + }, + { + "key": "block.minecraft.banner.creeper.lime", + "english_translation": "Lime Creeper Charge" + }, + { + "key": "options.prioritizeChunkUpdates", + "english_translation": "Chunk Builder" + }, + { + "key": "item.minecraft.potion.effect.water", + "english_translation": "Water Bottle" + }, + { + "key": "item.minecraft.snow_golem_spawn_egg", + "english_translation": "Snow Golem Spawn Egg" + }, + { + "key": "block.minecraft.bamboo_wall_hanging_sign", + "english_translation": "Bamboo Wall Hanging Sign" + }, + { + "key": "book.signButton", + "english_translation": "Sign" + }, + { + "key": "telemetry.property.event_timestamp_utc.title", + "english_translation": "Event Timestamp (UTC)" + }, + { + "key": "subtitles.entity.zombie.hurt", + "english_translation": "Zombie hurts" + }, + { + "key": "subtitles.block.respawn_anchor.set_spawn", + "english_translation": "Respawn Anchor sets spawn" + }, + { + "key": "biome.minecraft.frozen_river", + "english_translation": "Frozen River" + }, + { + "key": "item.minecraft.tipped_arrow.effect.regeneration", + "english_translation": "Arrow of Regeneration" + }, + { + "key": "subtitles.entity.firework_rocket.launch", + "english_translation": "Firework launches" + }, + { + "key": "translation.test.invalid", + "english_translation": "hi %" + }, + { + "key": "item.minecraft.endermite_spawn_egg", + "english_translation": "Endermite Spawn Egg" + }, + { + "key": "subtitles.entity.shulker.hurt", + "english_translation": "Shulker hurts" + }, + { + "key": "block.minecraft.jungle_leaves", + "english_translation": "Jungle Leaves" + }, + { + "key": "subtitles.entity.bee.loop_aggressive", + "english_translation": "Bee buzzes angrily" + }, + { + "key": "createWorld.customize.custom.preset.caveDelight", + "english_translation": "Caver's Delight" + }, + { + "key": "painting.minecraft.kebab.title", + "english_translation": "Kebab med tre pepperoni" + }, + { + "key": "gamerule.category.mobs", + "english_translation": "Mobs" + }, + { + "key": "recipe.toast.title", + "english_translation": "New Recipes Unlocked!" + }, + { + "key": "createWorld.preparing", + "english_translation": "Preparing for world creation..." + }, + { + "key": "block.minecraft.horn_coral_block", + "english_translation": "Horn Coral Block" + }, + { + "key": "key.sneak", + "english_translation": "Sneak" + }, + { + "key": "options.ao", + "english_translation": "Smooth Lighting" + }, + { + "key": "advancements.story.enter_the_nether.description", + "english_translation": "Build, light and enter a Nether Portal" + }, + { + "key": "block.minecraft.banner.square_bottom_right.lime", + "english_translation": "Lime Base Sinister Canton" + }, + { + "key": "block.minecraft.banner.triangle_top.orange", + "english_translation": "Orange Inverted Chevron" + }, + { + "key": "options.modelPart.left_sleeve", + "english_translation": "Left Sleeve" + }, + { + "key": "key.keyboard.right.win", + "english_translation": "Right Win" + }, + { + "key": "block.minecraft.mossy_stone_bricks", + "english_translation": "Mossy Stone Bricks" + }, + { + "key": "options.modelPart.hat", + "english_translation": "Hat" + }, + { + "key": "subtitles.ui.cartography_table.take_result", + "english_translation": "Map drawn" + }, + { + "key": "gameMode.hardcore", + "english_translation": "Hardcore Mode!" + }, + { + "key": "selectWorld.backupJoinSkipButton", + "english_translation": "I know what I'm doing!" + }, + { + "key": "item.minecraft.iron_boots", + "english_translation": "Iron Boots" + }, + { + "key": "narrator.button.difficulty_lock", + "english_translation": "Difficulty lock" + }, + { + "key": "block.minecraft.mossy_stone_brick_wall", + "english_translation": "Mossy Stone Brick Wall" + }, + { + "key": "gui.minutes", + "english_translation": "%s minute(s)" + }, + { + "key": "options.chat.visibility.hidden", + "english_translation": "Hidden" + }, + { + "key": "block.minecraft.banner.small_stripes.white", + "english_translation": "White Paly" + }, + { + "key": "block.minecraft.white_terracotta", + "english_translation": "White Terracotta" + }, + { + "key": "item.minecraft.flower_pot", + "english_translation": "Flower Pot" + }, + { + "key": "block.minecraft.potted_oxeye_daisy", + "english_translation": "Potted Oxeye Daisy" + }, + { + "key": "selectWorld.gameMode.spectator.line2", + "english_translation": "" + }, + { + "key": "selectWorld.gameMode.spectator.line1", + "english_translation": "You can look but don't touch" + }, + { + "key": "block.minecraft.banner.creeper.blue", + "english_translation": "Blue Creeper Charge" + }, + { + "key": "pack.name.fabricMod", + "english_translation": "Fabric Mod \"%s\"" + }, + { + "key": "key.hotbar.8", + "english_translation": "Hotbar Slot 8" + }, + { + "key": "commands.publish.success", + "english_translation": "Multiplayer game is now hosted on port %s" + }, + { + "key": "key.hotbar.7", + "english_translation": "Hotbar Slot 7" + }, + { + "key": "key.hotbar.6", + "english_translation": "Hotbar Slot 6" + }, + { + "key": "key.hotbar.5", + "english_translation": "Hotbar Slot 5" + }, + { + "key": "subtitles.entity.evoker.cast_spell", + "english_translation": "Evoker casts spell" + }, + { + "key": "key.hotbar.4", + "english_translation": "Hotbar Slot 4" + }, + { + "key": "key.hotbar.3", + "english_translation": "Hotbar Slot 3" + }, + { + "key": "key.hotbar.2", + "english_translation": "Hotbar Slot 2" + }, + { + "key": "key.hotbar.1", + "english_translation": "Hotbar Slot 1" + }, + { + "key": "mco.configure.world.backup", + "english_translation": "World backups" + }, + { + "key": "block.minecraft.banner.globe.gray", + "english_translation": "Gray Globe" + }, + { + "key": "itemGroup.hotbar", + "english_translation": "Saved Hotbars" + }, + { + "key": "block.minecraft.banner.skull.red", + "english_translation": "Red Skull Charge" + }, + { + "key": "item.minecraft.mushroom_stew", + "english_translation": "Mushroom Stew" + }, + { + "key": "block.minecraft.banner.gradient.cyan", + "english_translation": "Cyan Gradient" + }, + { + "key": "gui.chatReport.comments", + "english_translation": "Comments" + }, + { + "key": "commands.worldborder.center.failed", + "english_translation": "Nothing changed. The world border is already centered there" + }, + { + "key": "subtitles.entity.sniffer.hurt", + "english_translation": "Sniffer hurts" + }, + { + "key": "key.hotbar.9", + "english_translation": "Hotbar Slot 9" + }, + { + "key": "commands.item.source.no_such_slot", + "english_translation": "The source does not have slot %s" + }, + { + "key": "advancements.nether.distract_piglin.title", + "english_translation": "Oh Shiny" + }, + { + "key": "block.minecraft.quartz_bricks", + "english_translation": "Quartz Bricks" + }, + { + "key": "multiplayer.socialInteractions.not_available", + "english_translation": "Social Interactions are only available in Multiplayer worlds" + }, + { + "key": "block.minecraft.chiseled_quartz_block", + "english_translation": "Chiseled Quartz Block" + }, + { + "key": "subtitles.entity.vex.death", + "english_translation": "Vex dies" + }, + { + "key": "selectWorld.warning.experimental.title", + "english_translation": "Warning! These settings are using experimental features" + }, + { + "key": "spectatorMenu.teleport.prompt", + "english_translation": "Select a player to teleport to" + }, + { + "key": "subtitles.block.decorated_pot.shatter", + "english_translation": "Pot shatters" + }, + { + "key": "tutorial.bundleInsert.title", + "english_translation": "Use a Bundle" + }, + { + "key": "block.minecraft.purple_concrete_powder", + "english_translation": "Purple Concrete Powder" + }, + { + "key": "subtitles.entity.blaze.shoot", + "english_translation": "Blaze shoots" + }, + { + "key": "block.minecraft.bookshelf", + "english_translation": "Bookshelf" + }, + { + "key": "block.minecraft.blue_shulker_box", + "english_translation": "Blue Shulker Box" + }, + { + "key": "subtitles.entity.sniffer.eat", + "english_translation": "Sniffer eats" + }, + { + "key": "death.attack.onFire.item", + "english_translation": "%1$s was burnt to a crisp whilst fighting %2$s wielding %3$s" + }, + { + "key": "item.minecraft.potion.effect.empty", + "english_translation": "Uncraftable Potion" + }, + { + "key": "commands.scoreboard.players.get.null", + "english_translation": "Can't get value of %s for %s; none is set" + }, + { + "key": "mco.time.minutesAgo", + "english_translation": "%1$s minute(s) ago" + }, + { + "key": "death.fell.finish.item", + "english_translation": "%1$s fell too far and was finished by %2$s using %3$s" + }, + { + "key": "createWorld.customize.custom.spread", + "english_translation": "Spread Height" + }, + { + "key": "chat.link.open", + "english_translation": "Open in Browser" + }, + { + "key": "block.minecraft.banner.diagonal_up_right.green", + "english_translation": "Green Per Bend Sinister Inverted" + }, + { + "key": "block.minecraft.banner.gradient_up.magenta", + "english_translation": "Magenta Base Gradient" + }, + { + "key": "menu.shareToLan", + "english_translation": "Open to LAN" + }, + { + "key": "block.minecraft.polished_blackstone_wall", + "english_translation": "Polished Blackstone Wall" + }, + { + "key": "block.minecraft.tripwire_hook", + "english_translation": "Tripwire Hook" + }, + { + "key": "argument.entity.options.dy.description", + "english_translation": "Entities between y and y + dy" + }, + { + "key": "block.minecraft.banner.stripe_middle.light_gray", + "english_translation": "Light Gray Fess" + }, + { + "key": "block.minecraft.smooth_red_sandstone", + "english_translation": "Smooth Red Sandstone" + }, + { + "key": "block.minecraft.candle", + "english_translation": "Candle" + }, + { + "key": "block.minecraft.banner.circle.blue", + "english_translation": "Blue Roundel" + }, + { + "key": "commands.recipe.take.failed", + "english_translation": "No recipes could be forgotten" + }, + { + "key": "mco.errorMessage.realmsService.realmsError", + "english_translation": "Realms (%s):" + }, + { + "key": "item.minecraft.shulker_shell", + "english_translation": "Shulker Shell" + }, + { + "key": "multiplayer.disconnect.invalid_public_key_signature.new", + "english_translation": "Invalid signature for profile public key.\nTry restarting your game." + }, + { + "key": "biome.minecraft.frozen_ocean", + "english_translation": "Frozen Ocean" + }, + { + "key": "commands.datapack.unknown", + "english_translation": "Unknown data pack '%s'" + }, + { + "key": "soundCategory.music", + "english_translation": "Music" + }, + { + "key": "subtitles.entity.villager.work_cartographer", + "english_translation": "Cartographer works" + }, + { + "key": "commands.whitelist.add.failed", + "english_translation": "Player is already whitelisted" + }, + { + "key": "subtitles.entity.player.attack.knockback", + "english_translation": "Knockback attack" + }, + { + "key": "death.attack.even_more_magic", + "english_translation": "%1$s was killed by even more magic" + }, + { + "key": "enchantment.minecraft.fortune", + "english_translation": "Fortune" + }, + { + "key": "mco.template.select.narrate.authors", + "english_translation": "Authors: %s" + }, + { + "key": "death.attack.wither", + "english_translation": "%1$s withered away" + }, + { + "key": "advancements.nether.uneasy_alliance.description", + "english_translation": "Rescue a Ghast from the Nether, bring it safely home to the Overworld... and then kill it" + }, + { + "key": "key.keyboard.tab", + "english_translation": "Tab" + }, + { + "key": "options.biomeBlendRadius.13", + "english_translation": "13x13 (Showoff)" + }, + { + "key": "options.biomeBlendRadius.15", + "english_translation": "15x15 (Maximum)" + }, + { + "key": "gamerule.disableRaids", + "english_translation": "Disable raids" + }, + { + "key": "options.biomeBlendRadius.11", + "english_translation": "11x11 (Extreme)" + }, + { + "key": "subtitles.entity.evoker.hurt", + "english_translation": "Evoker hurts" + }, + { + "key": "structure_block.detect_size", + "english_translation": "Detect Structure Size and Position:" + }, + { + "key": "block.minecraft.end_portal", + "english_translation": "End Portal" + }, + { + "key": "block.minecraft.black_banner", + "english_translation": "Black Banner" + }, + { + "key": "disconnect.loginFailed", + "english_translation": "Failed to log in" + }, + { + "key": "block.minecraft.banner.diagonal_up_right.black", + "english_translation": "Black Per Bend Sinister Inverted" + }, + { + "key": "block.minecraft.tube_coral_block", + "english_translation": "Tube Coral Block" + }, + { + "key": "enchantment.minecraft.channeling", + "english_translation": "Channeling" + }, + { + "key": "subtitles.entity.endermite.ambient", + "english_translation": "Endermite scuttles" + }, + { + "key": "block.minecraft.banner.stripe_left.magenta", + "english_translation": "Magenta Pale Dexter" + }, + { + "key": "block.minecraft.banner.square_top_right.lime", + "english_translation": "Lime Chief Sinister Canton" + }, + { + "key": "createWorld.customize.flat.layer.bottom", + "english_translation": "Bottom - %s" + }, + { + "key": "tutorial.craft_planks.title", + "english_translation": "Craft wooden planks" + }, + { + "key": "item.minecraft.pottery_shard_arms_up", + "english_translation": "Arms Up Pottery Shard" + }, + { + "key": "instrument.minecraft.feel_goat_horn", + "english_translation": "Feel" + }, + { + "key": "subtitles.entity.sniffer.searching", + "english_translation": "Sniffer searches" + }, + { + "key": "item.minecraft.potion.effect.luck", + "english_translation": "Potion of Luck" + }, + { + "key": "block.minecraft.purple_wool", + "english_translation": "Purple Wool" + }, + { + "key": "options.chat.delay", + "english_translation": "Chat Delay: %s seconds" + }, + { + "key": "block.minecraft.yellow_concrete_powder", + "english_translation": "Yellow Concrete Powder" + }, + { + "key": "item.minecraft.potion.effect.thick", + "english_translation": "Thick Potion" + }, + { + "key": "block.minecraft.banner.stripe_left.green", + "english_translation": "Green Pale Dexter" + }, + { + "key": "entity.minecraft.tadpole", + "english_translation": "Tadpole" + }, + { + "key": "item.minecraft.tropical_fish_bucket", + "english_translation": "Bucket of Tropical Fish" + }, + { + "key": "argument.entity.options.z.description", + "english_translation": "z position" + }, + { + "key": "argument.entity.options.limit.toosmall", + "english_translation": "Limit must be at least 1" + }, + { + "key": "gamerule.doDaylightCycle", + "english_translation": "Advance time of day" + }, + { + "key": "block.minecraft.banner.circle.lime", + "english_translation": "Lime Roundel" + }, + { + "key": "block.minecraft.banner.skull.yellow", + "english_translation": "Yellow Skull Charge" + }, + { + "key": "block.minecraft.dirt", + "english_translation": "Dirt" + }, + { + "key": "build.tooHigh", + "english_translation": "Height limit for building is %s" + }, + { + "key": "advancements.nether.charge_respawn_anchor.description", + "english_translation": "Charge a Respawn Anchor to the maximum" + }, + { + "key": "subtitles.item.shield.block", + "english_translation": "Shield blocks" + }, + { + "key": "mco.configure.world.subscription.expired", + "english_translation": "Expired" + }, + { + "key": "container.stonecutter", + "english_translation": "Stonecutter" + }, + { + "key": "commands.title.show.title.single", + "english_translation": "Showing new title for %s" + }, + { + "key": "subtitles.item.glow_ink_sac.use", + "english_translation": "Glow Ink Sac splotches" + }, + { + "key": "telemetry.property.realms_map_content.title", + "english_translation": "Realms Map Content (Minigame Name)" + }, + { + "key": "options.particles", + "english_translation": "Particles" + }, + { + "key": "subtitles.item.bucket.fill", + "english_translation": "Bucket fills" + }, + { + "key": "block.minecraft.white_tulip", + "english_translation": "White Tulip" + }, + { + "key": "gamerule.keepInventory", + "english_translation": "Keep inventory after death" + }, + { + "key": "block.minecraft.banner.stripe_downright.purple", + "english_translation": "Purple Bend" + }, + { + "key": "block.minecraft.banner.creeper.brown", + "english_translation": "Brown Creeper Charge" + }, + { + "key": "block.minecraft.yellow_candle", + "english_translation": "Yellow Candle" + }, + { + "key": "subtitles.entity.parrot.imitate.ghast", + "english_translation": "Parrot cries" + }, + { + "key": "block.minecraft.gray_wool", + "english_translation": "Gray Wool" + }, + { + "key": "gui.banned.reason.hate_terrorism_notorious_figure", + "english_translation": "References to hate groups, terrorist organizations, or notorious figures" + }, + { + "key": "gamerule.doWeatherCycle", + "english_translation": "Update weather" + }, + { + "key": "item.minecraft.firework_star.gray", + "english_translation": "Gray" + }, + { + "key": "debug.copy_location.help", + "english_translation": "F3 + C = Copy location as /tp command, hold F3 + C to crash the game" + }, + { + "key": "gui.abuseReport.send.error_message", + "english_translation": "An error was returned while sending your report:\n'%s'" + }, + { + "key": "createWorld.tab.game.title", + "english_translation": "Game" + }, + { + "key": "gui.chatReport.discard.draft", + "english_translation": "Save as Draft" + }, + { + "key": "subtitles.entity.villager.work_butcher", + "english_translation": "Butcher works" + }, + { + "key": "trim_pattern.minecraft.host", + "english_translation": "Host Armor Trim" + }, + { + "key": "block.minecraft.banner.skull.light_blue", + "english_translation": "Light Blue Skull Charge" + }, + { + "key": "recipe.toast.description", + "english_translation": "Check your recipe book" + }, + { + "key": "item.minecraft.leather_horse_armor", + "english_translation": "Leather Horse Armor" + }, + { + "key": "block.minecraft.banner.stripe_downleft.magenta", + "english_translation": "Magenta Bend Sinister" + }, + { + "key": "block.minecraft.soul_campfire", + "english_translation": "Soul Campfire" + }, + { + "key": "block.minecraft.nether_brick_slab", + "english_translation": "Nether Brick Slab" + }, + { + "key": "entity.minecraft.trader_llama", + "english_translation": "Trader Llama" + }, + { + "key": "block.minecraft.nether_wart_block", + "english_translation": "Nether Wart Block" + }, + { + "key": "createWorld.customize.flat.tile", + "english_translation": "Layer Material" + }, + { + "key": "mco.invites.button.accept", + "english_translation": "Accept" + }, + { + "key": "multiplayerWarning.header", + "english_translation": "Caution: Third-Party Online Play" + }, + { + "key": "block.minecraft.granite_wall", + "english_translation": "Granite Wall" + }, + { + "key": "commands.help.failed", + "english_translation": "Unknown command or insufficient permissions" + }, + { + "key": "mco.configure.world.buttons.edit", + "english_translation": "Settings" + }, + { + "key": "multiplayer.status.and_more", + "english_translation": "... and %s more ..." + }, + { + "key": "advMode.setCommand.success", + "english_translation": "Command set: %s" + }, + { + "key": "commands.fillbiome.success", + "english_translation": "Biomes set between %s, %s, %s and %s, %s, %s" + }, + { + "key": "commands.jfr.started", + "english_translation": "JFR profiling started" + }, + { + "key": "container.shulkerBox", + "english_translation": "Shulker Box" + }, + { + "key": "advancements.end.levitate.title", + "english_translation": "Great View From Up Here" + }, + { + "key": "selectWorld.recreate.customized.title", + "english_translation": "Customized worlds are no longer supported" + }, + { + "key": "block.minecraft.crimson_stairs", + "english_translation": "Crimson Stairs" + }, + { + "key": "item.minecraft.music_disc_chirp.desc", + "english_translation": "C418 - chirp" + }, + { + "key": "createWorld.customize.custom.lavaLakeChance", + "english_translation": "Lava Lake Rarity" + }, + { + "key": "block.minecraft.cobbled_deepslate_stairs", + "english_translation": "Cobbled Deepslate Stairs" + }, + { + "key": "block.minecraft.tripwire", + "english_translation": "Tripwire" + }, + { + "key": "enchantment.minecraft.infinity", + "english_translation": "Infinity" + }, + { + "key": "telemetry.event.optional", + "english_translation": "%s (Optional)" + }, + { + "key": "block.minecraft.lever", + "english_translation": "Lever" + }, + { + "key": "block.minecraft.oak_stairs", + "english_translation": "Oak Stairs" + }, + { + "key": "death.attack.outsideBorder", + "english_translation": "%1$s left the confines of this world" + }, + { + "key": "options.narrator.notavailable", + "english_translation": "Not Available" + }, + { + "key": "subtitles.entity.wandering_trader.trade", + "english_translation": "Wandering Trader trades" + }, + { + "key": "argument.entity.selector.allEntities", + "english_translation": "All entities" + }, + { + "key": "container.lectern", + "english_translation": "Lectern" + }, + { + "key": "subtitles.entity.cat.hurt", + "english_translation": "Cat hurts" + }, + { + "key": "block.minecraft.sandstone_stairs", + "english_translation": "Sandstone Stairs" + }, + { + "key": "subtitles.entity.horse.death", + "english_translation": "Horse dies" + }, + { + "key": "block.minecraft.polished_blackstone_brick_stairs", + "english_translation": "Polished Blackstone Brick Stairs" + }, + { + "key": "advancements.husbandry.balanced_diet.title", + "english_translation": "A Balanced Diet" + }, + { + "key": "subtitles.item.trident.riptide", + "english_translation": "Trident zooms" + }, + { + "key": "block.minecraft.beacon.primary", + "english_translation": "Primary Power" + }, + { + "key": "block.minecraft.banner.stripe_top.gray", + "english_translation": "Gray Chief" + }, + { + "key": "block.minecraft.acacia_wall_sign", + "english_translation": "Acacia Wall Sign" + }, + { + "key": "createWorld.customize.buffet.biome", + "english_translation": "Please select a biome" + }, + { + "key": "subtitles.entity.sniffer.digging_stop", + "english_translation": "Sniffer stands up" + }, + { + "key": "item.minecraft.pink_dye", + "english_translation": "Pink Dye" + }, + { + "key": "item.minecraft.coal", + "english_translation": "Coal" + }, + { + "key": "entity.minecraft.evoker_fangs", + "english_translation": "Evoker Fangs" + }, + { + "key": "options.simulationDistance", + "english_translation": "Simulation Distance" + }, + { + "key": "block.minecraft.banner.circle.light_gray", + "english_translation": "Light Gray Roundel" + }, + { + "key": "block.minecraft.dead_brain_coral_wall_fan", + "english_translation": "Dead Brain Coral Wall Fan" + }, + { + "key": "block.minecraft.magenta_shulker_box", + "english_translation": "Magenta Shulker Box" + }, + { + "key": "death.attack.arrow.item", + "english_translation": "%1$s was shot by %2$s using %3$s" + }, + { + "key": "subtitles.entity.vindicator.ambient", + "english_translation": "Vindicator mutters" + }, + { + "key": "block.minecraft.infested_cobblestone", + "english_translation": "Infested Cobblestone" + }, + { + "key": "enchantment.minecraft.silk_touch", + "english_translation": "Silk Touch" + }, + { + "key": "block.minecraft.tube_coral", + "english_translation": "Tube Coral" + }, + { + "key": "item.minecraft.creeper_spawn_egg", + "english_translation": "Creeper Spawn Egg" + }, + { + "key": "options.on", + "english_translation": "ON" + }, + { + "key": "advancements.husbandry.plant_seed.description", + "english_translation": "Plant a seed and watch it grow" + }, + { + "key": "block.minecraft.banner.diagonal_right.light_blue", + "english_translation": "Light Blue Per Bend" + }, + { + "key": "gamerule.forgiveDeadPlayers", + "english_translation": "Forgive dead players" + }, + { + "key": "commands.save.disabled", + "english_translation": "Automatic saving is now disabled" + }, + { + "key": "block.minecraft.banner.stripe_center.black", + "english_translation": "Black Pale" + }, + { + "key": "commands.tag.add.failed", + "english_translation": "Target either already has the tag or has too many tags" + }, + { + "key": "subtitles.entity.camel.ambient", + "english_translation": "Camel grunts" + }, + { + "key": "item.minecraft.friend_pottery_sherd", + "english_translation": "Friend Pottery Sherd" + }, + { + "key": "mco.upload.select.world.title", + "english_translation": "Upload world" + }, + { + "key": "subtitles.entity.villager.work_weaponsmith", + "english_translation": "Weaponsmith works" + }, + { + "key": "effect.minecraft.dolphins_grace", + "english_translation": "Dolphin's Grace" + }, + { + "key": "mco.minigame.world.info.line1", + "english_translation": "This will temporarily replace your world with a minigame!" + }, + { + "key": "gameMode.creative", + "english_translation": "Creative Mode" + }, + { + "key": "item.minecraft.chorus_fruit", + "english_translation": "Chorus Fruit" + }, + { + "key": "mco.minigame.world.info.line2", + "english_translation": "You can later return to your original world without losing anything." + }, + { + "key": "advancements.adventure.trade.description", + "english_translation": "Successfully trade with a Villager" + }, + { + "key": "options.fov", + "english_translation": "FOV" + }, + { + "key": "block.minecraft.banner.stripe_left.black", + "english_translation": "Black Pale Dexter" + }, + { + "key": "block.minecraft.banner.triangles_bottom.green", + "english_translation": "Green Base Indented" + }, + { + "key": "debug.inspect.server.entity", + "english_translation": "Copied server-side entity data to clipboard" + }, + { + "key": "item.minecraft.flint", + "english_translation": "Flint" + }, + { + "key": "selectWorld.cheats", + "english_translation": "Cheats" + }, + { + "key": "block.minecraft.polished_deepslate", + "english_translation": "Polished Deepslate" + }, + { + "key": "subtitles.entity.parrot.imitate.elder_guardian", + "english_translation": "Parrot moans" + }, + { + "key": "item.minecraft.explorer_pottery_sherd", + "english_translation": "Explorer Pottery Sherd" + }, + { + "key": "key.keyboard.right", + "english_translation": "Right Arrow" + }, + { + "key": "stat.minecraft.time_since_rest", + "english_translation": "Time Since Last Rest" + }, + { + "key": "title.multiplayer.realms", + "english_translation": "Multiplayer (Realms)" + }, + { + "key": "addServer.resourcePack.disabled", + "english_translation": "Disabled" + }, + { + "key": "advancements.nether.explore_nether.title", + "english_translation": "Hot Tourist Destinations" + }, + { + "key": "block.minecraft.banner.triangle_bottom.orange", + "english_translation": "Orange Chevron" + }, + { + "key": "block.minecraft.banner.half_vertical.blue", + "english_translation": "Blue Per Pale" + }, + { + "key": "debug.prefix", + "english_translation": "[Debug]:" + }, + { + "key": "stat.minecraft.time_since_death", + "english_translation": "Time Since Last Death" + }, + { + "key": "subtitles.block.lava.extinguish", + "english_translation": "Lava hisses" + }, + { + "key": "block.minecraft.banner.square_bottom_right.orange", + "english_translation": "Orange Base Sinister Canton" + }, + { + "key": "mco.upload.uploading", + "english_translation": "Uploading '%s'" + }, + { + "key": "options.chat.links.prompt", + "english_translation": "Prompt on Links" + }, + { + "key": "block.minecraft.banner.stripe_center.green", + "english_translation": "Green Pale" + }, + { + "key": "block.minecraft.banner.half_horizontal.orange", + "english_translation": "Orange Per Fess" + }, + { + "key": "gui.back", + "english_translation": "Back" + }, + { + "key": "death.attack.dryout", + "english_translation": "%1$s died from dehydration" + }, + { + "key": "biome.minecraft.sparse_jungle", + "english_translation": "Sparse Jungle" + }, + { + "key": "subtitles.entity.shulker.teleport", + "english_translation": "Shulker teleports" + }, + { + "key": "advancements.story.iron_tools.description", + "english_translation": "Upgrade your Pickaxe" + }, + { + "key": "argument.entity.selector.nearestPlayer", + "english_translation": "Nearest player" + }, + { + "key": "item.minecraft.bucket", + "english_translation": "Bucket" + }, + { + "key": "structure_block.structure_name", + "english_translation": "Structure Name" + }, + { + "key": "commands.scoreboard.players.operation.success.multiple", + "english_translation": "Updated %s for %s entities" + }, + { + "key": "argument.gamemode.invalid", + "english_translation": "Unknown game mode: %s" + }, + { + "key": "block.minecraft.banner.small_stripes.black", + "english_translation": "Black Paly" + }, + { + "key": "block.minecraft.yellow_glazed_terracotta", + "english_translation": "Yellow Glazed Terracotta" + }, + { + "key": "block.minecraft.brown_shulker_box", + "english_translation": "Brown Shulker Box" + }, + { + "key": "block.minecraft.lily_of_the_valley", + "english_translation": "Lily of the Valley" + }, + { + "key": "block.minecraft.twisting_vines", + "english_translation": "Twisting Vines" + }, + { + "key": "block.minecraft.banner.bricks.pink", + "english_translation": "Pink Field Masoned" + }, + { + "key": "subtitles.entity.player.hurt", + "english_translation": "Player hurts" + }, + { + "key": "subtitles.ui.loom.take_result", + "english_translation": "Loom used" + }, + { + "key": "gui.socialInteractions.server_label.single", + "english_translation": "%s - %s player" + }, + { + "key": "commands.stopsound.success.sourceless.sound", + "english_translation": "Stopped sound '%s'" + }, + { + "key": "mco.backup.entry.gameDifficulty", + "english_translation": "Game Difficulty" + }, + { + "key": "block.minecraft.banner.gradient_up.yellow", + "english_translation": "Yellow Base Gradient" + }, + { + "key": "subtitles.entity.panda.aggressive_ambient", + "english_translation": "Panda huffs" + }, + { + "key": "argument.scoreHolder.empty", + "english_translation": "No relevant score holders could be found" + }, + { + "key": "advMode.nearestPlayer", + "english_translation": "Use \"@p\" to target nearest player" + }, + { + "key": "block.minecraft.crimson_hanging_sign", + "english_translation": "Crimson Hanging Sign" + }, + { + "key": "advancements.nether.obtain_blaze_rod.title", + "english_translation": "Into Fire" + }, + { + "key": "block.minecraft.banner.straight_cross.yellow", + "english_translation": "Yellow Cross" + }, + { + "key": "advancements.story.root.title", + "english_translation": "Minecraft" + }, + { + "key": "block.minecraft.pumpkin_stem", + "english_translation": "Pumpkin Stem" + }, + { + "key": "argument.nbt.expected.key", + "english_translation": "Expected key" + }, + { + "key": "stat.minecraft.traded_with_villager", + "english_translation": "Traded with Villagers" + }, + { + "key": "mco.download.done", + "english_translation": "Download done" + }, + { + "key": "subtitles.entity.horse.jump", + "english_translation": "Horse jumps" + }, + { + "key": "item.minecraft.poisonous_potato", + "english_translation": "Poisonous Potato" + }, + { + "key": "options.difficulty.normal", + "english_translation": "Normal" + }, + { + "key": "options.darkMojangStudiosBackgroundColor.tooltip", + "english_translation": "Changes the Mojang Studios loading screen background color to black." + }, + { + "key": "block.minecraft.banner.stripe_right.purple", + "english_translation": "Purple Pale Sinister" + }, + { + "key": "block.minecraft.banner.half_vertical.lime", + "english_translation": "Lime Per Pale" + }, + { + "key": "argument.entity.options.scores.description", + "english_translation": "Entities with scores" + }, + { + "key": "block.minecraft.banner.piglin.yellow", + "english_translation": "Yellow Snout" + }, + { + "key": "painting.minecraft.fighters.title", + "english_translation": "Fighters" + }, + { + "key": "selectWorld.gameMode.hardcore.info", + "english_translation": "Survival Mode locked to 'Hard' difficulty. You can't respawn if you die." + }, + { + "key": "subtitles.entity.illusioner.cast_spell", + "english_translation": "Illusioner casts spell" + }, + { + "key": "debug.help.help", + "english_translation": "F3 + Q = Show this list" + }, + { + "key": "block.minecraft.magenta_candle_cake", + "english_translation": "Cake with Magenta Candle" + }, + { + "key": "commands.publish.started", + "english_translation": "Local game hosted on port %s" + }, + { + "key": "biome.minecraft.windswept_hills", + "english_translation": "Windswept Hills" + }, + { + "key": "block.minecraft.tube_coral_fan", + "english_translation": "Tube Coral Fan" + }, + { + "key": "death.attack.anvil.player", + "english_translation": "%1$s was squashed by a falling anvil whilst fighting %2$s" + }, + { + "key": "subtitles.entity.ghast.shoot", + "english_translation": "Ghast shoots" + }, + { + "key": "parsing.double.invalid", + "english_translation": "Invalid double '%s'" + }, + { + "key": "subtitles.block.sculk.spread", + "english_translation": "Sculk spreads" + }, + { + "key": "item.minecraft.donkey_spawn_egg", + "english_translation": "Donkey Spawn Egg" + }, + { + "key": "deathScreen.title", + "english_translation": "You Died!" + }, + { + "key": "options.notifications.display_time", + "english_translation": "Notification Time" + }, + { + "key": "structure_block.button.save", + "english_translation": "SAVE" + }, + { + "key": "block.minecraft.banner.small_stripes.cyan", + "english_translation": "Cyan Paly" + }, + { + "key": "block.minecraft.potted_azure_bluet", + "english_translation": "Potted Azure Bluet" + }, + { + "key": "structure_block.mode_info.save", + "english_translation": "Save Mode - Write to File" + }, + { + "key": "options.skinCustomisation", + "english_translation": "Skin Customization..." + }, + { + "key": "gui.socialInteractions.tab_hidden", + "english_translation": "Hidden" + }, + { + "key": "disconnect.loginFailedInfo.invalidSession", + "english_translation": "Invalid session (Try restarting your game and the launcher)" + }, + { + "key": "mco.upload.close.failure", + "english_translation": "Could not close your realm, please try again later" + }, + { + "key": "subtitles.block.anvil.destroy", + "english_translation": "Anvil destroyed" + }, + { + "key": "color.minecraft.purple", + "english_translation": "Purple" + }, + { + "key": "options.touchscreen", + "english_translation": "Touchscreen Mode" + }, + { + "key": "createWorld.customize.custom.useLavaLakes", + "english_translation": "Lava Lakes" + }, + { + "key": "item.minecraft.salmon_spawn_egg", + "english_translation": "Salmon Spawn Egg" + }, + { + "key": "item.minecraft.yellow_dye", + "english_translation": "Yellow Dye" + }, + { + "key": "commands.locate.poi.not_found", + "english_translation": "Could not find a point of interest of type \"%s\" within reasonable distance" + }, + { + "key": "block.minecraft.soul_sand", + "english_translation": "Soul Sand" + }, + { + "key": "stat.minecraft.raid_win", + "english_translation": "Raids Won" + }, + { + "key": "subtitles.entity.donkey.ambient", + "english_translation": "Donkey hee-haws" + }, + { + "key": "death.attack.stalagmite.player", + "english_translation": "%1$s was impaled on a stalagmite whilst fighting %2$s" + }, + { + "key": "item.minecraft.shield.magenta", + "english_translation": "Magenta Shield" + }, + { + "key": "item.minecraft.knowledge_book", + "english_translation": "Knowledge Book" + }, + { + "key": "parsing.quote.expected.end", + "english_translation": "Unclosed quoted string" + }, + { + "key": "item.minecraft.clock", + "english_translation": "Clock" + }, + { + "key": "block.minecraft.banner.mojang.green", + "english_translation": "Green Thing" + }, + { + "key": "block.minecraft.banner.triangle_bottom.blue", + "english_translation": "Blue Chevron" + }, + { + "key": "entity.minecraft.tropical_fish.predefined.20", + "english_translation": "Yellowtail Parrotfish" + }, + { + "key": "item.minecraft.splash_potion.effect.poison", + "english_translation": "Splash Potion of Poison" + }, + { + "key": "block.minecraft.bedrock", + "english_translation": "Bedrock" + }, + { + "key": "entity.minecraft.tropical_fish.predefined.13", + "english_translation": "Queen Angelfish" + }, + { + "key": "entity.minecraft.tropical_fish.predefined.12", + "english_translation": "Parrotfish" + }, + { + "key": "entity.minecraft.tropical_fish.predefined.11", + "english_translation": "Ornate Butterflyfish" + }, + { + "key": "entity.minecraft.tropical_fish.predefined.10", + "english_translation": "Moorish Idol" + }, + { + "key": "advancements.nether.find_bastion.description", + "english_translation": "Enter a Bastion Remnant" + }, + { + "key": "block.minecraft.brown_banner", + "english_translation": "Brown Banner" + }, + { + "key": "entity.minecraft.tropical_fish.predefined.17", + "english_translation": "Threadfin" + }, + { + "key": "entity.minecraft.tropical_fish.predefined.16", + "english_translation": "Red Snapper" + }, + { + "key": "entity.minecraft.tropical_fish.predefined.15", + "english_translation": "Red Lipped Blenny" + }, + { + "key": "entity.minecraft.tropical_fish.predefined.14", + "english_translation": "Red Cichlid" + }, + { + "key": "item.minecraft.tipped_arrow", + "english_translation": "Tipped Arrow" + }, + { + "key": "entity.minecraft.tropical_fish.predefined.19", + "english_translation": "Triggerfish" + }, + { + "key": "entity.minecraft.tropical_fish.predefined.18", + "english_translation": "Tomato Clownfish" + }, + { + "key": "block.minecraft.banner.curly_border.pink", + "english_translation": "Pink Bordure Indented" + }, + { + "key": "block.minecraft.banner.stripe_left.light_blue", + "english_translation": "Light Blue Pale Dexter" + }, + { + "key": "block.minecraft.dead_bubble_coral_wall_fan", + "english_translation": "Dead Bubble Coral Wall Fan" + }, + { + "key": "death.attack.cramming.player", + "english_translation": "%1$s was squashed by %2$s" + }, + { + "key": "block.minecraft.banner.triangles_bottom.orange", + "english_translation": "Orange Base Indented" + }, + { + "key": "block.minecraft.polished_granite_slab", + "english_translation": "Polished Granite Slab" + }, + { + "key": "options.clouds.fancy", + "english_translation": "Fancy" + }, + { + "key": "advancements.end.respawn_dragon.title", + "english_translation": "The End... Again..." + }, + { + "key": "block.minecraft.banner.triangle_bottom.yellow", + "english_translation": "Yellow Chevron" + }, + { + "key": "advancements.husbandry.obtain_sniffer_egg.description", + "english_translation": "Obtain a Sniffer Egg" + }, + { + "key": "block.minecraft.stone_stairs", + "english_translation": "Stone Stairs" + }, + { + "key": "stat.minecraft.total_world_time", + "english_translation": "Time with World Open" + }, + { + "key": "block.minecraft.banner.bricks.purple", + "english_translation": "Purple Field Masoned" + }, + { + "key": "item.minecraft.warped_fungus_on_a_stick", + "english_translation": "Warped Fungus on a Stick" + }, + { + "key": "item.minecraft.music_disc_cat.desc", + "english_translation": "C418 - cat" + }, + { + "key": "item.minecraft.wooden_pickaxe", + "english_translation": "Wooden Pickaxe" + }, + { + "key": "death.attack.thorns", + "english_translation": "%1$s was killed trying to hurt %2$s" + }, + { + "key": "block.minecraft.light_blue_stained_glass_pane", + "english_translation": "Light Blue Stained Glass Pane" + }, + { + "key": "key.back", + "english_translation": "Walk Backwards" + }, + { + "key": "block.minecraft.banner.skull.brown", + "english_translation": "Brown Skull Charge" + }, + { + "key": "item.minecraft.piglin_banner_pattern", + "english_translation": "Banner Pattern" + }, + { + "key": "block.minecraft.banner.diagonal_up_left.light_gray", + "english_translation": "Light Gray Per Bend Inverted" + }, + { + "key": "telemetry_info.screen.title", + "english_translation": "Telemetry Data Collection" + }, + { + "key": "block.minecraft.banner.stripe_downleft.lime", + "english_translation": "Lime Bend Sinister" + }, + { + "key": "commands.datapack.list.enabled.none", + "english_translation": "There are no data packs enabled" + }, + { + "key": "block.minecraft.dead_tube_coral", + "english_translation": "Dead Tube Coral" + }, + { + "key": "subtitles.entity.ravager.ambient", + "english_translation": "Ravager grunts" + }, + { + "key": "advancements.husbandry.wax_off.description", + "english_translation": "Scrape Wax off of a Copper block!" + }, + { + "key": "block.minecraft.banner.half_horizontal_bottom.cyan", + "english_translation": "Cyan Per Fess Inverted" + }, + { + "key": "commands.execute.conditional.fail_count", + "english_translation": "Test failed, count: %s" + }, + { + "key": "itemGroup.op", + "english_translation": "Operator Utilities" + }, + { + "key": "subtitles.entity.axolotl.hurt", + "english_translation": "Axolotl hurts" + }, + { + "key": "block.minecraft.small_dripleaf", + "english_translation": "Small Dripleaf" + }, + { + "key": "item.minecraft.sugar", + "english_translation": "Sugar" + }, + { + "key": "argument.entity.options.limit.description", + "english_translation": "Maximum number of entities to return" + }, + { + "key": "block.minecraft.banner.curly_border.green", + "english_translation": "Green Bordure Indented" + }, + { + "key": "item.minecraft.music_disc_13.desc", + "english_translation": "C418 - 13" + }, + { + "key": "commands.weather.set.rain", + "english_translation": "Set the weather to rain" + }, + { + "key": "advMode.mode.conditional", + "english_translation": "Conditional" + }, + { + "key": "block.minecraft.blue_candle_cake", + "english_translation": "Cake with Blue Candle" + }, + { + "key": "color.minecraft.pink", + "english_translation": "Pink" + }, + { + "key": "advancements.nether.brew_potion.title", + "english_translation": "Local Brewery" + }, + { + "key": "block.minecraft.mangrove_sign", + "english_translation": "Mangrove Sign" + }, + { + "key": "advancements.adventure.hero_of_the_village.description", + "english_translation": "Successfully defend a village from a raid" + }, + { + "key": "item.minecraft.music_disc_wait", + "english_translation": "Music Disc" + }, + { + "key": "block.minecraft.light_blue_candle_cake", + "english_translation": "Cake with Light Blue Candle" + }, + { + "key": "item.minecraft.firework_star.custom_color", + "english_translation": "Custom" + }, + { + "key": "subtitles.block.sign.waxed_interact_fail", + "english_translation": "Sign wobbles" + }, + { + "key": "death.attack.generic", + "english_translation": "%1$s died" + }, + { + "key": "subtitles.entity.turtle.hurt", + "english_translation": "Turtle hurts" + }, + { + "key": "container.enchant.level.one", + "english_translation": "1 Enchantment Level" + }, + { + "key": "stat.minecraft.use_cauldron", + "english_translation": "Water Taken from Cauldron" + }, + { + "key": "item.minecraft.potion.effect.leaping", + "english_translation": "Potion of Leaping" + }, + { + "key": "subtitles.entity.parrot.ambient", + "english_translation": "Parrot talks" + }, + { + "key": "item.minecraft.potato", + "english_translation": "Potato" + }, + { + "key": "mco.notification.visitUrl.message.default", + "english_translation": "Please visit the link below" + }, + { + "key": "painting.minecraft.wither.title", + "english_translation": "Wither" + }, + { + "key": "gui.chatReport.select_chat", + "english_translation": "Select Chat Messages to Report" + }, + { + "key": "block.minecraft.banner.stripe_right.brown", + "english_translation": "Brown Pale Sinister" + }, + { + "key": "block.minecraft.banner.triangle_bottom.lime", + "english_translation": "Lime Chevron" + }, + { + "key": "subtitles.block.beacon.ambient", + "english_translation": "Beacon hums" + }, + { + "key": "mco.backup.button.upload", + "english_translation": "Upload world" + }, + { + "key": "subtitles.item.armor.equip_iron", + "english_translation": "Iron armor clanks" + }, + { + "key": "block.minecraft.cherry_leaves", + "english_translation": "Cherry Leaves" + }, + { + "key": "subtitles.entity.drowned.hurt", + "english_translation": "Drowned hurts" + }, + { + "key": "advancements.story.upgrade_tools.description", + "english_translation": "Construct a better Pickaxe" + }, + { + "key": "block.minecraft.fire_coral_block", + "english_translation": "Fire Coral Block" + }, + { + "key": "item.minecraft.shield.green", + "english_translation": "Green Shield" + }, + { + "key": "narration.component_list.usage", + "english_translation": "Press Tab to navigate to next element" + }, + { + "key": "argument.entity.options.unterminated", + "english_translation": "Expected end of options" + }, + { + "key": "block.minecraft.small_amethyst_bud", + "english_translation": "Small Amethyst Bud" + }, + { + "key": "mco.configure.world.description", + "english_translation": "Realm description" + }, + { + "key": "block.minecraft.banner.diagonal_up_right.light_blue", + "english_translation": "Light Blue Per Bend Sinister Inverted" + }, + { + "key": "biome.minecraft.grove", + "english_translation": "Grove" + }, + { + "key": "block.minecraft.nether_sprouts", + "english_translation": "Nether Sprouts" + }, + { + "key": "block.minecraft.creeper_wall_head", + "english_translation": "Creeper Wall Head" + }, + { + "key": "debug.reload_resourcepacks.help", + "english_translation": "F3 + T = Reload resource packs" + }, + { + "key": "optimizeWorld.info.total", + "english_translation": "Total chunks: %s" + }, + { + "key": "entity.minecraft.giant", + "english_translation": "Giant" + }, + { + "key": "subtitles.block.fence_gate.toggle", + "english_translation": "Fence Gate creaks" + }, + { + "key": "item.minecraft.smithing_template.applies_to", + "english_translation": "Applies to:" + }, + { + "key": "advancements.husbandry.froglights.title", + "english_translation": "With Our Powers Combined!" + }, + { + "key": "block.minecraft.banner.triangle_top.light_gray", + "english_translation": "Light Gray Inverted Chevron" + }, + { + "key": "block.minecraft.banner.flower.light_gray", + "english_translation": "Light Gray Flower Charge" + }, + { + "key": "block.minecraft.banner.skull.blue", + "english_translation": "Blue Skull Charge" + }, + { + "key": "block.minecraft.green_concrete", + "english_translation": "Green Concrete" + }, + { + "key": "gui.socialInteractions.narration.show", + "english_translation": "Show messages from %s" + }, + { + "key": "argument.pos.missing.double", + "english_translation": "Expected a coordinate" + }, + { + "key": "block.minecraft.potted_brown_mushroom", + "english_translation": "Potted Brown Mushroom" + }, + { + "key": "menu.convertingLevel", + "english_translation": "Converting world" + }, + { + "key": "soundCategory.hostile", + "english_translation": "Hostile Creatures" + }, + { + "key": "block.minecraft.orange_concrete_powder", + "english_translation": "Orange Concrete Powder" + }, + { + "key": "block.minecraft.smithing_table", + "english_translation": "Smithing Table" + }, + { + "key": "mco.configure.world.subscription.start", + "english_translation": "Start date" + }, + { + "key": "stat.minecraft.ring_bell", + "english_translation": "Bells Rung" + }, + { + "key": "selectWorld.gameMode.adventure.info", + "english_translation": "Same as Survival Mode, but blocks can't be added or removed." + }, + { + "key": "subtitles.entity.puffer_fish.blow_out", + "english_translation": "Pufferfish deflates" + }, + { + "key": "item.minecraft.wither_skeleton_spawn_egg", + "english_translation": "Wither Skeleton Spawn Egg" + }, + { + "key": "block.minecraft.banner.triangles_bottom.white", + "english_translation": "White Base Indented" + }, + { + "key": "gui.chatReport.discard.discard", + "english_translation": "Leave and Discard Report" + }, + { + "key": "subtitles.block.tripwire.click", + "english_translation": "Tripwire clicks" + }, + { + "key": "subtitles.entity.cod.flop", + "english_translation": "Cod flops" + }, + { + "key": "entity.minecraft.tropical_fish.predefined.21", + "english_translation": "Yellow Tang" + }, + { + "key": "commands.scoreboard.players.add.success.multiple", + "english_translation": "Added %s to %s for %s entities" + }, + { + "key": "death.fell.killer", + "english_translation": "%1$s was doomed to fall" + }, + { + "key": "item.minecraft.quartz", + "english_translation": "Nether Quartz" + }, + { + "key": "item.modifiers.mainhand", + "english_translation": "When in Main Hand:" + }, + { + "key": "options.graphics.fancy", + "english_translation": "Fancy" + }, + { + "key": "structure_block.save_failure", + "english_translation": "Unable to save structure '%s'" + }, + { + "key": "block.minecraft.banner.square_bottom_right.white", + "english_translation": "White Base Sinister Canton" + }, + { + "key": "structure_block.integrity.seed", + "english_translation": "Structure Seed" + }, + { + "key": "itemGroup.natural", + "english_translation": "Natural Blocks" + }, + { + "key": "subtitles.entity.warden.heartbeat", + "english_translation": "Warden's heart beats" + }, + { + "key": "options.mainHand.right", + "english_translation": "Right" + }, + { + "key": "subtitles.entity.parrot.eats", + "english_translation": "Parrot eats" + }, + { + "key": "mco.template.button.publisher", + "english_translation": "Publisher" + }, + { + "key": "mco.configure.world.close.question.line1", + "english_translation": "Your realm will become unavailable." + }, + { + "key": "mco.configure.world.close.question.line2", + "english_translation": "Are you sure you want to continue?" + }, + { + "key": "block.minecraft.banner.stripe_center.red", + "english_translation": "Red Pale" + }, + { + "key": "subtitles.entity.parrot.imitate.evoker", + "english_translation": "Parrot murmurs" + }, + { + "key": "block.minecraft.banner.curly_border.black", + "english_translation": "Black Bordure Indented" + }, + { + "key": "item.minecraft.prismarine_shard", + "english_translation": "Prismarine Shard" + }, + { + "key": "item.minecraft.slime_spawn_egg", + "english_translation": "Slime Spawn Egg" + }, + { + "key": "options.skinCustomisation.title", + "english_translation": "Skin Customization" + }, + { + "key": "subtitles.entity.parrot.imitate.guardian", + "english_translation": "Parrot moans" + }, + { + "key": "block.minecraft.banner.half_horizontal.blue", + "english_translation": "Blue Per Fess" + }, + { + "key": "block.minecraft.sandstone", + "english_translation": "Sandstone" + }, + { + "key": "multiplayer.unsecureserver.toast.title", + "english_translation": "Chat messages can't be verified" + }, + { + "key": "narration.suggestion", + "english_translation": "Selected suggestion %s out of %s: %s" + }, + { + "key": "entity.minecraft.villager.farmer", + "english_translation": "Farmer" + }, + { + "key": "attribute.modifier.plus.0", + "english_translation": "+%s %s" + }, + { + "key": "gui.abuseReport.reason.terrorism_or_violent_extremism", + "english_translation": "Terrorism or violent extremism" + }, + { + "key": "attribute.modifier.plus.2", + "english_translation": "+%s%% %s" + }, + { + "key": "attribute.modifier.plus.1", + "english_translation": "+%s%% %s" + }, + { + "key": "block.minecraft.banner.triangle_top.green", + "english_translation": "Green Inverted Chevron" + }, + { + "key": "telemetry.property.game_version.title", + "english_translation": "Game Version" + }, + { + "key": "block.minecraft.brown_mushroom", + "english_translation": "Brown Mushroom" + }, + { + "key": "commands.setblock.failed", + "english_translation": "Could not set the block" + }, + { + "key": "block.minecraft.lodestone", + "english_translation": "Lodestone" + }, + { + "key": "commands.item.entity.set.success.single", + "english_translation": "Replaced a slot on %s with %s" + }, + { + "key": "gui.banned.reason.fraud", + "english_translation": "Fraudulent acquisition or use of content" + }, + { + "key": "block.minecraft.stone_brick_wall", + "english_translation": "Stone Brick Wall" + }, + { + "key": "subtitles.entity.llama.swag", + "english_translation": "Llama is decorated" + }, + { + "key": "commands.scoreboard.players.reset.all.multiple", + "english_translation": "Reset all scores for %s entities" + }, + { + "key": "gamerule.tntExplosionDropDecay.description", + "english_translation": "Some of the drops from blocks destroyed by explosions caused by TNT are lost in the explosion." + }, + { + "key": "entity.minecraft.furnace_minecart", + "english_translation": "Minecart with Furnace" + }, + { + "key": "attribute.name.generic.flying_speed", + "english_translation": "Flying Speed" + }, + { + "key": "gui.socialInteractions.tooltip.hide", + "english_translation": "Hide messages" + }, + { + "key": "block.minecraft.soul_fire", + "english_translation": "Soul Fire" + }, + { + "key": "death.fell.accident.generic", + "english_translation": "%1$s fell from a high place" + }, + { + "key": "mco.configure.world.delete.question.line1", + "english_translation": "Your realm will be permanently deleted" + }, + { + "key": "gui.advancements", + "english_translation": "Advancements" + }, + { + "key": "selectWorld.conversion", + "english_translation": "Must be converted!" + }, + { + "key": "item.minecraft.iron_hoe", + "english_translation": "Iron Hoe" + }, + { + "key": "mco.configure.world.delete.question.line2", + "english_translation": "Are you sure you want to continue?" + }, + { + "key": "mco.selectServer.purchase", + "english_translation": "Add Realm" + }, + { + "key": "block.minecraft.magenta_carpet", + "english_translation": "Magenta Carpet" + }, + { + "key": "item.minecraft.shield.black", + "english_translation": "Black Shield" + }, + { + "key": "block.minecraft.banner.piglin.orange", + "english_translation": "Orange Snout" + }, + { + "key": "commands.ride.mount.failure.loop", + "english_translation": "Can't mount entity on itself or any of its passengers" + }, + { + "key": "commands.setworldspawn.success", + "english_translation": "Set the world spawn point to %s, %s, %s [%s]" + }, + { + "key": "commands.pardon.success", + "english_translation": "Unbanned %s" + }, + { + "key": "item.minecraft.music_disc_ward", + "english_translation": "Music Disc" + }, + { + "key": "block.minecraft.blue_orchid", + "english_translation": "Blue Orchid" + }, + { + "key": "menu.savingChunks", + "english_translation": "Saving chunks" + }, + { + "key": "block.minecraft.banner.flower.brown", + "english_translation": "Brown Flower Charge" + }, + { + "key": "commands.jfr.start.failed", + "english_translation": "Failed to start JFR profiling" + }, + { + "key": "stat.mobsButton", + "english_translation": "Mobs" + }, + { + "key": "block.minecraft.banner.stripe_center.brown", + "english_translation": "Brown Pale" + }, + { + "key": "createWorld.customize.custom.seaLevel", + "english_translation": "Sea Level" + }, + { + "key": "block.minecraft.red_candle_cake", + "english_translation": "Cake with Red Candle" + }, + { + "key": "block.minecraft.gray_concrete", + "english_translation": "Gray Concrete" + }, + { + "key": "mco.minigame.world.starting.screen.title", + "english_translation": "Starting minigame..." + }, + { + "key": "block.minecraft.light_weighted_pressure_plate", + "english_translation": "Light Weighted Pressure Plate" + }, + { + "key": "subtitles.entity.drowned.death", + "english_translation": "Drowned dies" + }, + { + "key": "commands.bossbar.set.value.unchanged", + "english_translation": "Nothing changed. That's already the value of this bossbar" + }, + { + "key": "block.minecraft.black_stained_glass", + "english_translation": "Black Stained Glass" + }, + { + "key": "entity.minecraft.endermite", + "english_translation": "Endermite" + }, + { + "key": "commands.team.option.collisionRule.success", + "english_translation": "Collision rule for team %s is now \"%s\"" + }, + { + "key": "pack.folderInfo", + "english_translation": "(Place pack files here)" + }, + { + "key": "block.minecraft.banner.stripe_downleft.blue", + "english_translation": "Blue Bend Sinister" + }, + { + "key": "block.minecraft.red_nether_bricks", + "english_translation": "Red Nether Bricks" + }, + { + "key": "block.minecraft.banner.square_top_right.yellow", + "english_translation": "Yellow Chief Sinister Canton" + }, + { + "key": "argument.entity.options.gamemode.description", + "english_translation": "Players with game mode" + }, + { + "key": "lanServer.port.invalid", + "english_translation": "Not a valid port.\nLeave the edit box empty or enter a number between 1024 and 65535." + }, + { + "key": "block.minecraft.banner.half_horizontal.lime", + "english_translation": "Lime Per Fess" + }, + { + "key": "block.minecraft.banner.circle.purple", + "english_translation": "Purple Roundel" + }, + { + "key": "commands.scoreboard.players.list.entity.empty", + "english_translation": "%s has no scores to show" + }, + { + "key": "block.minecraft.emerald_block", + "english_translation": "Block of Emerald" + }, + { + "key": "item.minecraft.pufferfish", + "english_translation": "Pufferfish" + }, + { + "key": "block.minecraft.banner.stripe_downleft.orange", + "english_translation": "Orange Bend Sinister" + }, + { + "key": "enchantment.minecraft.feather_falling", + "english_translation": "Feather Falling" + }, + { + "key": "commands.tag.list.single.success", + "english_translation": "%s has %s tags: %s" + }, + { + "key": "advancements.adventure.kill_a_mob.description", + "english_translation": "Kill any hostile monster" + }, + { + "key": "block.minecraft.smooth_quartz_slab", + "english_translation": "Smooth Quartz Slab" + }, + { + "key": "stat_type.minecraft.picked_up", + "english_translation": "Picked Up" + }, + { + "key": "commands.forceload.added.failure", + "english_translation": "No chunks were marked for force loading" + }, + { + "key": "gamerule.maxCommandChainLength", + "english_translation": "Command chain size limit" + }, + { + "key": "block.minecraft.gold_ore", + "english_translation": "Gold Ore" + }, + { + "key": "block.minecraft.lime_stained_glass_pane", + "english_translation": "Lime Stained Glass Pane" + }, + { + "key": "stat.minecraft.fish_caught", + "english_translation": "Fish Caught" + }, + { + "key": "commands.teleport.success.location.multiple", + "english_translation": "Teleported %s entities to %s, %s, %s" + }, + { + "key": "item.minecraft.pottery_shard_skull", + "english_translation": "Skull Pottery Shard" + }, + { + "key": "options.chat.height.focused", + "english_translation": "Focused Height" + }, + { + "key": "item.minecraft.written_book", + "english_translation": "Written Book" + }, + { + "key": "multiplayer.disconnect.unsigned_chat", + "english_translation": "Received chat packet with missing or invalid signature." + }, + { + "key": "enchantment.minecraft.mending", + "english_translation": "Mending" + }, + { + "key": "item.minecraft.beetroot", + "english_translation": "Beetroot" + }, + { + "key": "gamerule.blockExplosionDropDecay.description", + "english_translation": "Some of the drops from blocks destroyed by explosions caused by block interactions are lost in the explosion." + }, + { + "key": "item.minecraft.string", + "english_translation": "String" + }, + { + "key": "commands.execute.blocks.toobig", + "english_translation": "Too many blocks in the specified area (maximum %s, specified %s)" + }, + { + "key": "subtitles.entity.piglin_brute.converted_to_zombified", + "english_translation": "Piglin Brute converts to Zombified Piglin" + }, + { + "key": "gui.recipebook.toggleRecipes.smokable", + "english_translation": "Showing Smokable" + }, + { + "key": "subtitles.entity.sniffer.sniffing", + "english_translation": "Sniffer sniffs" + }, + { + "key": "stat.minecraft.damage_taken", + "english_translation": "Damage Taken" + }, + { + "key": "block.minecraft.banner.square_bottom_right.red", + "english_translation": "Red Base Sinister Canton" + }, + { + "key": "generator.minecraft.single_biome_surface", + "english_translation": "Single Biome" + }, + { + "key": "createWorld.customize.custom.biomeDepthOffset", + "english_translation": "Biome Depth Offset" + }, + { + "key": "advancements.husbandry.fishy_business.description", + "english_translation": "Catch a fish" + }, + { + "key": "selectServer.deleteButton", + "english_translation": "Delete" + }, + { + "key": "subtitles.entity.evoker.ambient", + "english_translation": "Evoker murmurs" + }, + { + "key": "block.minecraft.pink_stained_glass_pane", + "english_translation": "Pink Stained Glass Pane" + }, + { + "key": "enchantment.minecraft.unbreaking", + "english_translation": "Unbreaking" + }, + { + "key": "item.minecraft.music_disc_blocks", + "english_translation": "Music Disc" + }, + { + "key": "createWorld.customize.custom.upperLimitScale", + "english_translation": "Upper Limit Scale" + }, + { + "key": "item.minecraft.lava_bucket", + "english_translation": "Lava Bucket" + }, + { + "key": "block.minecraft.oak_log", + "english_translation": "Oak Log" + }, + { + "key": "subtitles.entity.glow_squid.ambient", + "english_translation": "Glow Squid swims" + }, + { + "key": "commands.experience.add.levels.success.multiple", + "english_translation": "Gave %s experience levels to %s players" + }, + { + "key": "dataPack.title", + "english_translation": "Select Data Packs" + }, + { + "key": "block.minecraft.jungle_hanging_sign", + "english_translation": "Jungle Hanging Sign" + }, + { + "key": "commands.scoreboard.players.reset.specific.single", + "english_translation": "Reset %s for %s" + }, + { + "key": "item.minecraft.angler_pottery_shard", + "english_translation": "Angler Pottery Shard" + }, + { + "key": "selectWorld.targetFolder", + "english_translation": "Save folder: %s" + }, + { + "key": "mco.configure.world.spawn_toggle.title", + "english_translation": "Warning!" + }, + { + "key": "chat.type.advancement.challenge", + "english_translation": "%s has completed the challenge %s" + }, + { + "key": "createWorld.customize.custom.waterLakeChance", + "english_translation": "Water Lake Rarity" + }, + { + "key": "datapackFailure.safeMode.failed.description", + "english_translation": "This world contains invalid or corrupted save data." + }, + { + "key": "block.minecraft.potted_oak_sapling", + "english_translation": "Potted Oak Sapling" + }, + { + "key": "subtitles.entity.arrow.shoot", + "english_translation": "Arrow fired" + }, + { + "key": "item.durability", + "english_translation": "Durability: %s / %s" + }, + { + "key": "item.minecraft.wither_spawn_egg", + "english_translation": "Wither Spawn Egg" + }, + { + "key": "painting.minecraft.aztec.title", + "english_translation": "de_aztec" + }, + { + "key": "item.minecraft.command_block_minecart", + "english_translation": "Minecart with Command Block" + }, + { + "key": "block.minecraft.honey_block", + "english_translation": "Honey Block" + }, + { + "key": "credits_and_attribution.button.credits", + "english_translation": "Credits" + }, + { + "key": "entity.minecraft.chest_minecart", + "english_translation": "Minecart with Chest" + }, + { + "key": "multiplayer.disconnect.invalid_player_data", + "english_translation": "Invalid player data" + }, + { + "key": "subtitles.entity.piglin.converted_to_zombified", + "english_translation": "Piglin converts to Zombified Piglin" + }, + { + "key": "telemetry.property.render_time_samples.title", + "english_translation": "Render Time Samples" + }, + { + "key": "block.minecraft.lime_terracotta", + "english_translation": "Lime Terracotta" + }, + { + "key": "item.minecraft.shield", + "english_translation": "Shield" + }, + { + "key": "realms.missing.snapshot.error.text", + "english_translation": "Realms is currently not supported in snapshots" + }, + { + "key": "item.minecraft.pottery_shard_prize", + "english_translation": "Prize Pottery Shard" + }, + { + "key": "mco.configure.world.slot.tooltip.active", + "english_translation": "Join" + }, + { + "key": "block.minecraft.repeating_command_block", + "english_translation": "Repeating Command Block" + }, + { + "key": "block.minecraft.chiseled_bookshelf", + "english_translation": "Chiseled Bookshelf" + }, + { + "key": "arguments.block.tag.unknown", + "english_translation": "Unknown block tag '%s'" + }, + { + "key": "block.minecraft.red_nether_brick_wall", + "english_translation": "Red Nether Brick Wall" + }, + { + "key": "commands.worldborder.set.grow", + "english_translation": "Growing the world border to %s blocks wide over %s seconds" + }, + { + "key": "block.minecraft.purple_stained_glass", + "english_translation": "Purple Stained Glass" + }, + { + "key": "subtitles.block.pumpkin.carve", + "english_translation": "Shears carve" + }, + { + "key": "block.minecraft.banner.triangles_bottom.pink", + "english_translation": "Pink Base Indented" + }, + { + "key": "block.minecraft.peony", + "english_translation": "Peony" + }, + { + "key": "narrator.select.world", + "english_translation": "Selected %s, last played: %s, %s, %s, version: %s" + }, + { + "key": "item.minecraft.mojang_banner_pattern", + "english_translation": "Banner Pattern" + }, + { + "key": "commands.recipe.give.success.multiple", + "english_translation": "Unlocked %s recipes for %s players" + }, + { + "key": "commands.forceload.query.failure", + "english_translation": "Chunk at %s in %s is not marked for force loading" + }, + { + "key": "block.minecraft.potted_birch_sapling", + "english_translation": "Potted Birch Sapling" + }, + { + "key": "commands.damage.success", + "english_translation": "Applied %s damage to %s" + }, + { + "key": "advancements.adventure.trade_at_world_height.description", + "english_translation": "Trade with a Villager at the build height limit" + }, + { + "key": "subtitles.chiseled_bookshelf.take_enchanted", + "english_translation": "Enchanted Book taken" + }, + { + "key": "block.minecraft.mud_brick_wall", + "english_translation": "Mud Brick Wall" + }, + { + "key": "subtitles.block.comparator.click", + "english_translation": "Comparator clicks" + }, + { + "key": "subtitles.entity.potion.splash", + "english_translation": "Bottle smashes" + }, + { + "key": "flat_world_preset.minecraft.tunnelers_dream", + "english_translation": "Tunnelers' Dream" + }, + { + "key": "item.minecraft.tipped_arrow.effect.luck", + "english_translation": "Arrow of Luck" + }, + { + "key": "gui.socialInteractions.report", + "english_translation": "Report" + }, + { + "key": "key.keyboard.num.lock", + "english_translation": "Num Lock" + }, + { + "key": "item.minecraft.torchflower_seeds", + "english_translation": "Torchflower Seeds" + }, + { + "key": "selectWorld.edit.backup", + "english_translation": "Make Backup" + }, + { + "key": "item.minecraft.enchanted_golden_apple", + "english_translation": "Enchanted Golden Apple" + }, + { + "key": "subtitles.entity.fox.spit", + "english_translation": "Fox spits" + }, + { + "key": "commands.gamerule.query", + "english_translation": "Gamerule %s is currently set to: %s" + }, + { + "key": "block.minecraft.birch_wall_hanging_sign", + "english_translation": "Birch Wall Hanging Sign" + }, + { + "key": "title.multiplayer.other", + "english_translation": "Multiplayer (3rd-party Server)" + }, + { + "key": "subtitles.item.armor.equip_leather", + "english_translation": "Leather armor rustles" + }, + { + "key": "parsing.bool.invalid", + "english_translation": "Invalid boolean, expected 'true' or 'false' but found '%s'" + }, + { + "key": "subtitles.entity.hoglin.attack", + "english_translation": "Hoglin attacks" + }, + { + "key": "item.minecraft.cocoa_beans", + "english_translation": "Cocoa Beans" + }, + { + "key": "block.minecraft.brown_stained_glass", + "english_translation": "Brown Stained Glass" + }, + { + "key": "multiplayer.disconnect.unverified_username", + "english_translation": "Failed to verify username!" + }, + { + "key": "block.minecraft.mangrove_fence", + "english_translation": "Mangrove Fence" + }, + { + "key": "narration.checkbox.usage.hovered", + "english_translation": "Left click to toggle" + }, + { + "key": "block.minecraft.dead_tube_coral_fan", + "english_translation": "Dead Tube Coral Fan" + }, + { + "key": "block.minecraft.prismarine_stairs", + "english_translation": "Prismarine Stairs" + }, + { + "key": "resourcePack.load_fail", + "english_translation": "Resource reload failed" + }, + { + "key": "mco.configure.world.buttons.invite", + "english_translation": "Invite player" + }, + { + "key": "block.minecraft.cut_red_sandstone_slab", + "english_translation": "Cut Red Sandstone Slab" + }, + { + "key": "block.minecraft.banner.square_bottom_right.green", + "english_translation": "Green Base Sinister Canton" + }, + { + "key": "mco.configure.world.subscription.recurring.info", + "english_translation": "Changes made to your Realms subscription such as stacking time or turning off recurring billing will not be reflected until your next bill date." + }, + { + "key": "key.keyboard.backslash", + "english_translation": "\\" + }, + { + "key": "commands.worldborder.damage.amount.failed", + "english_translation": "Nothing changed. The world border damage is already that amount" + }, + { + "key": "block.minecraft.dead_bush", + "english_translation": "Dead Bush" + }, + { + "key": "translation.test.invalid2", + "english_translation": "hi % s" + }, + { + "key": "telemetry.property.load_time_pre_window_ms.title", + "english_translation": "Time Before Window Opens (Milliseconds)" + }, + { + "key": "block.minecraft.banner.half_horizontal_bottom.orange", + "english_translation": "Orange Per Fess Inverted" + }, + { + "key": "block.minecraft.banner.half_vertical.yellow", + "english_translation": "Yellow Per Pale" + }, + { + "key": "selectServer.add", + "english_translation": "Add Server" + }, + { + "key": "entity.minecraft.skeleton_horse", + "english_translation": "Skeleton Horse" + }, + { + "key": "subtitles.entity.evoker_fangs.attack", + "english_translation": "Fangs snap" + }, + { + "key": "death.attack.indirectMagic", + "english_translation": "%1$s was killed by %2$s using magic" + }, + { + "key": "options.renderDistance", + "english_translation": "Render Distance" + }, + { + "key": "item.minecraft.music_disc_far.desc", + "english_translation": "C418 - far" + }, + { + "key": "title.multiplayer.disabled.banned.permanent", + "english_translation": "Your account is permanently suspended from online play" + }, + { + "key": "block.minecraft.banner.piglin.gray", + "english_translation": "Gray Snout" + }, + { + "key": "attribute.name.generic.attack_damage", + "english_translation": "Attack Damage" + }, + { + "key": "item.minecraft.netherite_ingot", + "english_translation": "Netherite Ingot" + }, + { + "key": "mco.configure.world.name", + "english_translation": "Realm name" + }, + { + "key": "chat.disabled.expiredProfileKey", + "english_translation": "Chat disabled due to expired profile public key. Please try reconnecting." + }, + { + "key": "advancements.end.levitate.description", + "english_translation": "Levitate up 50 blocks from the attacks of a Shulker" + }, + { + "key": "advancements.story.enchant_item.description", + "english_translation": "Enchant an item at an Enchanting Table" + }, + { + "key": "subtitles.entity.frog.hurt", + "english_translation": "Frog hurts" + }, + { + "key": "block.minecraft.rail", + "english_translation": "Rail" + }, + { + "key": "item.minecraft.stone_axe", + "english_translation": "Stone Axe" + }, + { + "key": "argument.pos.outofbounds", + "english_translation": "That position is outside the allowed boundaries." + }, + { + "key": "block.minecraft.bamboo_wall_sign", + "english_translation": "Bamboo Wall Sign" + }, + { + "key": "item.minecraft.bread", + "english_translation": "Bread" + }, + { + "key": "block.minecraft.banner.triangle_top.white", + "english_translation": "White Inverted Chevron" + }, + { + "key": "mco.configure.world.buttons.options", + "english_translation": "World options" + }, + { + "key": "block.minecraft.jungle_fence_gate", + "english_translation": "Jungle Fence Gate" + }, + { + "key": "multiplayer.status.ping", + "english_translation": "%s ms" + }, + { + "key": "gamerule.doFireTick", + "english_translation": "Update fire" + }, + { + "key": "subtitles.block.conduit.attack.target", + "english_translation": "Conduit attacks" + }, + { + "key": "entity.minecraft.witch", + "english_translation": "Witch" + }, + { + "key": "gamerule.universalAnger.description", + "english_translation": "Angered neutral mobs attack any nearby player, not just the player that angered them. Works best if forgiveDeadPlayers is disabled." + }, + { + "key": "gui.toMenu", + "english_translation": "Back to Server List" + }, + { + "key": "block.minecraft.banner.rhombus.yellow", + "english_translation": "Yellow Lozenge" + }, + { + "key": "block.minecraft.smooth_sandstone", + "english_translation": "Smooth Sandstone" + }, + { + "key": "mco.configure.world.forceGameMode", + "english_translation": "Force game mode" + }, + { + "key": "chat.filtered_full", + "english_translation": "The server has hidden your message for some players." + }, + { + "key": "itemGroup.spawnEggs", + "english_translation": "Spawn Eggs" + }, + { + "key": "debug.crash.warning", + "english_translation": "Crashing in %s..." + }, + { + "key": "advancements.adventure.spyglass_at_dragon.description", + "english_translation": "Look at the Ender Dragon through a Spyglass" + }, + { + "key": "block.minecraft.jungle_wood", + "english_translation": "Jungle Wood" + }, + { + "key": "subtitles.entity.polar_bear.warning", + "english_translation": "Polar Bear roars" + }, + { + "key": "painting.minecraft.fighters.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "entity.minecraft.wither", + "english_translation": "Wither" + }, + { + "key": "item.minecraft.music_disc_stal.desc", + "english_translation": "C418 - stal" + }, + { + "key": "item.minecraft.cow_spawn_egg", + "english_translation": "Cow Spawn Egg" + }, + { + "key": "block.minecraft.reinforced_deepslate", + "english_translation": "Reinforced Deepslate" + }, + { + "key": "subtitles.item.brush.brushing.sand", + "english_translation": "Brushing Sand" + }, + { + "key": "commands.title.show.subtitle.multiple", + "english_translation": "Showing new subtitle for %s players" + }, + { + "key": "item.minecraft.skeleton_spawn_egg", + "english_translation": "Skeleton Spawn Egg" + }, + { + "key": "commands.bossbar.set.style.success", + "english_translation": "Custom bossbar %s has changed style" + }, + { + "key": "container.blast_furnace", + "english_translation": "Blast Furnace" + }, + { + "key": "enchantment.minecraft.respiration", + "english_translation": "Respiration" + }, + { + "key": "block.minecraft.cherry_door", + "english_translation": "Cherry Door" + }, + { + "key": "death.attack.explosion.player", + "english_translation": "%1$s was blown up by %2$s" + }, + { + "key": "subtitles.entity.glow_item_frame.rotate_item", + "english_translation": "Glow Item Frame clicks" + }, + { + "key": "block.minecraft.banner.stripe_center.magenta", + "english_translation": "Magenta Pale" + }, + { + "key": "block.minecraft.mud", + "english_translation": "Mud" + }, + { + "key": "effect.minecraft.luck", + "english_translation": "Luck" + }, + { + "key": "block.minecraft.chiseled_sandstone", + "english_translation": "Chiseled Sandstone" + }, + { + "key": "options.fullscreen", + "english_translation": "Fullscreen" + }, + { + "key": "subtitles.entity.wither.spawn", + "english_translation": "Wither released" + }, + { + "key": "options.difficulty.peaceful", + "english_translation": "Peaceful" + }, + { + "key": "subtitles.entity.hoglin.angry", + "english_translation": "Hoglin growls angrily" + }, + { + "key": "death.attack.hotFloor", + "english_translation": "%1$s discovered the floor was lava" + }, + { + "key": "team.notFound", + "english_translation": "Unknown team '%s'" + }, + { + "key": "selectWorld.enterName", + "english_translation": "World Name" + }, + { + "key": "block.minecraft.infested_stone", + "english_translation": "Infested Stone" + }, + { + "key": "debug.advanced_tooltips.help", + "english_translation": "F3 + H = Advanced tooltips" + }, + { + "key": "subtitles.entity.tropical_fish.hurt", + "english_translation": "Tropical Fish hurts" + }, + { + "key": "death.attack.wither.player", + "english_translation": "%1$s withered away whilst fighting %2$s" + }, + { + "key": "itemGroup.coloredBlocks", + "english_translation": "Colored Blocks" + }, + { + "key": "painting.minecraft.bomb.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "telemetry.property.used_memory_samples.title", + "english_translation": "Used Random Access Memory" + }, + { + "key": "stat.minecraft.horse_one_cm", + "english_translation": "Distance by Horse" + }, + { + "key": "block.minecraft.jigsaw", + "english_translation": "Jigsaw Block" + }, + { + "key": "subtitles.block.respawn_anchor.charge", + "english_translation": "Respawn Anchor is charged" + }, + { + "key": "subtitles.entity.blaze.death", + "english_translation": "Blaze dies" + }, + { + "key": "gui.socialInteractions.empty_hidden", + "english_translation": "No players hidden in chat" + }, + { + "key": "commands.advancement.grant.criterion.to.many.failure", + "english_translation": "Couldn't grant criterion '%s' of advancement %s to %s players as they already have it" + }, + { + "key": "options.graphics.warning.vendor", + "english_translation": "Vendor detected: [%s]" + }, + { + "key": "selectWorld.locked", + "english_translation": "Locked by another running instance of Minecraft" + }, + { + "key": "demo.help.movement", + "english_translation": "Use the %1$s, %2$s, %3$s, %4$s keys and the mouse to move around" + }, + { + "key": "mco.configure.world.invites.ops.tooltip", + "english_translation": "Operator" + }, + { + "key": "block.minecraft.dead_brain_coral_block", + "english_translation": "Dead Brain Coral Block" + }, + { + "key": "gui.abuseReport.reason.child_sexual_exploitation_or_abuse", + "english_translation": "Child sexual exploitation or abuse" + }, + { + "key": "block.minecraft.fire_coral_fan", + "english_translation": "Fire Coral Fan" + }, + { + "key": "generator.minecraft.amplified.info", + "english_translation": "Notice: Just for fun! Requires a beefy computer." + }, + { + "key": "subtitles.entity.dolphin.attack", + "english_translation": "Dolphin attacks" + }, + { + "key": "block.minecraft.acacia_door", + "english_translation": "Acacia Door" + }, + { + "key": "item.minecraft.shield.orange", + "english_translation": "Orange Shield" + }, + { + "key": "block.minecraft.blue_terracotta", + "english_translation": "Blue Terracotta" + }, + { + "key": "block.minecraft.soul_soil", + "english_translation": "Soul Soil" + }, + { + "key": "block.minecraft.orange_stained_glass_pane", + "english_translation": "Orange Stained Glass Pane" + }, + { + "key": "subtitles.entity.villager.work_leatherworker", + "english_translation": "Leatherworker works" + }, + { + "key": "controls.resetAll", + "english_translation": "Reset Keys" + }, + { + "key": "telemetry.event.advancement_made.title", + "english_translation": "Advancement Made" + }, + { + "key": "telemetry.property.opt_in.title", + "english_translation": "Opt-In" + }, + { + "key": "lanServer.port", + "english_translation": "Port Number" + }, + { + "key": "block.minecraft.banner.square_top_left.cyan", + "english_translation": "Cyan Chief Dexter Canton" + }, + { + "key": "item.minecraft.danger_pottery_sherd", + "english_translation": "Danger Pottery Sherd" + }, + { + "key": "block.minecraft.banner.curly_border.white", + "english_translation": "White Bordure Indented" + }, + { + "key": "entity.minecraft.tropical_fish.type.clayfish", + "english_translation": "Clayfish" + }, + { + "key": "block.minecraft.banner.stripe_right.light_gray", + "english_translation": "Light Gray Pale Sinister" + }, + { + "key": "subtitles.block.portal.trigger", + "english_translation": "Portal noise intensifies" + }, + { + "key": "effect.minecraft.mining_fatigue", + "english_translation": "Mining Fatigue" + }, + { + "key": "demo.day.warning", + "english_translation": "Your time is almost up!" + }, + { + "key": "gui.banned.description.temporary", + "english_translation": "%s Until then, you can’t play online or join Realms." + }, + { + "key": "block.minecraft.banner.stripe_left.yellow", + "english_translation": "Yellow Pale Dexter" + }, + { + "key": "key.keyboard.left.control", + "english_translation": "Left Control" + }, + { + "key": "commands.datapack.disable.failed", + "english_translation": "Pack '%s' is not enabled!" + }, + { + "key": "block.minecraft.piglin_wall_head", + "english_translation": "Piglin Wall Head" + }, + { + "key": "block.minecraft.oxidized_cut_copper_stairs", + "english_translation": "Oxidized Cut Copper Stairs" + }, + { + "key": "item.minecraft.firework_star.shape.star", + "english_translation": "Star-shaped" + }, + { + "key": "block.minecraft.wither_skeleton_skull", + "english_translation": "Wither Skeleton Skull" + }, + { + "key": "item.minecraft.raw_copper", + "english_translation": "Raw Copper" + }, + { + "key": "block.minecraft.mangrove_log", + "english_translation": "Mangrove Log" + }, + { + "key": "death.attack.sting", + "english_translation": "%1$s was stung to death" + }, + { + "key": "item.minecraft.silverfish_spawn_egg", + "english_translation": "Silverfish Spawn Egg" + }, + { + "key": "block.minecraft.mangrove_stairs", + "english_translation": "Mangrove Stairs" + }, + { + "key": "subtitles.entity.creeper.hurt", + "english_translation": "Creeper hurts" + }, + { + "key": "structure_block.load_not_found", + "english_translation": "Structure '%s' is not available" + }, + { + "key": "optimizeWorld.stage.failed", + "english_translation": "Failed! :(" + }, + { + "key": "block.minecraft.banner.diagonal_up_left.purple", + "english_translation": "Purple Per Bend Inverted" + }, + { + "key": "key.keyboard.left.win", + "english_translation": "Left Win" + }, + { + "key": "advancements.adventure.walk_on_powder_snow_with_leather_boots.description", + "english_translation": "Walk on Powder Snow... without sinking in it" + }, + { + "key": "block.minecraft.allium", + "english_translation": "Allium" + }, + { + "key": "multiplayer.unsecureserver.toast", + "english_translation": "Messages sent on this server may be modified and might not reflect the original message" + }, + { + "key": "stat.minecraft.inspect_dispenser", + "english_translation": "Dispensers Searched" + }, + { + "key": "block.minecraft.loom", + "english_translation": "Loom" + }, + { + "key": "selectWorld.experimental.details.title", + "english_translation": "Experimental feature requirements" + }, + { + "key": "telemetry.property.dedicated_memory_kb.title", + "english_translation": "Dedicated Memory (kB)" + }, + { + "key": "particle.notFound", + "english_translation": "Unknown particle: %s" + }, + { + "key": "block.minecraft.banner.border.lime", + "english_translation": "Lime Bordure" + }, + { + "key": "subtitles.entity.creeper.death", + "english_translation": "Creeper dies" + }, + { + "key": "block.minecraft.banner.mojang.magenta", + "english_translation": "Magenta Thing" + }, + { + "key": "selectWorld.gameMode.survival.line1", + "english_translation": "Search for resources, craft, gain" + }, + { + "key": "subtitles.entity.piglin_brute.step", + "english_translation": "Piglin Brute steps" + }, + { + "key": "selectWorld.gameMode.survival.line2", + "english_translation": "levels, health and hunger" + }, + { + "key": "trim_pattern.minecraft.wild", + "english_translation": "Wild Armor Trim" + }, + { + "key": "block.minecraft.spawn.not_valid", + "english_translation": "You have no home bed or charged respawn anchor, or it was obstructed" + }, + { + "key": "advancements.nether.obtain_ancient_debris.description", + "english_translation": "Obtain Ancient Debris" + }, + { + "key": "chat.type.team.sent", + "english_translation": "-> %s <%s> %s" + }, + { + "key": "mco.template.default.name", + "english_translation": "World template" + }, + { + "key": "subtitles.block.bubble_column.upwards_ambient", + "english_translation": "Bubbles flow" + }, + { + "key": "commands.scoreboard.players.list.entity.entry", + "english_translation": "%s: %s" + }, + { + "key": "commands.give.success.single", + "english_translation": "Gave %s %s to %s" + }, + { + "key": "subtitles.entity.generic.big_fall", + "english_translation": "Something fell" + }, + { + "key": "subtitles.entity.bee.sting", + "english_translation": "Bee stings" + }, + { + "key": "commands.data.storage.query", + "english_translation": "Storage %s has the following contents: %s" + }, + { + "key": "gamerule.globalSoundEvents", + "english_translation": "Global sound events" + }, + { + "key": "selectWorld.edit.title", + "english_translation": "Edit World" + }, + { + "key": "block.minecraft.banner.stripe_top.black", + "english_translation": "Black Chief" + }, + { + "key": "death.attack.fallingBlock.player", + "english_translation": "%1$s was squashed by a falling block whilst fighting %2$s" + }, + { + "key": "mco.configure.world.invite.narration", + "english_translation": "You have %s new invite(s)" + }, + { + "key": "spectatorMenu.team_teleport.prompt", + "english_translation": "Select a team to teleport to" + }, + { + "key": "block.minecraft.rose_bush", + "english_translation": "Rose Bush" + }, + { + "key": "block.minecraft.iron_bars", + "english_translation": "Iron Bars" + }, + { + "key": "commands.worldborder.damage.amount.success", + "english_translation": "Set the world border damage to %s per block each second" + }, + { + "key": "block.minecraft.banner.small_stripes.gray", + "english_translation": "Gray Paly" + }, + { + "key": "commands.advancement.grant.one.to.one.success", + "english_translation": "Granted the advancement %s to %s" + }, + { + "key": "mco.backup.entry.seed", + "english_translation": "Seed" + }, + { + "key": "commands.drop.success.single", + "english_translation": "Dropped %s %s" + }, + { + "key": "block.minecraft.banner.diagonal_left.light_gray", + "english_translation": "Light Gray Per Bend Sinister" + }, + { + "key": "options.narrator.system", + "english_translation": "Narrates System" + }, + { + "key": "death.attack.explosion.player.item", + "english_translation": "%1$s was blown up by %2$s using %3$s" + }, + { + "key": "entity.minecraft.tropical_fish.type.brinely", + "english_translation": "Brinely" + }, + { + "key": "item.minecraft.blaze_powder", + "english_translation": "Blaze Powder" + }, + { + "key": "tutorial.bundleInsert.description", + "english_translation": "Right Click to add items" + }, + { + "key": "chat.type.advancement.task", + "english_translation": "%s has made the advancement %s" + }, + { + "key": "disconnect.quitting", + "english_translation": "Quitting" + }, + { + "key": "block.minecraft.quartz_slab", + "english_translation": "Quartz Slab" + }, + { + "key": "block.minecraft.banner.half_horizontal_bottom.light_blue", + "english_translation": "Light Blue Per Fess Inverted" + }, + { + "key": "effect.minecraft.slow_falling", + "english_translation": "Slow Falling" + }, + { + "key": "subtitles.entity.glow_squid.hurt", + "english_translation": "Glow Squid hurts" + }, + { + "key": "commands.spectate.not_spectator", + "english_translation": "%s is not in spectator mode" + }, + { + "key": "block.minecraft.yellow_candle_cake", + "english_translation": "Cake with Yellow Candle" + }, + { + "key": "commands.perf.reportSaved", + "english_translation": "Created debug report in %s" + }, + { + "key": "advancements.empty", + "english_translation": "There doesn't seem to be anything here..." + }, + { + "key": "block.minecraft.acacia_stairs", + "english_translation": "Acacia Stairs" + }, + { + "key": "block.minecraft.dark_oak_sign", + "english_translation": "Dark Oak Sign" + }, + { + "key": "block.minecraft.jack_o_lantern", + "english_translation": "Jack o'Lantern" + }, + { + "key": "block.minecraft.banner.square_bottom_right.magenta", + "english_translation": "Magenta Base Sinister Canton" + }, + { + "key": "block.minecraft.lime_wool", + "english_translation": "Lime Wool" + }, + { + "key": "item.minecraft.shield.light_gray", + "english_translation": "Light Gray Shield" + }, + { + "key": "item.minecraft.wooden_shovel", + "english_translation": "Wooden Shovel" + }, + { + "key": "key.keyboard.end", + "english_translation": "End" + }, + { + "key": "block.minecraft.deepslate_brick_wall", + "english_translation": "Deepslate Brick Wall" + }, + { + "key": "item.minecraft.green_dye", + "english_translation": "Green Dye" + }, + { + "key": "block.minecraft.banner.border.blue", + "english_translation": "Blue Bordure" + }, + { + "key": "block.minecraft.crimson_planks", + "english_translation": "Crimson Planks" + }, + { + "key": "block.minecraft.sandstone_wall", + "english_translation": "Sandstone Wall" + }, + { + "key": "item.minecraft.potion.effect.strength", + "english_translation": "Potion of Strength" + }, + { + "key": "subtitles.entity.parrot.imitate.shulker", + "english_translation": "Parrot lurks" + }, + { + "key": "block.minecraft.carved_pumpkin", + "english_translation": "Carved Pumpkin" + }, + { + "key": "commands.datapack.modify.enable", + "english_translation": "Enabling data pack %s" + }, + { + "key": "block.minecraft.banner.stripe_downright.red", + "english_translation": "Red Bend" + }, + { + "key": "item.minecraft.shield.white", + "english_translation": "White Shield" + }, + { + "key": "block.minecraft.potted_acacia_sapling", + "english_translation": "Potted Acacia Sapling" + }, + { + "key": "commands.stopsound.success.sourceless.any", + "english_translation": "Stopped all sounds" + }, + { + "key": "block.minecraft.weathered_cut_copper_stairs", + "english_translation": "Weathered Cut Copper Stairs" + }, + { + "key": "block.minecraft.nether_brick_stairs", + "english_translation": "Nether Brick Stairs" + }, + { + "key": "argument.entity.selector.unknown", + "english_translation": "Unknown selector type '%s'" + }, + { + "key": "advancements.story.obtain_armor.description", + "english_translation": "Protect yourself with a piece of iron armor" + }, + { + "key": "commands.experience.set.points.invalid", + "english_translation": "Cannot set experience points above the maximum points for the player's current level" + }, + { + "key": "entity.minecraft.pig", + "english_translation": "Pig" + }, + { + "key": "commands.advancement.criterionNotFound", + "english_translation": "The advancement %1$s does not contain the criterion '%2$s'" + }, + { + "key": "mco.configure.worlds.title", + "english_translation": "Worlds" + }, + { + "key": "dataPack.validation.reset", + "english_translation": "Reset to Default" + }, + { + "key": "commands.stopsound.success.source.any", + "english_translation": "Stopped all '%s' sounds" + }, + { + "key": "block.minecraft.banner.stripe_bottom.lime", + "english_translation": "Lime Base" + }, + { + "key": "block.minecraft.banner.square_top_right.brown", + "english_translation": "Brown Chief Sinister Canton" + }, + { + "key": "commands.teleport.success.entity.multiple", + "english_translation": "Teleported %s entities to %s" + }, + { + "key": "entity.minecraft.falling_block", + "english_translation": "Falling Block" + }, + { + "key": "item.minecraft.debug_stick.empty", + "english_translation": "%s has no properties" + }, + { + "key": "subtitles.entity.donkey.chest", + "english_translation": "Donkey Chest equips" + }, + { + "key": "entity.minecraft.villager", + "english_translation": "Villager" + }, + { + "key": "advancements.husbandry.wax_off.title", + "english_translation": "Wax Off" + }, + { + "key": "item.minecraft.firework_star.shape.burst", + "english_translation": "Burst" + }, + { + "key": "gui.chatSelection.message.narrate", + "english_translation": "%s said: %s at %s" + }, + { + "key": "block.minecraft.banner.flower.pink", + "english_translation": "Pink Flower Charge" + }, + { + "key": "item.minecraft.axolotl_spawn_egg", + "english_translation": "Axolotl Spawn Egg" + }, + { + "key": "gamerule.lavaSourceConversion.description", + "english_translation": "When flowing lava is surrounded on two sides by lava sources it converts into a source." + }, + { + "key": "subtitles.block.composter.ready", + "english_translation": "Composter composts" + }, + { + "key": "subtitles.entity.warden.hurt", + "english_translation": "Warden hurts" + }, + { + "key": "biome.minecraft.sunflower_plains", + "english_translation": "Sunflower Plains" + }, + { + "key": "chat.type.text", + "english_translation": "<%s> %s" + }, + { + "key": "menu.returnToGame", + "english_translation": "Back to Game" + }, + { + "key": "commands.attribute.base_value.get.success", + "english_translation": "Base value of attribute %s for entity %s is %s" + }, + { + "key": "item.minecraft.compass", + "english_translation": "Compass" + }, + { + "key": "mco.reset.world.upload", + "english_translation": "Upload world" + }, + { + "key": "subtitles.entity.zombie_villager.converted", + "english_translation": "Zombie Villager vociferates" + }, + { + "key": "key.keyboard.home", + "english_translation": "Home" + }, + { + "key": "painting.minecraft.plant.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "connect.encrypting", + "english_translation": "Encrypting..." + }, + { + "key": "options.invertMouse", + "english_translation": "Invert Mouse" + }, + { + "key": "gui.chatReport.draft.edit", + "english_translation": "Continue Editing" + }, + { + "key": "block.minecraft.redstone_block", + "english_translation": "Block of Redstone" + }, + { + "key": "item.minecraft.melon_slice", + "english_translation": "Melon Slice" + }, + { + "key": "block.minecraft.acacia_hanging_sign", + "english_translation": "Acacia Hanging Sign" + }, + { + "key": "block.minecraft.zombie_wall_head", + "english_translation": "Zombie Wall Head" + }, + { + "key": "stat.minecraft.fill_cauldron", + "english_translation": "Cauldrons Filled" + }, + { + "key": "block.minecraft.polished_deepslate_stairs", + "english_translation": "Polished Deepslate Stairs" + }, + { + "key": "tutorial.look.description", + "english_translation": "Use your mouse to turn" + }, + { + "key": "container.shulkerBox.more", + "english_translation": "and %s more..." + }, + { + "key": "debug.profiling.help", + "english_translation": "F3 + L = Start/stop profiling" + }, + { + "key": "item.minecraft.paper", + "english_translation": "Paper" + }, + { + "key": "entity.minecraft.villager.cartographer", + "english_translation": "Cartographer" + }, + { + "key": "block.minecraft.smooth_stone", + "english_translation": "Smooth Stone" + }, + { + "key": "argument.entity.options.name.description", + "english_translation": "Entity name" + }, + { + "key": "subtitles.entity.vindicator.celebrate", + "english_translation": "Vindicator cheers" + }, + { + "key": "item.minecraft.brush", + "english_translation": "Brush" + }, + { + "key": "block.minecraft.banner.stripe_bottom.blue", + "english_translation": "Blue Base" + }, + { + "key": "subtitles.entity.llama.death", + "english_translation": "Llama dies" + }, + { + "key": "item.minecraft.globe_banner_pattern.desc", + "english_translation": "Globe" + }, + { + "key": "language.region", + "english_translation": "United States" + }, + { + "key": "narration.cycle_button.usage.focused", + "english_translation": "Press Enter to switch to %s" + }, + { + "key": "subtitles.entity.wandering_trader.ambient", + "english_translation": "Wandering Trader mumbles" + }, + { + "key": "block.minecraft.banner.straight_cross.lime", + "english_translation": "Lime Cross" + }, + { + "key": "stat.minecraft.play_record", + "english_translation": "Music Discs Played" + }, + { + "key": "effect.minecraft.poison", + "english_translation": "Poison" + }, + { + "key": "block.minecraft.crimson_stem", + "english_translation": "Crimson Stem" + }, + { + "key": "advancements.husbandry.plant_any_sniffer_seed.title", + "english_translation": "Planting the Past" + }, + { + "key": "selectWorld.search", + "english_translation": "search for worlds" + }, + { + "key": "block.minecraft.banner.bricks.brown", + "english_translation": "Brown Field Masoned" + }, + { + "key": "realms.missing.module.error.text", + "english_translation": "Realms could not be opened right now, please try again later" + }, + { + "key": "block.minecraft.mangrove_wall_sign", + "english_translation": "Mangrove Wall Sign" + }, + { + "key": "item.minecraft.netherite_shovel", + "english_translation": "Netherite Shovel" + }, + { + "key": "stat.minecraft.swim_one_cm", + "english_translation": "Distance Swum" + }, + { + "key": "narrator.toast.enabled", + "english_translation": "Narrator Enabled" + }, + { + "key": "item.minecraft.piglin_spawn_egg", + "english_translation": "Piglin Spawn Egg" + }, + { + "key": "options.modelPart.jacket", + "english_translation": "Jacket" + }, + { + "key": "argument.block.id.invalid", + "english_translation": "Unknown block type '%s'" + }, + { + "key": "block.minecraft.crafting_table", + "english_translation": "Crafting Table" + }, + { + "key": "block.minecraft.red_glazed_terracotta", + "english_translation": "Red Glazed Terracotta" + }, + { + "key": "block.minecraft.banner.globe.pink", + "english_translation": "Pink Globe" + }, + { + "key": "block.minecraft.banner.diagonal_up_left.white", + "english_translation": "White Per Bend Inverted" + }, + { + "key": "selectWorld.tooltip.snapshot1", + "english_translation": "Don't forget to back up this world" + }, + { + "key": "selectWorld.tooltip.snapshot2", + "english_translation": "before you load it in this snapshot." + }, + { + "key": "block.minecraft.coal_ore", + "english_translation": "Coal Ore" + }, + { + "key": "argument.pos.outofworld", + "english_translation": "That position is out of this world!" + }, + { + "key": "item.minecraft.sheaf_pottery_sherd", + "english_translation": "Sheaf Pottery Sherd" + }, + { + "key": "block.minecraft.end_stone_brick_slab", + "english_translation": "End Stone Brick Slab" + }, + { + "key": "item.minecraft.iron_chestplate", + "english_translation": "Iron Chestplate" + }, + { + "key": "key.keyboard.escape", + "english_translation": "Escape" + }, + { + "key": "commands.team.option.seeFriendlyInvisibles.disabled", + "english_translation": "Team %s can no longer see invisible teammates" + }, + { + "key": "stat.minecraft.damage_resisted", + "english_translation": "Damage Resisted" + }, + { + "key": "subtitles.entity.drowned.step", + "english_translation": "Drowned steps" + }, + { + "key": "painting.minecraft.courbet.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "argument.time.tick_count_too_low", + "english_translation": "Tick count must not be less than %s, found %s" + }, + { + "key": "commands.experience.set.points.success.multiple", + "english_translation": "Set %s experience points on %s players" + }, + { + "key": "block.minecraft.cherry_fence_gate", + "english_translation": "Cherry Fence Gate" + }, + { + "key": "block.minecraft.exposed_cut_copper_stairs", + "english_translation": "Exposed Cut Copper Stairs" + }, + { + "key": "subtitles.item.brush.brushing.gravel", + "english_translation": "Brushing Gravel" + }, + { + "key": "mco.brokenworld.nonowner.error", + "english_translation": "Please wait for the realm owner to reset the world" + }, + { + "key": "entity.minecraft.tropical_fish.type.glitter", + "english_translation": "Glitter" + }, + { + "key": "item.minecraft.vindicator_spawn_egg", + "english_translation": "Vindicator Spawn Egg" + }, + { + "key": "mco.configure.world.edit.slot.name", + "english_translation": "World name" + }, + { + "key": "block.minecraft.blast_furnace", + "english_translation": "Blast Furnace" + }, + { + "key": "subtitles.item.totem.use", + "english_translation": "Totem activates" + }, + { + "key": "block.minecraft.black_candle_cake", + "english_translation": "Cake with Black Candle" + }, + { + "key": "options.directionalAudio.off.tooltip", + "english_translation": "Classic Stereo sound" + }, + { + "key": "block.minecraft.attached_melon_stem", + "english_translation": "Attached Melon Stem" + }, + { + "key": "block.minecraft.banner.mojang.white", + "english_translation": "White Thing" + }, + { + "key": "block.minecraft.banner.straight_cross.blue", + "english_translation": "Blue Cross" + }, + { + "key": "block.minecraft.banner.stripe_downright.pink", + "english_translation": "Pink Bend" + }, + { + "key": "mco.configure.world.uninvite.player", + "english_translation": "Are you sure that you want to uninvite '%s'?" + }, + { + "key": "subtitles.entity.generic.small_fall", + "english_translation": "Something trips" + }, + { + "key": "mco.errorMessage.serviceBusy", + "english_translation": "Realms is busy at the moment.\nPlease try connecting to your Realm again in a couple of minutes." + }, + { + "key": "subtitles.entity.warden.agitated", + "english_translation": "Warden groans angrily" + }, + { + "key": "command.failed", + "english_translation": "An unexpected error occurred trying to execute that command" + }, + { + "key": "block.minecraft.lime_bed", + "english_translation": "Lime Bed" + }, + { + "key": "block.minecraft.banner.diagonal_left.brown", + "english_translation": "Brown Per Bend Sinister" + }, + { + "key": "mco.configure.world.pvp", + "english_translation": "PVP" + }, + { + "key": "block.minecraft.spruce_fence_gate", + "english_translation": "Spruce Fence Gate" + }, + { + "key": "block.minecraft.banner.diagonal_up_right.red", + "english_translation": "Red Per Bend Sinister Inverted" + }, + { + "key": "subtitles.entity.polar_bear.death", + "english_translation": "Polar Bear dies" + }, + { + "key": "advancements.husbandry.kill_axolotl_target.title", + "english_translation": "The Healing Power of Friendship!" + }, + { + "key": "entity.minecraft.elder_guardian", + "english_translation": "Elder Guardian" + }, + { + "key": "generator.minecraft.normal", + "english_translation": "Default" + }, + { + "key": "advancements.husbandry.axolotl_in_a_bucket.title", + "english_translation": "The Cutest Predator" + }, + { + "key": "advancements.nether.loot_bastion.description", + "english_translation": "Loot a Chest in a Bastion Remnant" + }, + { + "key": "structure_block.load_success", + "english_translation": "Structure loaded from '%s'" + }, + { + "key": "advancements.husbandry.tame_an_animal.description", + "english_translation": "Tame an animal" + }, + { + "key": "item.minecraft.horse_spawn_egg", + "english_translation": "Horse Spawn Egg" + }, + { + "key": "item.minecraft.zombie_spawn_egg", + "english_translation": "Zombie Spawn Egg" + }, + { + "key": "generator.minecraft.large_biomes", + "english_translation": "Large Biomes" + }, + { + "key": "stat.minecraft.interact_with_brewingstand", + "english_translation": "Interactions with Brewing Stand" + }, + { + "key": "block.minecraft.banner.rhombus.light_gray", + "english_translation": "Light Gray Lozenge" + }, + { + "key": "multiplayer.player.joined", + "english_translation": "%s joined the game" + }, + { + "key": "subtitles.entity.mule.ambient", + "english_translation": "Mule hee-haws" + }, + { + "key": "subtitles.entity.parrot.imitate.zombie", + "english_translation": "Parrot groans" + }, + { + "key": "options.controls", + "english_translation": "Controls..." + }, + { + "key": "entity.minecraft.tropical_fish.type.flopper", + "english_translation": "Flopper" + }, + { + "key": "effect.minecraft.wither", + "english_translation": "Wither" + }, + { + "key": "block.minecraft.banner.diagonal_left.pink", + "english_translation": "Pink Per Bend Sinister" + }, + { + "key": "stat.minecraft.clean_armor", + "english_translation": "Armor Pieces Cleaned" + }, + { + "key": "subtitles.entity.donkey.eat", + "english_translation": "Donkey eats" + }, + { + "key": "subtitles.entity.parrot.imitate.ender_dragon", + "english_translation": "Parrot roars" + }, + { + "key": "block.minecraft.jungle_pressure_plate", + "english_translation": "Jungle Pressure Plate" + }, + { + "key": "block.minecraft.banner.triangle_top.black", + "english_translation": "Black Inverted Chevron" + }, + { + "key": "effect.minecraft.blindness", + "english_translation": "Blindness" + }, + { + "key": "commands.team.option.color.success", + "english_translation": "Updated the color for team %s to %s" + }, + { + "key": "block.minecraft.pink_shulker_box", + "english_translation": "Pink Shulker Box" + }, + { + "key": "subtitles.entity.strider.death", + "english_translation": "Strider dies" + }, + { + "key": "options.operatorItemsTab", + "english_translation": "Operator Items Tab" + }, + { + "key": "block.minecraft.waxed_exposed_cut_copper", + "english_translation": "Waxed Exposed Cut Copper" + }, + { + "key": "item.minecraft.bat_spawn_egg", + "english_translation": "Bat Spawn Egg" + }, + { + "key": "commands.datapack.modify.disable", + "english_translation": "Disabling data pack %s" + }, + { + "key": "item.minecraft.trident", + "english_translation": "Trident" + }, + { + "key": "block.minecraft.acacia_sapling", + "english_translation": "Acacia Sapling" + }, + { + "key": "block.minecraft.dragon_head", + "english_translation": "Dragon Head" + }, + { + "key": "subtitles.block.beehive.work", + "english_translation": "Bees work" + }, + { + "key": "commands.message.display.incoming", + "english_translation": "%s whispers to you: %s" + }, + { + "key": "block.minecraft.banner.diagonal_up_left.black", + "english_translation": "Black Per Bend Inverted" + }, + { + "key": "block.minecraft.banner.stripe_right.lime", + "english_translation": "Lime Pale Sinister" + }, + { + "key": "block.minecraft.spruce_leaves", + "english_translation": "Spruce Leaves" + }, + { + "key": "gui.socialInteractions.narration.hide", + "english_translation": "Hide messages from %s" + }, + { + "key": "death.attack.drown.player", + "english_translation": "%1$s drowned whilst trying to escape %2$s" + }, + { + "key": "commands.data.modify.expected_value", + "english_translation": "Expected value, got: %s" + }, + { + "key": "death.attack.sweetBerryBush", + "english_translation": "%1$s was poked to death by a sweet berry bush" + }, + { + "key": "mco.invites.pending", + "english_translation": "New invite(s)!" + }, + { + "key": "telemetry_info.property_title", + "english_translation": "Included Data" + }, + { + "key": "mco.minigame.world.switch.new", + "english_translation": "Select another minigame?" + }, + { + "key": "commands.team.option.deathMessageVisibility.unchanged", + "english_translation": "Nothing changed. Death message visibility is already that value" + }, + { + "key": "gui.abuseReport.reason.hate_speech.description", + "english_translation": "Someone is attacking you or another player based on characteristics of their identity, like religion, race, or sexuality." + }, + { + "key": "block.minecraft.banner.square_top_left.yellow", + "english_translation": "Yellow Chief Dexter Canton" + }, + { + "key": "block.minecraft.stripped_cherry_wood", + "english_translation": "Stripped Cherry Wood" + }, + { + "key": "item.minecraft.splash_potion.effect.regeneration", + "english_translation": "Splash Potion of Regeneration" + }, + { + "key": "block.minecraft.banner.mojang.black", + "english_translation": "Black Thing" + }, + { + "key": "subtitles.entity.llama.hurt", + "english_translation": "Llama hurts" + }, + { + "key": "fabric.gui.creativeTabPage", + "english_translation": "Page %s/%s" + }, + { + "key": "block.minecraft.banner.rhombus.gray", + "english_translation": "Gray Lozenge" + }, + { + "key": "advancements.end.root.title", + "english_translation": "The End" + }, + { + "key": "block.minecraft.purple_candle", + "english_translation": "Purple Candle" + }, + { + "key": "subtitles.entity.fishing_bobber.throw", + "english_translation": "Bobber thrown" + }, + { + "key": "narrator.screen.usage", + "english_translation": "Use mouse cursor or Tab button to select element" + }, + { + "key": "subtitles.entity.shulker.death", + "english_translation": "Shulker dies" + }, + { + "key": "argument.entity.options.distance.description", + "english_translation": "Distance to entity" + }, + { + "key": "item.minecraft.recovery_compass", + "english_translation": "Recovery Compass" + }, + { + "key": "options.graphics.fabulous.tooltip", + "english_translation": "%s graphics uses screen shaders for drawing weather, clouds, and particles behind translucent blocks and water.\nThis may severely impact performance for portable devices and 4K displays." + }, + { + "key": "subtitles.entity.fox.sleep", + "english_translation": "Fox snores" + }, + { + "key": "narrator.button.accessibility", + "english_translation": "Accessibility" + }, + { + "key": "block.minecraft.banner.half_vertical_right.lime", + "english_translation": "Lime Per Pale Inverted" + }, + { + "key": "options.onlyShowSecureChat", + "english_translation": "Only Show Secure Chat" + }, + { + "key": "block.minecraft.banner.border.light_blue", + "english_translation": "Light Blue Bordure" + }, + { + "key": "block.minecraft.banner.stripe_top.orange", + "english_translation": "Orange Chief" + }, + { + "key": "options.accessibility.text_background_opacity", + "english_translation": "Text Background Opacity" + }, + { + "key": "spectatorMenu.team_teleport", + "english_translation": "Teleport to Team Member" + }, + { + "key": "subtitles.entity.frog.lay_spawn", + "english_translation": "Frog lays spawn" + }, + { + "key": "createWorld.customize.custom.dungeonChance", + "english_translation": "Dungeon Count" + }, + { + "key": "mco.configure.world.spawn_toggle.message", + "english_translation": "Turning this option off will REMOVE ALL existing entities of that type" + }, + { + "key": "entity.minecraft.pillager", + "english_translation": "Pillager" + }, + { + "key": "gui.banned.reason.sexually_inappropriate", + "english_translation": "Topics or content of a sexual nature" + }, + { + "key": "block.minecraft.bed.obstructed", + "english_translation": "This bed is obstructed" + }, + { + "key": "subtitles.entity.polar_bear.hurt", + "english_translation": "Polar Bear hurts" + }, + { + "key": "advancements.adventure.bullseye.title", + "english_translation": "Bullseye" + }, + { + "key": "gui.chatReport.send", + "english_translation": "Send Report" + }, + { + "key": "block.minecraft.pink_candle_cake", + "english_translation": "Cake with Pink Candle" + }, + { + "key": "key.categories.misc", + "english_translation": "Miscellaneous" + }, + { + "key": "tutorial.open_inventory.title", + "english_translation": "Open your inventory" + }, + { + "key": "mco.backup.entry.description", + "english_translation": "Description" + }, + { + "key": "subtitles.block.trapdoor.toggle", + "english_translation": "Trapdoor creaks" + }, + { + "key": "mco.configure.world.slot.switch.question.line2", + "english_translation": "Are you sure you want to continue?" + }, + { + "key": "mco.configure.world.slot.switch.question.line1", + "english_translation": "Your realm will be switched to another world" + }, + { + "key": "block.minecraft.banner.stripe_right.blue", + "english_translation": "Blue Pale Sinister" + }, + { + "key": "block.minecraft.cherry_slab", + "english_translation": "Cherry Slab" + }, + { + "key": "disconnect.exceeded_packet_rate", + "english_translation": "Kicked for exceeding packet rate limit" + }, + { + "key": "gamerule.mobExplosionDropDecay", + "english_translation": "In mob explosions, some blocks won't drop their loot" + }, + { + "key": "advancements.adventure.spyglass_at_ghast.description", + "english_translation": "Look at a Ghast through a Spyglass" + }, + { + "key": "advancement.advancementNotFound", + "english_translation": "Unknown advancement: %s" + }, + { + "key": "subtitles.entity.rabbit.jump", + "english_translation": "Rabbit hops" + }, + { + "key": "mco.template.button.trailer", + "english_translation": "Trailer" + }, + { + "key": "block.minecraft.light_blue_banner", + "english_translation": "Light Blue Banner" + }, + { + "key": "parsing.bool.expected", + "english_translation": "Expected boolean" + }, + { + "key": "block.minecraft.banner.square_bottom_left.lime", + "english_translation": "Lime Base Dexter Canton" + }, + { + "key": "gui.chatReport.describe", + "english_translation": "Sharing details will help us make a well-informed decision." + }, + { + "key": "createWorld.customize.presets", + "english_translation": "Presets" + }, + { + "key": "flat_world_preset.minecraft.redstone_ready", + "english_translation": "Redstone Ready" + }, + { + "key": "block.minecraft.cauldron", + "english_translation": "Cauldron" + }, + { + "key": "container.upgrade", + "english_translation": "Upgrade Gear" + }, + { + "key": "multiplayer.status.finished", + "english_translation": "Finished" + }, + { + "key": "subtitles.entity.parrot.imitate.magma_cube", + "english_translation": "Parrot squishes" + }, + { + "key": "block.minecraft.nether_brick_fence", + "english_translation": "Nether Brick Fence" + }, + { + "key": "commands.forceload.list.multiple", + "english_translation": "%s force loaded chunks were found in %s at: %s" + }, + { + "key": "flat_world_preset.minecraft.the_void", + "english_translation": "The Void" + }, + { + "key": "block.minecraft.banner.globe.orange", + "english_translation": "Orange Globe" + }, + { + "key": "block.minecraft.banner.skull.lime", + "english_translation": "Lime Skull Charge" + }, + { + "key": "soundCategory.player", + "english_translation": "Players" + }, + { + "key": "stat_type.minecraft.mined", + "english_translation": "Times Mined" + }, + { + "key": "subtitles.entity.goat.horn_break", + "english_translation": "Goat Horn breaks off" + }, + { + "key": "argument.entity.options.dx.description", + "english_translation": "Entities between x and x + dx" + }, + { + "key": "item_modifier.unknown", + "english_translation": "Unknown item modifier: %s" + }, + { + "key": "block.minecraft.banner.globe.light_blue", + "english_translation": "Light Blue Globe" + }, + { + "key": "item.minecraft.heartbreak_pottery_sherd", + "english_translation": "Heartbreak Pottery Sherd" + }, + { + "key": "gui.socialInteractions.status_hidden_offline", + "english_translation": "Hidden - Offline" + }, + { + "key": "item.minecraft.splash_potion.effect.night_vision", + "english_translation": "Splash Potion of Night Vision" + }, + { + "key": "block.minecraft.wither_skeleton_wall_skull", + "english_translation": "Wither Skeleton Wall Skull" + }, + { + "key": "item.minecraft.cooked_beef", + "english_translation": "Steak" + }, + { + "key": "block.minecraft.banner.half_vertical_right.blue", + "english_translation": "Blue Per Pale Inverted" + }, + { + "key": "item.minecraft.magma_cube_spawn_egg", + "english_translation": "Magma Cube Spawn Egg" + }, + { + "key": "advancements.husbandry.kill_axolotl_target.description", + "english_translation": "Team up with an Axolotl and win a fight" + }, + { + "key": "painting.minecraft.donkey_kong.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "subtitles.chiseled_bookshelf.insert_enchanted", + "english_translation": "Enchanted Book placed" + }, + { + "key": "commands.advancement.revoke.one.to.one.failure", + "english_translation": "Couldn't revoke advancement %s from %s as they don't have it" + }, + { + "key": "container.repair.expensive", + "english_translation": "Too Expensive!" + }, + { + "key": "optimizeWorld.stage.counting", + "english_translation": "Counting chunks..." + }, + { + "key": "mco.minigame.world.title", + "english_translation": "Switch realm to minigame" + }, + { + "key": "container.inventory", + "english_translation": "Inventory" + }, + { + "key": "trim_pattern.minecraft.snout", + "english_translation": "Snout Armor Trim" + }, + { + "key": "arguments.nbtpath.too_deep", + "english_translation": "Resulting NBT too deeply nested" + }, + { + "key": "block.minecraft.magenta_stained_glass", + "english_translation": "Magenta Stained Glass" + }, + { + "key": "block.minecraft.weathered_cut_copper", + "english_translation": "Weathered Cut Copper" + }, + { + "key": "mco.account.privacyinfo", + "english_translation": "Mojang implements certain procedures to help protect children and their privacy including complying with the Children’s Online Privacy Protection Act (COPPA) and General Data Protection Regulation (GDPR).\n\nYou may need to obtain parental consent before accessing your Realms account.\n\nIf you have an older Minecraft account (you log in with your username), you need to migrate the account to a Mojang account in order to access Realms." + }, + { + "key": "options.pixel_value", + "english_translation": "%s: %spx" + }, + { + "key": "item.minecraft.splash_potion.effect.water_breathing", + "english_translation": "Splash Potion of Water Breathing" + }, + { + "key": "mco.create.world.error", + "english_translation": "You must enter a name!" + }, + { + "key": "gui.socialInteractions.tab_all", + "english_translation": "All" + }, + { + "key": "death.attack.freeze", + "english_translation": "%1$s froze to death" + }, + { + "key": "argument.integer.low", + "english_translation": "Integer must not be less than %s, found %s" + }, + { + "key": "block.minecraft.banner.stripe_bottom.purple", + "english_translation": "Purple Base" + }, + { + "key": "resourcePack.broken_assets", + "english_translation": "BROKEN ASSETS DETECTED" + }, + { + "key": "subtitles.entity.pig.hurt", + "english_translation": "Pig hurts" + }, + { + "key": "block.minecraft.banner.square_bottom_left.blue", + "english_translation": "Blue Base Dexter Canton" + }, + { + "key": "item.minecraft.potion.effect.awkward", + "english_translation": "Awkward Potion" + }, + { + "key": "block.minecraft.banner.stripe_top.light_gray", + "english_translation": "Light Gray Chief" + }, + { + "key": "block.minecraft.white_banner", + "english_translation": "White Banner" + }, + { + "key": "entity.minecraft.rabbit", + "english_translation": "Rabbit" + }, + { + "key": "block.minecraft.large_fern", + "english_translation": "Large Fern" + }, + { + "key": "options.reducedDebugInfo", + "english_translation": "Reduced Debug Info" + }, + { + "key": "arguments.objective.notFound", + "english_translation": "Unknown scoreboard objective '%s'" + }, + { + "key": "block.minecraft.banner.diagonal_up_left.green", + "english_translation": "Green Per Bend Inverted" + }, + { + "key": "multiplayer.status.unrequested", + "english_translation": "Received unrequested status" + }, + { + "key": "block.minecraft.banner.triangles_top.brown", + "english_translation": "Brown Chief Indented" + }, + { + "key": "advancements.story.iron_tools.title", + "english_translation": "Isn't It Iron Pick" + }, + { + "key": "menu.generatingLevel", + "english_translation": "Generating world" + }, + { + "key": "block.minecraft.banner.square_bottom_left.purple", + "english_translation": "Purple Base Dexter Canton" + }, + { + "key": "block.minecraft.dirt_path", + "english_translation": "Dirt Path" + }, + { + "key": "subtitles.entity.generic.hurt", + "english_translation": "Something hurts" + }, + { + "key": "entity.minecraft.villager.none", + "english_translation": "Villager" + }, + { + "key": "narrator.position.tab", + "english_translation": "Selected tab %s out of %s" + }, + { + "key": "subtitles.item.goat_horn.play", + "english_translation": "Goat Horn plays" + }, + { + "key": "commands.scoreboard.players.enable.success.single", + "english_translation": "Enabled trigger %s for %s" + }, + { + "key": "subtitles.entity.villager.work_cleric", + "english_translation": "Cleric works" + }, + { + "key": "advancements.husbandry.silk_touch_nest.title", + "english_translation": "Total Beelocation" + }, + { + "key": "gui.banned.reason.false_reporting", + "english_translation": "Excessive false or inaccurate reports" + }, + { + "key": "block.minecraft.coarse_dirt", + "english_translation": "Coarse Dirt" + }, + { + "key": "item.minecraft.crossbow", + "english_translation": "Crossbow" + }, + { + "key": "selectServer.select", + "english_translation": "Join Server" + }, + { + "key": "block.minecraft.banner.stripe_top.cyan", + "english_translation": "Cyan Chief" + }, + { + "key": "death.attack.player.item", + "english_translation": "%1$s was slain by %2$s using %3$s" + }, + { + "key": "commands.execute.conditional.fail", + "english_translation": "Test failed" + }, + { + "key": "subtitles.entity.wither_skeleton.hurt", + "english_translation": "Wither Skeleton hurts" + }, + { + "key": "inventory.binSlot", + "english_translation": "Destroy Item" + }, + { + "key": "mco.configure.world.spawnProtection", + "english_translation": "Spawn protection" + }, + { + "key": "gui.recipebook.moreRecipes", + "english_translation": "Right Click for More" + }, + { + "key": "commands.locate.poi.success", + "english_translation": "The nearest %s is at %s (%s blocks away)" + }, + { + "key": "item.minecraft.globe_banner_pattern", + "english_translation": "Banner Pattern" + }, + { + "key": "item.minecraft.splash_potion.effect.levitation", + "english_translation": "Splash Potion of Levitation" + }, + { + "key": "gui.socialInteractions.narration.report", + "english_translation": "Report player %s" + }, + { + "key": "commands.advancement.revoke.many.to.one.failure", + "english_translation": "Couldn't revoke %s advancements from %s as they don't have them" + }, + { + "key": "chat.link.warning", + "english_translation": "Never open links from people that you don't trust!" + }, + { + "key": "subtitles.entity.allay.hurt", + "english_translation": "Allay hurts" + }, + { + "key": "item.minecraft.music_disc_chirp", + "english_translation": "Music Disc" + }, + { + "key": "item.minecraft.howl_pottery_sherd", + "english_translation": "Howl Pottery Sherd" + }, + { + "key": "block.minecraft.lapis_ore", + "english_translation": "Lapis Lazuli Ore" + }, + { + "key": "subtitles.entity.fishing_bobber.splash", + "english_translation": "Fishing Bobber splashes" + }, + { + "key": "block.minecraft.bamboo_stairs", + "english_translation": "Bamboo Stairs" + }, + { + "key": "block.minecraft.banner.base.yellow", + "english_translation": "Fully Yellow Field" + }, + { + "key": "item.minecraft.stray_spawn_egg", + "english_translation": "Stray Spawn Egg" + }, + { + "key": "block.minecraft.banner.base.pink", + "english_translation": "Fully Pink Field" + }, + { + "key": "commands.debug.function.success.multiple", + "english_translation": "Traced %s command(s) from %s functions to output file %s" + }, + { + "key": "mco.configure.world.invited.number", + "english_translation": "Invited (%s)" + }, + { + "key": "item.minecraft.splash_potion.effect.thick", + "english_translation": "Thick Splash Potion" + }, + { + "key": "item.minecraft.cooked_cod", + "english_translation": "Cooked Cod" + }, + { + "key": "clear.failed.single", + "english_translation": "No items were found on player %s" + }, + { + "key": "gui.socialInteractions.tooltip.report", + "english_translation": "Report player" + }, + { + "key": "block.minecraft.observer", + "english_translation": "Observer" + }, + { + "key": "block.minecraft.banner.stripe_bottom.cyan", + "english_translation": "Cyan Base" + }, + { + "key": "block.minecraft.banner.creeper.purple", + "english_translation": "Purple Creeper Charge" + }, + { + "key": "subtitles.entity.silverfish.ambient", + "english_translation": "Silverfish hisses" + }, + { + "key": "block.minecraft.banner.half_horizontal_bottom.brown", + "english_translation": "Brown Per Fess Inverted" + }, + { + "key": "commands.team.option.friendlyfire.alreadyDisabled", + "english_translation": "Nothing changed. Friendly fire is already disabled for that team" + }, + { + "key": "item.minecraft.firework_star.shape.large_ball", + "english_translation": "Large Ball" + }, + { + "key": "item.minecraft.heart_pottery_sherd", + "english_translation": "Heart Pottery Sherd" + }, + { + "key": "telemetry.property.server_type.title", + "english_translation": "Server Type" + }, + { + "key": "block.minecraft.prismarine_brick_slab", + "english_translation": "Prismarine Brick Slab" + }, + { + "key": "death.fell.accident.twisting_vines", + "english_translation": "%1$s fell off some twisting vines" + }, + { + "key": "block.minecraft.jungle_trapdoor", + "english_translation": "Jungle Trapdoor" + }, + { + "key": "connect.aborted", + "english_translation": "Aborted" + }, + { + "key": "block.minecraft.banner.triangles_top.lime", + "english_translation": "Lime Chief Indented" + }, + { + "key": "commands.team.list.teams.success", + "english_translation": "There are %s team(s): %s" + }, + { + "key": "gui.abuseReport.reason.narration", + "english_translation": "%s: %s" + }, + { + "key": "options.narrator.all", + "english_translation": "Narrates All" + }, + { + "key": "subtitles.entity.donkey.angry", + "english_translation": "Donkey neighs" + }, + { + "key": "multiplayer.status.cannot_resolve", + "english_translation": "Can't resolve hostname" + }, + { + "key": "attribute.name.generic.movement_speed", + "english_translation": "Speed" + }, + { + "key": "narrator.position.list", + "english_translation": "Selected list row %s out of %s" + }, + { + "key": "commands.item.target.no_such_slot", + "english_translation": "The target does not have slot %s" + }, + { + "key": "gui.abuseReport.reason.title", + "english_translation": "Select Report Category" + }, + { + "key": "block.minecraft.banner.diagonal_up_left.magenta", + "english_translation": "Magenta Per Bend Inverted" + }, + { + "key": "block.minecraft.banner.square_top_right.light_gray", + "english_translation": "Light Gray Chief Sinister Canton" + }, + { + "key": "block.minecraft.dead_brain_coral_fan", + "english_translation": "Dead Brain Coral Fan" + }, + { + "key": "block.minecraft.banner.flower.white", + "english_translation": "White Flower Charge" + }, + { + "key": "stat.minecraft.sneak_time", + "english_translation": "Sneak Time" + }, + { + "key": "argument.nbt.trailing", + "english_translation": "Unexpected trailing data" + }, + { + "key": "mco.selectServer.note", + "english_translation": "Note:" + }, + { + "key": "options.fov.min", + "english_translation": "Normal" + }, + { + "key": "mco.minigame.world.restore.question.line2", + "english_translation": "Are you sure you want to continue?" + }, + { + "key": "subtitles.entity.zombie.destroy_egg", + "english_translation": "Turtle Egg stomped" + }, + { + "key": "biome.minecraft.lukewarm_ocean", + "english_translation": "Lukewarm Ocean" + }, + { + "key": "entity.minecraft.wither_skull", + "english_translation": "Wither Skull" + }, + { + "key": "mco.minigame.world.restore.question.line1", + "english_translation": "The minigame will end and your realm will be restored." + }, + { + "key": "entity.minecraft.eye_of_ender", + "english_translation": "Eye of Ender" + }, + { + "key": "createWorld.tab.world.title", + "english_translation": "World" + }, + { + "key": "block.minecraft.banner.triangle_bottom.red", + "english_translation": "Red Chevron" + }, + { + "key": "block.minecraft.cyan_carpet", + "english_translation": "Cyan Carpet" + }, + { + "key": "argument.double.big", + "english_translation": "Double must not be more than %s, found %s" + }, + { + "key": "color.minecraft.red", + "english_translation": "Red" + }, + { + "key": "block.minecraft.oak_door", + "english_translation": "Oak Door" + }, + { + "key": "block.minecraft.flowering_azalea_leaves", + "english_translation": "Flowering Azalea Leaves" + }, + { + "key": "item.minecraft.prismarine_crystals", + "english_translation": "Prismarine Crystals" + }, + { + "key": "commands.scoreboard.players.enable.success.multiple", + "english_translation": "Enabled trigger %s for %s entities" + }, + { + "key": "menu.disconnect", + "english_translation": "Disconnect" + }, + { + "key": "entity.minecraft.chest_boat", + "english_translation": "Boat with Chest" + }, + { + "key": "item.minecraft.tipped_arrow.effect.slow_falling", + "english_translation": "Arrow of Slow Falling" + }, + { + "key": "stat_type.minecraft.killed_by", + "english_translation": "%s killed you %s time(s)" + }, + { + "key": "commands.place.jigsaw.invalid", + "english_translation": "There is no template pool with type \"%s\"" + }, + { + "key": "options.online", + "english_translation": "Online..." + }, + { + "key": "commands.banip.invalid", + "english_translation": "Invalid IP address or unknown player" + }, + { + "key": "block.minecraft.banner.square_top_left.light_gray", + "english_translation": "Light Gray Chief Dexter Canton" + }, + { + "key": "advancements.adventure.kill_mob_near_sculk_catalyst.title", + "english_translation": "It Spreads" + }, + { + "key": "subtitles.entity.elder_guardian.death", + "english_translation": "Elder Guardian dies" + }, + { + "key": "multiplayer.disconnect.authservers_down", + "english_translation": "Authentication servers are down. Please try again later, sorry!" + }, + { + "key": "color.minecraft.gray", + "english_translation": "Gray" + }, + { + "key": "item.minecraft.furnace_minecart", + "english_translation": "Minecart with Furnace" + }, + { + "key": "mco.selectServer.expiredList", + "english_translation": "Your subscription has expired" + }, + { + "key": "gui.abuseReport.reason.harassment_or_bullying.description", + "english_translation": "Someone is shaming, attacking, or bullying you or someone else. This includes when someone is repeatedly trying to contact you or someone else without consent or posting private personal information about you or someone else without consent (\"doxing\")." + }, + { + "key": "multiplayer.disconnect.idling", + "english_translation": "You have been idle for too long!" + }, + { + "key": "soundCategory.record", + "english_translation": "Jukebox/Note Blocks" + }, + { + "key": "block.minecraft.prismarine_slab", + "english_translation": "Prismarine Slab" + }, + { + "key": "block.minecraft.nether_portal", + "english_translation": "Nether Portal" + }, + { + "key": "advancements.story.obtain_armor.title", + "english_translation": "Suit Up" + }, + { + "key": "subtitles.entity.ender_dragon.flap", + "english_translation": "Dragon flaps" + }, + { + "key": "block.minecraft.purple_banner", + "english_translation": "Purple Banner" + }, + { + "key": "entity.minecraft.spider", + "english_translation": "Spider" + }, + { + "key": "subtitles.entity.endermite.death", + "english_translation": "Endermite dies" + }, + { + "key": "telemetry.event.advancement_made.description", + "english_translation": "Understanding the context behind receiving an advancement can help us better understand and improve the progression of the game." + }, + { + "key": "container.isLocked", + "english_translation": "%s is locked!" + }, + { + "key": "commands.time.set", + "english_translation": "Set the time to %s" + }, + { + "key": "block.minecraft.yellow_banner", + "english_translation": "Yellow Banner" + }, + { + "key": "item.minecraft.potion.effect.swiftness", + "english_translation": "Potion of Swiftness" + }, + { + "key": "subtitles.entity.frog.long_jump", + "english_translation": "Frog jumps" + }, + { + "key": "container.grindstone_title", + "english_translation": "Repair & Disenchant" + }, + { + "key": "mco.configure.world.opening", + "english_translation": "Opening the realm..." + }, + { + "key": "block.minecraft.clay", + "english_translation": "Clay" + }, + { + "key": "container.barrel", + "english_translation": "Barrel" + }, + { + "key": "commands.title.times.single", + "english_translation": "Changed title display times for %s" + }, + { + "key": "key.keyboard.period", + "english_translation": "." + }, + { + "key": "key.mouse.right", + "english_translation": "Right Button" + }, + { + "key": "death.attack.fireball", + "english_translation": "%1$s was fireballed by %2$s" + }, + { + "key": "itemGroup.search", + "english_translation": "Search Items" + }, + { + "key": "argument.entity.notfound.entity", + "english_translation": "No entity was found" + }, + { + "key": "block.minecraft.polished_diorite_slab", + "english_translation": "Polished Diorite Slab" + }, + { + "key": "block.minecraft.banner.piglin.green", + "english_translation": "Green Snout" + }, + { + "key": "resourcepack.requesting", + "english_translation": "Making Request..." + }, + { + "key": "block.minecraft.banner.cross.magenta", + "english_translation": "Magenta Saltire" + }, + { + "key": "block.minecraft.cobblestone_slab", + "english_translation": "Cobblestone Slab" + }, + { + "key": "mco.question", + "english_translation": "Question" + }, + { + "key": "block.minecraft.banner.diagonal_right.purple", + "english_translation": "Purple Per Bend" + }, + { + "key": "block.minecraft.big_dripleaf", + "english_translation": "Big Dripleaf" + }, + { + "key": "item.minecraft.camel_spawn_egg", + "english_translation": "Camel Spawn Egg" + }, + { + "key": "commands.bossbar.list.bars.none", + "english_translation": "There are no custom bossbars active" + }, + { + "key": "advancements.nether.find_fortress.title", + "english_translation": "A Terrible Fortress" + }, + { + "key": "painting.minecraft.courbet.title", + "english_translation": "Bonjour Monsieur Courbet" + }, + { + "key": "block.minecraft.blackstone_stairs", + "english_translation": "Blackstone Stairs" + }, + { + "key": "advancements.husbandry.feed_snifflet.title", + "english_translation": "Little Sniffs" + }, + { + "key": "block.minecraft.banner.triangles_top.blue", + "english_translation": "Blue Chief Indented" + }, + { + "key": "effect.none", + "english_translation": "No Effects" + }, + { + "key": "block.minecraft.deepslate_tile_slab", + "english_translation": "Deepslate Tile Slab" + }, + { + "key": "commands.locate.structure.success", + "english_translation": "The nearest %s is at %s (%s blocks away)" + }, + { + "key": "mco.backup.entry", + "english_translation": "Backup (%s)" + }, + { + "key": "telemetry_info.button.give_feedback", + "english_translation": "Give Feedback" + }, + { + "key": "item.minecraft.piglin_banner_pattern.desc", + "english_translation": "Snout" + }, + { + "key": "subtitles.entity.blaze.hurt", + "english_translation": "Blaze hurts" + }, + { + "key": "gamerule.doEntityDrops", + "english_translation": "Drop entity equipment" + }, + { + "key": "block.minecraft.exposed_cut_copper_slab", + "english_translation": "Exposed Cut Copper Slab" + }, + { + "key": "selectWorld.create", + "english_translation": "Create New World" + }, + { + "key": "death.attack.fireworks", + "english_translation": "%1$s went off with a bang" + }, + { + "key": "block.minecraft.banner.triangle_top.lime", + "english_translation": "Lime Inverted Chevron" + }, + { + "key": "block.minecraft.potted_dead_bush", + "english_translation": "Potted Dead Bush" + }, + { + "key": "subtitles.entity.ender_dragon.growl", + "english_translation": "Dragon growls" + }, + { + "key": "block.minecraft.banner.half_horizontal.brown", + "english_translation": "Brown Per Fess" + }, + { + "key": "commands.advancement.revoke.one.to.many.success", + "english_translation": "Revoked the advancement %s from %s players" + }, + { + "key": "item.minecraft.splash_potion.effect.water", + "english_translation": "Splash Water Bottle" + }, + { + "key": "mco.configure.world.subscription.months", + "english_translation": "months" + }, + { + "key": "createWorld.customize.custom.preset.waterWorld", + "english_translation": "Water World" + }, + { + "key": "block.minecraft.banner.diagonal_right.red", + "english_translation": "Red Per Bend" + }, + { + "key": "entity.minecraft.experience_orb", + "english_translation": "Experience Orb" + }, + { + "key": "commands.function.success.multiple", + "english_translation": "Executed %s command(s) from %s functions" + }, + { + "key": "death.attack.inWall", + "english_translation": "%1$s suffocated in a wall" + }, + { + "key": "advancements.husbandry.plant_seed.title", + "english_translation": "A Seedy Place" + }, + { + "key": "chat.type.announcement", + "english_translation": "[%s] %s" + }, + { + "key": "advancements.end.dragon_breath.title", + "english_translation": "You Need a Mint" + }, + { + "key": "mco.errorMessage.6003", + "english_translation": "Download limit reached" + }, + { + "key": "mco.errorMessage.6002", + "english_translation": "Terms of service not accepted" + }, + { + "key": "commands.attribute.base_value.set.success", + "english_translation": "Base value for attribute %s for entity %s set to %s" + }, + { + "key": "mco.errorMessage.6001", + "english_translation": "Client outdated" + }, + { + "key": "commands.title.cleared.multiple", + "english_translation": "Cleared titles for %s players" + }, + { + "key": "key.keyboard.page.up", + "english_translation": "Page Up" + }, + { + "key": "mco.errorMessage.6007", + "english_translation": "User in too many Realms" + }, + { + "key": "telemetry.property.minecraft_session_id.title", + "english_translation": "Minecraft Session ID" + }, + { + "key": "mco.errorMessage.6006", + "english_translation": "World is out of date" + }, + { + "key": "mco.errorMessage.6005", + "english_translation": "World locked" + }, + { + "key": "mco.errorMessage.6004", + "english_translation": "Upload limit reached" + }, + { + "key": "block.minecraft.banner.piglin.light_blue", + "english_translation": "Light Blue Snout" + }, + { + "key": "event.minecraft.raid.defeat", + "english_translation": "Defeat" + }, + { + "key": "mco.errorMessage.6009", + "english_translation": "Invalid Realm description" + }, + { + "key": "mco.errorMessage.6008", + "english_translation": "Invalid Realm name" + }, + { + "key": "options.rawMouseInput", + "english_translation": "Raw Input" + }, + { + "key": "gui.yes", + "english_translation": "Yes" + }, + { + "key": "soundCategory.ambient", + "english_translation": "Ambient/Environment" + }, + { + "key": "block.minecraft.medium_amethyst_bud", + "english_translation": "Medium Amethyst Bud" + }, + { + "key": "block.minecraft.banner.straight_cross.orange", + "english_translation": "Orange Cross" + }, + { + "key": "entity.minecraft.stray", + "english_translation": "Stray" + }, + { + "key": "commands.bossbar.get.players.some", + "english_translation": "Custom bossbar %s has %s player(s) currently online: %s" + }, + { + "key": "options.gamma.default", + "english_translation": "Default" + }, + { + "key": "subtitles.entity.axolotl.splash", + "english_translation": "Axolotl splashes" + }, + { + "key": "block.minecraft.potted_crimson_fungus", + "english_translation": "Potted Crimson Fungus" + }, + { + "key": "commands.teleport.success.entity.single", + "english_translation": "Teleported %s to %s" + }, + { + "key": "advancements.adventure.bullseye.description", + "english_translation": "Hit the bullseye of a Target block from at least 30 meters away" + }, + { + "key": "block.minecraft.pink_terracotta", + "english_translation": "Pink Terracotta" + }, + { + "key": "chat.type.team.text", + "english_translation": "%s <%s> %s" + }, + { + "key": "connect.connecting", + "english_translation": "Connecting to the server..." + }, + { + "key": "death.attack.flyIntoWall", + "english_translation": "%1$s experienced kinetic energy" + }, + { + "key": "item.minecraft.orange_dye", + "english_translation": "Orange Dye" + }, + { + "key": "advancements.husbandry.leash_all_frog_variants.description", + "english_translation": "Get each Frog variant on a Lead" + }, + { + "key": "block.minecraft.warped_fence_gate", + "english_translation": "Warped Fence Gate" + }, + { + "key": "itemGroup.functional", + "english_translation": "Functional Blocks" + }, + { + "key": "block.minecraft.magenta_stained_glass_pane", + "english_translation": "Magenta Stained Glass Pane" + }, + { + "key": "subtitles.event.raid.horn", + "english_translation": "Ominous horn blares" + }, + { + "key": "biome.minecraft.soul_sand_valley", + "english_translation": "Soul Sand Valley" + }, + { + "key": "block.minecraft.flower_pot", + "english_translation": "Flower Pot" + }, + { + "key": "item.minecraft.fishing_rod", + "english_translation": "Fishing Rod" + }, + { + "key": "argument.player.toomany", + "english_translation": "Only one player is allowed, but the provided selector allows more than one" + }, + { + "key": "block.minecraft.light_gray_stained_glass_pane", + "english_translation": "Light Gray Stained Glass Pane" + }, + { + "key": "mco.configure.world.buttons.done", + "english_translation": "Done" + }, + { + "key": "block.minecraft.banner.triangle_top.blue", + "english_translation": "Blue Inverted Chevron" + }, + { + "key": "selectWorld.allowCommands.info", + "english_translation": "Commands like /gamemode, /experience" + }, + { + "key": "block.minecraft.mossy_stone_brick_stairs", + "english_translation": "Mossy Stone Brick Stairs" + }, + { + "key": "block.minecraft.brown_mushroom_block", + "english_translation": "Brown Mushroom Block" + }, + { + "key": "commands.ride.mount.success", + "english_translation": "%s started riding %s" + }, + { + "key": "selectWorld.experimental.title", + "english_translation": "Experimental Features Warning" + }, + { + "key": "subtitles.block.barrel.close", + "english_translation": "Barrel closes" + }, + { + "key": "subtitles.block.growing_plant.crop", + "english_translation": "Plant cropped" + }, + { + "key": "subtitles.entity.rabbit.death", + "english_translation": "Rabbit dies" + }, + { + "key": "telemetry.event.required", + "english_translation": "%s (Required)" + }, + { + "key": "block.minecraft.polished_andesite_stairs", + "english_translation": "Polished Andesite Stairs" + }, + { + "key": "key.pickItem", + "english_translation": "Pick Block" + }, + { + "key": "block.minecraft.banner.half_vertical_right.brown", + "english_translation": "Brown Per Pale Inverted" + }, + { + "key": "biome.minecraft.cherry_grove", + "english_translation": "Cherry Grove" + }, + { + "key": "commands.bossbar.set.color.unchanged", + "english_translation": "Nothing changed. That's already the color of this bossbar" + }, + { + "key": "argument.block.property.unclosed", + "english_translation": "Expected closing ] for block state properties" + }, + { + "key": "block.minecraft.banner.bricks.red", + "english_translation": "Red Field Masoned" + }, + { + "key": "subtitles.entity.sniffer.drop_seed", + "english_translation": "Sniffer drops seed" + }, + { + "key": "subtitles.entity.panda.step", + "english_translation": "Panda steps" + }, + { + "key": "createWorld.customize.custom.page1", + "english_translation": "Ore Settings" + }, + { + "key": "item.minecraft.enderman_spawn_egg", + "english_translation": "Enderman Spawn Egg" + }, + { + "key": "createWorld.customize.custom.page2", + "english_translation": "Advanced Settings (Expert Users Only!)" + }, + { + "key": "createWorld.customize.custom.page3", + "english_translation": "Extra Advanced Settings (Expert Users Only!)" + }, + { + "key": "advancements.adventure.voluntary_exile.description", + "english_translation": "Kill a raid captain.\nMaybe consider staying away from villages for the time being..." + }, + { + "key": "block.minecraft.pink_concrete_powder", + "english_translation": "Pink Concrete Powder" + }, + { + "key": "subtitles.entity.enderman.death", + "english_translation": "Enderman dies" + }, + { + "key": "createWorld.customize.custom.page0", + "english_translation": "Basic Settings" + }, + { + "key": "subtitles.entity.axolotl.swim", + "english_translation": "Axolotl swims" + }, + { + "key": "trim_pattern.minecraft.shaper", + "english_translation": "Shaper Armor Trim" + }, + { + "key": "key.mouse.middle", + "english_translation": "Middle Button" + }, + { + "key": "block.minecraft.spruce_fence", + "english_translation": "Spruce Fence" + }, + { + "key": "death.attack.starve", + "english_translation": "%1$s starved to death" + }, + { + "key": "block.minecraft.polished_granite", + "english_translation": "Polished Granite" + }, + { + "key": "subtitles.entity.cat.eat", + "english_translation": "Cat eats" + }, + { + "key": "options.telemetry.button", + "english_translation": "Data Collection" + }, + { + "key": "gui.socialInteractions.tooltip.report.no_messages", + "english_translation": "No reportable messages from player %s" + }, + { + "key": "debug.reload_chunks.help", + "english_translation": "F3 + A = Reload chunks" + }, + { + "key": "block.minecraft.tnt", + "english_translation": "TNT" + }, + { + "key": "commands.experience.set.levels.success.multiple", + "english_translation": "Set %s experience levels on %s players" + }, + { + "key": "subtitles.entity.witch.hurt", + "english_translation": "Witch hurts" + }, + { + "key": "selectWorld.gameMode.hardcore", + "english_translation": "Hardcore" + }, + { + "key": "subtitles.entity.item_frame.remove_item", + "english_translation": "Item Frame empties" + }, + { + "key": "subtitles.entity.zoglin.ambient", + "english_translation": "Zoglin growls" + }, + { + "key": "item.minecraft.turtle_spawn_egg", + "english_translation": "Turtle Spawn Egg" + }, + { + "key": "narration.cycle_button.usage.hovered", + "english_translation": "Left click to switch to %s" + }, + { + "key": "block.minecraft.banner.half_vertical.light_gray", + "english_translation": "Light Gray Per Pale" + }, + { + "key": "item.minecraft.pottery_shard_archer", + "english_translation": "Archer Pottery Shard" + }, + { + "key": "entity.minecraft.leash_knot", + "english_translation": "Leash Knot" + }, + { + "key": "key.categories.multiplayer", + "english_translation": "Multiplayer" + }, + { + "key": "advancements.adventure.shoot_arrow.description", + "english_translation": "Shoot something with an Arrow" + }, + { + "key": "soundCategory.block", + "english_translation": "Blocks" + }, + { + "key": "multiplayer.disconnect.expired_public_key", + "english_translation": "Expired profile public key. Check that your system time is synchronized, and try restarting your game." + }, + { + "key": "subtitles.entity.mule.hurt", + "english_translation": "Mule hurts" + }, + { + "key": "createWorld.customize.flat.layer", + "english_translation": "%s" + }, + { + "key": "entity.minecraft.ocelot", + "english_translation": "Ocelot" + }, + { + "key": "block.minecraft.cyan_candle", + "english_translation": "Cyan Candle" + }, + { + "key": "stat.minecraft.interact_with_lectern", + "english_translation": "Interactions with Lectern" + }, + { + "key": "structure_block.mode.save", + "english_translation": "Save" + }, + { + "key": "block.minecraft.chest", + "english_translation": "Chest" + }, + { + "key": "stat_type.minecraft.dropped", + "english_translation": "Dropped" + }, + { + "key": "block.minecraft.furnace", + "english_translation": "Furnace" + }, + { + "key": "commands.attribute.failed.modifier_already_present", + "english_translation": "Modifier %s is already present on attribute %s for entity %s" + }, + { + "key": "gamerule.naturalRegeneration", + "english_translation": "Regenerate health" + }, + { + "key": "mco.configure.world.switch.slot", + "english_translation": "Create world" + }, + { + "key": "subtitles.entity.chicken.death", + "english_translation": "Chicken dies" + }, + { + "key": "item.minecraft.phantom_membrane", + "english_translation": "Phantom Membrane" + }, + { + "key": "block.minecraft.banner.border.red", + "english_translation": "Red Bordure" + }, + { + "key": "subtitles.entity.evoker.prepare_wololo", + "english_translation": "Evoker prepares charming" + }, + { + "key": "selectWorld.tooltip.fromNewerVersion2", + "english_translation": "loading this world could cause problems!" + }, + { + "key": "item.minecraft.cat_spawn_egg", + "english_translation": "Cat Spawn Egg" + }, + { + "key": "selectWorld.tooltip.fromNewerVersion1", + "english_translation": "World was saved in a newer version," + }, + { + "key": "block.minecraft.cut_red_sandstone", + "english_translation": "Cut Red Sandstone" + }, + { + "key": "block.minecraft.oxidized_copper", + "english_translation": "Oxidized Copper" + }, + { + "key": "commands.ban.success", + "english_translation": "Banned %s: %s" + }, + { + "key": "options.realmsNotifications", + "english_translation": "Realms News & Invites" + }, + { + "key": "advancements.adventure.trim_with_any_armor_pattern.title", + "english_translation": "Crafting a New Look" + }, + { + "key": "block.minecraft.jungle_sign", + "english_translation": "Jungle Sign" + }, + { + "key": "subtitles.entity.firework_rocket.twinkle", + "english_translation": "Firework twinkles" + }, + { + "key": "block.minecraft.banner.circle.white", + "english_translation": "White Roundel" + }, + { + "key": "biome.minecraft.jagged_peaks", + "english_translation": "Jagged Peaks" + }, + { + "key": "commands.difficulty.failure", + "english_translation": "The difficulty did not change; it is already set to %s" + }, + { + "key": "multiplayer.disconnect.generic", + "english_translation": "Disconnected" + }, + { + "key": "gui.cancel", + "english_translation": "Cancel" + }, + { + "key": "block.minecraft.redstone_wall_torch", + "english_translation": "Redstone Wall Torch" + }, + { + "key": "commands.data.storage.get", + "english_translation": "%s in storage %s after scale factor of %s is %s" + }, + { + "key": "demo.help.movementShort", + "english_translation": "Move by pressing the %1$s, %2$s, %3$s, %4$s keys" + }, + { + "key": "block.minecraft.white_carpet", + "english_translation": "White Carpet" + }, + { + "key": "death.attack.cramming", + "english_translation": "%1$s was squished too much" + }, + { + "key": "subtitles.entity.vex.hurt", + "english_translation": "Vex hurts" + }, + { + "key": "block.minecraft.red_sandstone", + "english_translation": "Red Sandstone" + }, + { + "key": "subtitles.item.bottle.empty", + "english_translation": "Bottle empties" + }, + { + "key": "commands.difficulty.success", + "english_translation": "The difficulty has been set to %s" + }, + { + "key": "commands.team.option.friendlyfire.alreadyEnabled", + "english_translation": "Nothing changed. Friendly fire is already enabled for that team" + }, + { + "key": "options.difficulty.hard", + "english_translation": "Hard" + }, + { + "key": "item.minecraft.smithing_template.upgrade", + "english_translation": "Upgrade: " + }, + { + "key": "item.minecraft.ocelot_spawn_egg", + "english_translation": "Ocelot Spawn Egg" + }, + { + "key": "mco.configure.world.reset.question.line1", + "english_translation": "Your world will be regenerated and your current world will be lost" + }, + { + "key": "mco.configure.world.reset.question.line2", + "english_translation": "Are you sure you want to continue?" + }, + { + "key": "item.minecraft.potion.effect.invisibility", + "english_translation": "Potion of Invisibility" + }, + { + "key": "telemetry.event.world_load_times.title", + "english_translation": "World Load Times" + }, + { + "key": "commands.clear.success.single", + "english_translation": "Removed %s item(s) from player %s" + }, + { + "key": "block.minecraft.mangrove_door", + "english_translation": "Mangrove Door" + }, + { + "key": "createWorld.customize.custom.useCaves", + "english_translation": "Caves" + }, + { + "key": "advancements.adventure.ol_betsy.description", + "english_translation": "Shoot a Crossbow" + }, + { + "key": "item.minecraft.music_disc_wait.desc", + "english_translation": "C418 - wait" + }, + { + "key": "block.minecraft.banner.stripe_downright.light_gray", + "english_translation": "Light Gray Bend" + }, + { + "key": "gui.banned.description.temporary.duration", + "english_translation": "Your account is temporarily suspended and will be reactivated in %s." + }, + { + "key": "subtitles.entity.sniffer.death", + "english_translation": "Sniffer dies" + }, + { + "key": "addServer.add", + "english_translation": "Done" + }, + { + "key": "attribute.name.generic.attack_knockback", + "english_translation": "Attack Knockback" + }, + { + "key": "mco.configure.world.uninvite.question", + "english_translation": "Are you sure that you want to uninvite" + }, + { + "key": "block.minecraft.light_gray_stained_glass", + "english_translation": "Light Gray Stained Glass" + }, + { + "key": "subtitles.entity.villager.work_librarian", + "english_translation": "Librarian works" + }, + { + "key": "filled_map.mansion", + "english_translation": "Woodland Explorer Map" + }, + { + "key": "item.minecraft.gold_nugget", + "english_translation": "Gold Nugget" + }, + { + "key": "permissions.requires.player", + "english_translation": "A player is required to run this command here" + }, + { + "key": "subtitles.entity.zombie_horse.death", + "english_translation": "Zombie Horse dies" + }, + { + "key": "item.minecraft.smithing_template.armor_trim.additions_slot_description", + "english_translation": "Add ingot or crystal" + }, + { + "key": "block.minecraft.banner.diagonal_up_right.brown", + "english_translation": "Brown Per Bend Sinister Inverted" + }, + { + "key": "block.minecraft.black_candle", + "english_translation": "Black Candle" + }, + { + "key": "block.minecraft.dripstone_block", + "english_translation": "Dripstone Block" + }, + { + "key": "commands.place.feature.invalid", + "english_translation": "There is no feature with type \"%s\"" + }, + { + "key": "mco.configure.world.switch.slot.subtitle", + "english_translation": "This world is empty, choose how to create your world" + }, + { + "key": "jigsaw_block.final_state", + "english_translation": "Turns into:" + }, + { + "key": "item.minecraft.shield.light_blue", + "english_translation": "Light Blue Shield" + }, + { + "key": "mco.download.speed", + "english_translation": "(%s/s)" + }, + { + "key": "trim_material.minecraft.gold", + "english_translation": "Gold Material" + }, + { + "key": "block.minecraft.banner.stripe_bottom.white", + "english_translation": "White Base" + }, + { + "key": "block.minecraft.daylight_detector", + "english_translation": "Daylight Detector" + }, + { + "key": "entity.minecraft.illusioner", + "english_translation": "Illusioner" + }, + { + "key": "subtitles.entity.cat.beg_for_food", + "english_translation": "Cat begs" + }, + { + "key": "options.visible", + "english_translation": "Shown" + }, + { + "key": "block.minecraft.green_candle", + "english_translation": "Green Candle" + }, + { + "key": "commands.scoreboard.objectives.display.cleared", + "english_translation": "Cleared any objectives in display slot %s" + }, + { + "key": "subtitles.block.piston.move", + "english_translation": "Piston moves" + }, + { + "key": "block.minecraft.orange_carpet", + "english_translation": "Orange Carpet" + }, + { + "key": "mco.configure.world.players.inviting", + "english_translation": "Inviting player..." + }, + { + "key": "options.chat.width", + "english_translation": "Width" + }, + { + "key": "item.minecraft.danger_pottery_shard", + "english_translation": "Danger Pottery Shard" + }, + { + "key": "mco.configure.world.buttons.activity", + "english_translation": "Player activity" + }, + { + "key": "options.graphics.fast", + "english_translation": "Fast" + }, + { + "key": "debug.show_hitboxes.on", + "english_translation": "Hitboxes: shown" + }, + { + "key": "attribute.name.generic.max_health", + "english_translation": "Max Health" + }, + { + "key": "entity.minecraft.block_display", + "english_translation": "Block Display" + }, + { + "key": "selectWorld.gameMode.spectator", + "english_translation": "Spectator" + }, + { + "key": "entity.minecraft.tropical_fish.type.blockfish", + "english_translation": "Blockfish" + }, + { + "key": "painting.dimensions", + "english_translation": "%sx%s" + }, + { + "key": "container.chest", + "english_translation": "Chest" + }, + { + "key": "item.minecraft.gunpowder", + "english_translation": "Gunpowder" + }, + { + "key": "gui.banned.reason.generic_violation", + "english_translation": "Violating Community Standards" + }, + { + "key": "block.minecraft.banner.stripe_right.yellow", + "english_translation": "Yellow Pale Sinister" + }, + { + "key": "painting.minecraft.burning_skull.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "block.minecraft.polished_diorite_stairs", + "english_translation": "Polished Diorite Stairs" + }, + { + "key": "mco.download.extracting", + "english_translation": "Extracting" + }, + { + "key": "block.minecraft.banner.piglin.white", + "english_translation": "White Snout" + }, + { + "key": "block.minecraft.banner.diagonal_left.magenta", + "english_translation": "Magenta Per Bend Sinister" + }, + { + "key": "block.minecraft.dark_oak_trapdoor", + "english_translation": "Dark Oak Trapdoor" + }, + { + "key": "subtitles.entity.parrot.hurts", + "english_translation": "Parrot hurts" + }, + { + "key": "mco.configure.world.title", + "english_translation": "Configure realm:" + }, + { + "key": "commands.scoreboard.players.set.success.multiple", + "english_translation": "Set %s for %s entities to %s" + }, + { + "key": "mco.selectServer.expires.soon", + "english_translation": "Expires soon" + }, + { + "key": "commands.team.list.members.success", + "english_translation": "Team %s has %s member(s): %s" + }, + { + "key": "block.minecraft.potted_wither_rose", + "english_translation": "Potted Wither Rose" + }, + { + "key": "block.minecraft.powder_snow_cauldron", + "english_translation": "Powder Snow Cauldron" + }, + { + "key": "item.minecraft.leather_helmet", + "english_translation": "Leather Cap" + }, + { + "key": "block.minecraft.spruce_wood", + "english_translation": "Spruce Wood" + }, + { + "key": "commands.bossbar.set.visibility.unchanged.hidden", + "english_translation": "Nothing changed. The bossbar is already hidden" + }, + { + "key": "block.minecraft.smooth_red_sandstone_stairs", + "english_translation": "Smooth Red Sandstone Stairs" + }, + { + "key": "options.fov.max", + "english_translation": "Quake Pro" + }, + { + "key": "commands.advancement.grant.one.to.many.failure", + "english_translation": "Couldn't grant advancement %s to %s players as they already have it" + }, + { + "key": "commands.advancement.grant.one.to.many.success", + "english_translation": "Granted the advancement %s to %s players" + }, + { + "key": "item.minecraft.brewer_pottery_shard", + "english_translation": "Brewer Pottery Shard" + }, + { + "key": "options.fullscreen.resolution", + "english_translation": "Fullscreen Resolution" + }, + { + "key": "entity.minecraft.silverfish", + "english_translation": "Silverfish" + }, + { + "key": "multiplayer.status.cannot_connect", + "english_translation": "Can't connect to server" + }, + { + "key": "enchantment.minecraft.binding_curse", + "english_translation": "Curse of Binding" + }, + { + "key": "block.minecraft.birch_fence_gate", + "english_translation": "Birch Fence Gate" + }, + { + "key": "commands.pardonip.success", + "english_translation": "Unbanned IP %s" + }, + { + "key": "block.minecraft.banner.mojang.light_gray", + "english_translation": "Light Gray Thing" + }, + { + "key": "options.chat.color", + "english_translation": "Colors" + }, + { + "key": "debug.chunk_boundaries.on", + "english_translation": "Chunk borders: shown" + }, + { + "key": "subtitles.entity.strider.happy", + "english_translation": "Strider warbles" + }, + { + "key": "subtitles.entity.zombie_villager.death", + "english_translation": "Zombie Villager dies" + }, + { + "key": "block.minecraft.red_stained_glass", + "english_translation": "Red Stained Glass" + }, + { + "key": "commands.team.empty.unchanged", + "english_translation": "Nothing changed. That team is already empty" + }, + { + "key": "selectWorld.import_worldgen_settings.failure", + "english_translation": "Error importing settings" + }, + { + "key": "item.minecraft.firework_rocket.flight", + "english_translation": "Flight Duration:" + }, + { + "key": "advancements.end.dragon_egg.title", + "english_translation": "The Next Generation" + }, + { + "key": "options.ao.off", + "english_translation": "OFF" + }, + { + "key": "block.minecraft.potted_lily_of_the_valley", + "english_translation": "Potted Lily of the Valley" + }, + { + "key": "block.minecraft.banner.diagonal_up_right.purple", + "english_translation": "Purple Per Bend Sinister Inverted" + }, + { + "key": "subtitles.item.honey_bottle.drink", + "english_translation": "Gulping" + }, + { + "key": "item.minecraft.lime_dye", + "english_translation": "Lime Dye" + }, + { + "key": "mco.configure.world.buttons.moreoptions", + "english_translation": "More options" + }, + { + "key": "block.minecraft.spruce_trapdoor", + "english_translation": "Spruce Trapdoor" + }, + { + "key": "entity.minecraft.fishing_bobber", + "english_translation": "Fishing Bobber" + }, + { + "key": "subtitles.entity.llama.eat", + "english_translation": "Llama eats" + }, + { + "key": "block.minecraft.acacia_fence_gate", + "english_translation": "Acacia Fence Gate" + }, + { + "key": "gui.recipebook.toggleRecipes.all", + "english_translation": "Showing All" + }, + { + "key": "block.minecraft.deepslate_lapis_ore", + "english_translation": "Deepslate Lapis Lazuli Ore" + }, + { + "key": "options.sounds.title", + "english_translation": "Music & Sound Options" + }, + { + "key": "biome.minecraft.badlands", + "english_translation": "Badlands" + }, + { + "key": "block.minecraft.dark_oak_wood", + "english_translation": "Dark Oak Wood" + }, + { + "key": "block.minecraft.dark_prismarine_stairs", + "english_translation": "Dark Prismarine Stairs" + }, + { + "key": "command.exception", + "english_translation": "Could not parse command: %s" + }, + { + "key": "block.minecraft.blue_bed", + "english_translation": "Blue Bed" + }, + { + "key": "block.minecraft.oak_leaves", + "english_translation": "Oak Leaves" + }, + { + "key": "subtitles.entity.silverfish.death", + "english_translation": "Silverfish dies" + }, + { + "key": "item.minecraft.smithing_template.netherite_upgrade.base_slot_description", + "english_translation": "Add diamond armor, weapon, or tool" + }, + { + "key": "block.minecraft.moss_carpet", + "english_translation": "Moss Carpet" + }, + { + "key": "block.minecraft.cracked_polished_blackstone_bricks", + "english_translation": "Cracked Polished Blackstone Bricks" + }, + { + "key": "item.minecraft.wolf_spawn_egg", + "english_translation": "Wolf Spawn Egg" + }, + { + "key": "structure_block.save_success", + "english_translation": "Structure saved as '%s'" + }, + { + "key": "entity.minecraft.slime", + "english_translation": "Slime" + }, + { + "key": "advancements.story.form_obsidian.description", + "english_translation": "Obtain a block of Obsidian" + }, + { + "key": "commands.scoreboard.objectives.list.success", + "english_translation": "There are %s objective(s): %s" + }, + { + "key": "block.minecraft.banner.stripe_middle.purple", + "english_translation": "Purple Fess" + }, + { + "key": "item.minecraft.witch_spawn_egg", + "english_translation": "Witch Spawn Egg" + }, + { + "key": "selectWorld.experiments", + "english_translation": "Experiments" + }, + { + "key": "advancements.husbandry.netherite_hoe.title", + "english_translation": "Serious Dedication" + }, + { + "key": "commands.worldborder.set.shrink", + "english_translation": "Shrinking the world border to %s block(s) wide over %s second(s)" + }, + { + "key": "block.minecraft.banner.flower.green", + "english_translation": "Green Flower Charge" + }, + { + "key": "subtitles.entity.guardian.hurt", + "english_translation": "Guardian hurts" + }, + { + "key": "fabric-registry-sync-v0.unknown-remote.title.singular", + "english_translation": "Received a registry entry that is unknown to this client.\n" + }, + { + "key": "item.minecraft.shield.gray", + "english_translation": "Gray Shield" + }, + { + "key": "mco.template.info.tooltip", + "english_translation": "Publisher website" + }, + { + "key": "commands.perf.started", + "english_translation": "Started 10 second performance profiling run (use '/perf stop' to stop early)" + }, + { + "key": "gui.banned.reason.hate_speech", + "english_translation": "Hate speech or discrimination" + }, + { + "key": "key.keyboard.comma", + "english_translation": "," + }, + { + "key": "options.telemetry", + "english_translation": "Telemetry Data..." + }, + { + "key": "selectWorld.backupQuestion.customized", + "english_translation": "Customized worlds are no longer supported" + }, + { + "key": "options.mainHand.left", + "english_translation": "Left" + }, + { + "key": "gui.banned.description.reason", + "english_translation": "We recently received a report for bad behavior by your account. Our moderators have now reviewed your case and identified it as %s, which goes against the Minecraft Community Standards." + }, + { + "key": "structure_block.hover.data", + "english_translation": "Data: %s" + }, + { + "key": "block.minecraft.cyan_concrete", + "english_translation": "Cyan Concrete" + }, + { + "key": "block.minecraft.banner.diagonal_up_left.orange", + "english_translation": "Orange Per Bend Inverted" + }, + { + "key": "quickplay.error.invalid_identifier", + "english_translation": "Could not find world with the provided identifier" + }, + { + "key": "subtitles.entity.villager.no", + "english_translation": "Villager disagrees" + }, + { + "key": "menu.resetdemo", + "english_translation": "Reset Demo World" + }, + { + "key": "block.minecraft.sweet_berry_bush", + "english_translation": "Sweet Berry Bush" + }, + { + "key": "block.minecraft.acacia_pressure_plate", + "english_translation": "Acacia Pressure Plate" + }, + { + "key": "block.minecraft.weathered_copper", + "english_translation": "Weathered Copper" + }, + { + "key": "enchantment.minecraft.depth_strider", + "english_translation": "Depth Strider" + }, + { + "key": "entity.minecraft.experience_bottle", + "english_translation": "Thrown Bottle o' Enchanting" + }, + { + "key": "block.minecraft.banner.triangle_bottom.light_gray", + "english_translation": "Light Gray Chevron" + }, + { + "key": "subtitles.entity.generic.swim", + "english_translation": "Swimming" + }, + { + "key": "subtitles.entity.villager.celebrate", + "english_translation": "Villager cheers" + }, + { + "key": "block.minecraft.turtle_egg", + "english_translation": "Turtle Egg" + }, + { + "key": "subtitles.entity.llama.angry", + "english_translation": "Llama bleats angrily" + }, + { + "key": "subtitles.entity.spider.ambient", + "english_translation": "Spider hisses" + }, + { + "key": "debug.profiling.start", + "english_translation": "Profiling started for %s seconds. Use F3 + L to stop early" + }, + { + "key": "subtitles.block.anvil.use", + "english_translation": "Anvil used" + }, + { + "key": "options.difficulty.hardcore", + "english_translation": "Hardcore" + }, + { + "key": "subtitles.entity.warden.angry", + "english_translation": "Warden rages" + }, + { + "key": "item.minecraft.phantom_spawn_egg", + "english_translation": "Phantom Spawn Egg" + }, + { + "key": "block.minecraft.end_stone_brick_stairs", + "english_translation": "End Stone Brick Stairs" + }, + { + "key": "death.attack.cactus.player", + "english_translation": "%1$s walked into a cactus whilst trying to escape %2$s" + }, + { + "key": "block.minecraft.warped_button", + "english_translation": "Warped Button" + }, + { + "key": "chat.type.emote", + "english_translation": "* %s %s" + }, + { + "key": "subtitles.item.bucket.fill_tadpole", + "english_translation": "Tadpole captured" + }, + { + "key": "key.keyboard.keypad.enter", + "english_translation": "Keypad Enter" + }, + { + "key": "block.minecraft.dark_oak_log", + "english_translation": "Dark Oak Log" + }, + { + "key": "commands.pardon.failed", + "english_translation": "Nothing changed. The player isn't banned" + }, + { + "key": "argument.entity.options.x_rotation.description", + "english_translation": "Entity's x rotation" + }, + { + "key": "options.multiplier", + "english_translation": "%sx" + }, + { + "key": "commands.advancement.revoke.one.to.many.failure", + "english_translation": "Couldn't revoke advancement %s from %s players as they don't have it" + }, + { + "key": "options.clouds.fast", + "english_translation": "Fast" + }, + { + "key": "mco.errorMessage.connectionFailure", + "english_translation": "An error occurred, please try again later." + }, + { + "key": "biome.minecraft.snowy_taiga", + "english_translation": "Snowy Taiga" + }, + { + "key": "options.attack.crosshair", + "english_translation": "Crosshair" + }, + { + "key": "jigsaw_block.joint.aligned", + "english_translation": "Aligned" + }, + { + "key": "record.nowPlaying", + "english_translation": "Now Playing: %s" + }, + { + "key": "advancements.husbandry.axolotl_in_a_bucket.description", + "english_translation": "Catch an Axolotl in a Bucket" + }, + { + "key": "block.minecraft.black_carpet", + "english_translation": "Black Carpet" + }, + { + "key": "block.minecraft.bubble_coral_block", + "english_translation": "Bubble Coral Block" + }, + { + "key": "commands.spreadplayers.failed.invalid.height", + "english_translation": "Invalid maxHeight %s; expected higher than world minimum %s" + }, + { + "key": "block.minecraft.brown_candle_cake", + "english_translation": "Cake with Brown Candle" + }, + { + "key": "block.minecraft.banner.skull.purple", + "english_translation": "Purple Skull Charge" + }, + { + "key": "commands.trigger.set.success", + "english_translation": "Triggered %s (set value to %s)" + }, + { + "key": "item.minecraft.netherite_chestplate", + "english_translation": "Netherite Chestplate" + }, + { + "key": "item.minecraft.mojang_banner_pattern.desc", + "english_translation": "Thing" + }, + { + "key": "trim_material.minecraft.emerald", + "english_translation": "Emerald Material" + }, + { + "key": "block.minecraft.magenta_candle", + "english_translation": "Magenta Candle" + }, + { + "key": "mco.configure.world.settings.title", + "english_translation": "Settings" + }, + { + "key": "block.minecraft.pitcher_crop", + "english_translation": "Pitcher Crop" + }, + { + "key": "item.minecraft.smithing_template.netherite_upgrade.ingredients", + "english_translation": "Netherite Ingot" + }, + { + "key": "death.attack.magic", + "english_translation": "%1$s was killed by magic" + }, + { + "key": "commands.fill.success", + "english_translation": "Successfully filled %s block(s)" + }, + { + "key": "item.minecraft.music_disc_mellohi", + "english_translation": "Music Disc" + }, + { + "key": "block.minecraft.mud_brick_stairs", + "english_translation": "Mud Brick Stairs" + }, + { + "key": "block.minecraft.jungle_button", + "english_translation": "Jungle Button" + }, + { + "key": "stat.minecraft.open_shulker_box", + "english_translation": "Shulker Boxes Opened" + }, + { + "key": "createWorld.customize.custom.useMineShafts", + "english_translation": "Mineshafts" + }, + { + "key": "item.minecraft.lead", + "english_translation": "Lead" + }, + { + "key": "subtitles.entity.turtle.egg_break", + "english_translation": "Turtle Egg breaks" + }, + { + "key": "subtitles.block.lever.click", + "english_translation": "Lever clicks" + }, + { + "key": "item.minecraft.golden_apple", + "english_translation": "Golden Apple" + }, + { + "key": "block.minecraft.banner.stripe_downright.gray", + "english_translation": "Gray Bend" + }, + { + "key": "block.minecraft.hopper", + "english_translation": "Hopper" + }, + { + "key": "commands.save.alreadyOn", + "english_translation": "Saving is already turned on" + }, + { + "key": "subtitles.entity.cod.death", + "english_translation": "Cod dies" + }, + { + "key": "gui.socialInteractions.status_blocked", + "english_translation": "Blocked" + }, + { + "key": "advancements.nether.fast_travel.title", + "english_translation": "Subspace Bubble" + }, + { + "key": "subtitles.entity.dolphin.swim", + "english_translation": "Dolphin swims" + }, + { + "key": "advancements.nether.ride_strider.description", + "english_translation": "Ride a Strider with a Warped Fungus on a Stick" + }, + { + "key": "block.minecraft.cracked_stone_bricks", + "english_translation": "Cracked Stone Bricks" + }, + { + "key": "block.minecraft.banner.half_horizontal.light_blue", + "english_translation": "Light Blue Per Fess" + }, + { + "key": "block.minecraft.slime_block", + "english_translation": "Slime Block" + }, + { + "key": "block.minecraft.banner.bricks.cyan", + "english_translation": "Cyan Field Masoned" + }, + { + "key": "createWorld.customize.custom.baseSize", + "english_translation": "Depth Base Size" + }, + { + "key": "commands.effect.clear.specific.failed", + "english_translation": "Target doesn't have the requested effect" + }, + { + "key": "block.minecraft.end_rod", + "english_translation": "End Rod" + }, + { + "key": "block.minecraft.pink_carpet", + "english_translation": "Pink Carpet" + }, + { + "key": "painting.minecraft.pool.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "item.minecraft.tipped_arrow.effect.strength", + "english_translation": "Arrow of Strength" + }, + { + "key": "biome.minecraft.eroded_badlands", + "english_translation": "Eroded Badlands" + }, + { + "key": "block.minecraft.polished_granite_stairs", + "english_translation": "Polished Granite Stairs" + }, + { + "key": "upgrade.minecraft.netherite_upgrade", + "english_translation": "Netherite Upgrade" + }, + { + "key": "block.minecraft.smooth_quartz", + "english_translation": "Smooth Quartz Block" + }, + { + "key": "subtitles.entity.tnt.primed", + "english_translation": "TNT fizzes" + }, + { + "key": "symlink_warning.message", + "english_translation": "Loading worlds from folders with symbolic links can be unsafe if you don't know exactly what you are doing. Please visit %s to learn more." + }, + { + "key": "block.minecraft.banner.curly_border.light_gray", + "english_translation": "Light Gray Bordure Indented" + }, + { + "key": "gui.chatReport.draft.quittotitle.content", + "english_translation": "Would you like to continue editing it or discard it?" + }, + { + "key": "block.minecraft.banner.half_horizontal.yellow", + "english_translation": "Yellow Per Fess" + }, + { + "key": "subtitles.block.brewing_stand.brew", + "english_translation": "Brewing Stand bubbles" + }, + { + "key": "selectWorld.deleteButton", + "english_translation": "Delete" + }, + { + "key": "commands.forceload.removed.failure", + "english_translation": "No chunks were removed from force loading" + }, + { + "key": "selectWorld.experiments.info", + "english_translation": "Experiments are potential new features. Be careful as things might break. Experiments can't be turned off after world creation." + }, + { + "key": "item.minecraft.splash_potion.effect.turtle_master", + "english_translation": "Splash Potion of the Turtle Master" + }, + { + "key": "gui.socialInteractions.hide", + "english_translation": "Hide in Chat" + }, + { + "key": "block.minecraft.banner.gradient.light_blue", + "english_translation": "Light Blue Gradient" + }, + { + "key": "selectWorld.title", + "english_translation": "Select World" + }, + { + "key": "subtitles.entity.armor_stand.fall", + "english_translation": "Something fell" + }, + { + "key": "mco.upload.entry.id", + "english_translation": "%1$s (%2$s)" + }, + { + "key": "block.minecraft.acacia_fence", + "english_translation": "Acacia Fence" + }, + { + "key": "entity.minecraft.tropical_fish.type.dasher", + "english_translation": "Dasher" + }, + { + "key": "block.minecraft.warped_wall_sign", + "english_translation": "Warped Wall Sign" + }, + { + "key": "block.minecraft.white_candle", + "english_translation": "White Candle" + }, + { + "key": "entity.minecraft.enderman", + "english_translation": "Enderman" + }, + { + "key": "subtitles.block.portal.travel", + "english_translation": "Portal noise fades" + }, + { + "key": "block.minecraft.orange_candle", + "english_translation": "Orange Candle" + }, + { + "key": "block.minecraft.stripped_acacia_wood", + "english_translation": "Stripped Acacia Wood" + }, + { + "key": "block.minecraft.gray_terracotta", + "english_translation": "Gray Terracotta" + }, + { + "key": "block.minecraft.light_blue_concrete_powder", + "english_translation": "Light Blue Concrete Powder" + }, + { + "key": "subtitles.entity.item_frame.add_item", + "english_translation": "Item Frame fills" + }, + { + "key": "advancements.nether.root.title", + "english_translation": "Nether" + }, + { + "key": "block.minecraft.banner.diagonal_up_right.blue", + "english_translation": "Blue Per Bend Sinister Inverted" + }, + { + "key": "key.keyboard.semicolon", + "english_translation": ";" + }, + { + "key": "gamerule.blockExplosionDropDecay", + "english_translation": "In block interaction explosions, some blocks won't drop their loot" + }, + { + "key": "block.minecraft.banner.straight_cross.light_gray", + "english_translation": "Light Gray Cross" + }, + { + "key": "block.minecraft.banner.triangles_top.orange", + "english_translation": "Orange Chief Indented" + }, + { + "key": "biome.minecraft.deep_ocean", + "english_translation": "Deep Ocean" + }, + { + "key": "mco.backup.entry.gameServerVersion", + "english_translation": "Game Server Version" + }, + { + "key": "effect.minecraft.glowing", + "english_translation": "Glowing" + }, + { + "key": "block.minecraft.banner.small_stripes.light_gray", + "english_translation": "Light Gray Paly" + }, + { + "key": "options.mouse_settings", + "english_translation": "Mouse Settings..." + }, + { + "key": "advancements.nether.all_effects.description", + "english_translation": "Have every effect applied at the same time" + }, + { + "key": "commands.item.target.no_changed.known_item", + "english_translation": "No targets accepted item %s into slot %s" + }, + { + "key": "subtitles.entity.generic.burn", + "english_translation": "Burning" + }, + { + "key": "block.minecraft.spruce_stairs", + "english_translation": "Spruce Stairs" + }, + { + "key": "advancements.adventure.trim_with_any_armor_pattern.description", + "english_translation": "Craft a trimmed armor at a Smithing Table" + }, + { + "key": "block.minecraft.banner.small_stripes.pink", + "english_translation": "Pink Paly" + }, + { + "key": "debug.profiling.stop", + "english_translation": "Profiling ended. Saved results to %s" + }, + { + "key": "item.minecraft.drowned_spawn_egg", + "english_translation": "Drowned Spawn Egg" + }, + { + "key": "item.minecraft.glow_item_frame", + "english_translation": "Glow Item Frame" + }, + { + "key": "advancements.husbandry.fishy_business.title", + "english_translation": "Fishy Business" + }, + { + "key": "multiplayer.requiredTexturePrompt.line2", + "english_translation": "Rejecting this custom resource pack will disconnect you from this server." + }, + { + "key": "multiplayer.requiredTexturePrompt.line1", + "english_translation": "This server requires the use of a custom resource pack." + }, + { + "key": "item.minecraft.splash_potion.effect.empty", + "english_translation": "Splash Uncraftable Potion" + }, + { + "key": "selectWorld.experimental.details.entry", + "english_translation": "Required experimental features: %s" + }, + { + "key": "subtitles.entity.generic.extinguish_fire", + "english_translation": "Fire extinguishes" + }, + { + "key": "spectatorMenu.root.prompt", + "english_translation": "Press a key to select a command, and again to use it." + }, + { + "key": "painting.minecraft.burning_skull.title", + "english_translation": "Skull On Fire" + }, + { + "key": "options.accessibility.link", + "english_translation": "Accessibility Guide" + }, + { + "key": "translation.test.world", + "english_translation": "world" + }, + { + "key": "block.minecraft.polished_deepslate_slab", + "english_translation": "Polished Deepslate Slab" + }, + { + "key": "options.graphics", + "english_translation": "Graphics" + }, + { + "key": "commands.trigger.add.success", + "english_translation": "Triggered %s (added %s to value)" + }, + { + "key": "subtitles.block.pointed_dripstone.drip_water", + "english_translation": "Water drips" + }, + { + "key": "gui.banned.reason.nudity_or_pornography", + "english_translation": "Displaying lewd or pornographic material" + }, + { + "key": "block.minecraft.blue_banner", + "english_translation": "Blue Banner" + }, + { + "key": "block.minecraft.mangrove_slab", + "english_translation": "Mangrove Slab" + }, + { + "key": "block.minecraft.banner.rhombus.brown", + "english_translation": "Brown Lozenge" + }, + { + "key": "chat.type.admin", + "english_translation": "[%s: %s]" + }, + { + "key": "deathScreen.respawn", + "english_translation": "Respawn" + }, + { + "key": "subtitles.block.beacon.activate", + "english_translation": "Beacon activates" + }, + { + "key": "subtitles.entity.warden.sonic_boom", + "english_translation": "Warden booms" + }, + { + "key": "createWorld.customize.custom.preset.isleLand", + "english_translation": "Isle Land" + }, + { + "key": "options.glintSpeed.tooltip", + "english_translation": "Controls how fast the visual glint shimmers across enchanted items." + }, + { + "key": "mount.onboard", + "english_translation": "Press %1$s to Dismount" + }, + { + "key": "subtitles.entity.cat.hiss", + "english_translation": "Cat hisses" + }, + { + "key": "block.minecraft.nether_gold_ore", + "english_translation": "Nether Gold Ore" + }, + { + "key": "item.minecraft.explorer_pottery_shard", + "english_translation": "Explorer Pottery Shard" + }, + { + "key": "block.minecraft.banner.flower.gray", + "english_translation": "Gray Flower Charge" + }, + { + "key": "multiplayer.disconnect.outdated_server", + "english_translation": "Incompatible client! Please use %s" + }, + { + "key": "block.minecraft.banner.diagonal_up_right.lime", + "english_translation": "Lime Per Bend Sinister Inverted" + }, + { + "key": "block.minecraft.nether_wart", + "english_translation": "Nether Wart" + }, + { + "key": "commands.ban.failed", + "english_translation": "Nothing changed. The player is already banned" + }, + { + "key": "stat.minecraft.interact_with_stonecutter", + "english_translation": "Interactions with Stonecutter" + }, + { + "key": "item.minecraft.smithing_template.netherite_upgrade.additions_slot_description", + "english_translation": "Add Netherite Ingot" + }, + { + "key": "subtitles.block.lava.ambient", + "english_translation": "Lava pops" + }, + { + "key": "block.minecraft.scaffolding", + "english_translation": "Scaffolding" + }, + { + "key": "subtitles.entity.fox.bite", + "english_translation": "Fox bites" + }, + { + "key": "item.minecraft.potion.effect.levitation", + "english_translation": "Potion of Levitation" + }, + { + "key": "mco.upload.select.world.none", + "english_translation": "No singleplayer worlds found!" + }, + { + "key": "createWorld.customize.custom.center", + "english_translation": "Center Height" + }, + { + "key": "createWorld.customize.custom.confirmTitle", + "english_translation": "Warning!" + }, + { + "key": "subtitles.entity.camel.stand", + "english_translation": "Camel stands up" + }, + { + "key": "item.minecraft.pufferfish_spawn_egg", + "english_translation": "Pufferfish Spawn Egg" + }, + { + "key": "commands.team.option.nametagVisibility.success", + "english_translation": "Nametag visibility for team %s is now \"%s\"" + }, + { + "key": "item.minecraft.elytra", + "english_translation": "Elytra" + }, + { + "key": "biome.minecraft.deep_frozen_ocean", + "english_translation": "Deep Frozen Ocean" + }, + { + "key": "block.minecraft.banner.creeper.pink", + "english_translation": "Pink Creeper Charge" + }, + { + "key": "commands.scoreboard.players.remove.success.multiple", + "english_translation": "Removed %s from %s for %s entities" + }, + { + "key": "block.minecraft.banner.diagonal_right.blue", + "english_translation": "Blue Per Bend" + }, + { + "key": "key.inventory", + "english_translation": "Open/Close Inventory" + }, + { + "key": "structure_block.mode_info.data", + "english_translation": "Data Mode - Game Logic Marker" + }, + { + "key": "gui.socialInteractions.server_label.multiple", + "english_translation": "%s - %s players" + }, + { + "key": "options.telemetry.state.none", + "english_translation": "None" + }, + { + "key": "gamerule.doImmediateRespawn", + "english_translation": "Respawn immediately" + }, + { + "key": "advancements.adventure.voluntary_exile.title", + "english_translation": "Voluntary Exile" + }, + { + "key": "mco.backup.nobackups", + "english_translation": "This realm doesn't have any backups currently." + }, + { + "key": "gui.chatReport.selected_chat", + "english_translation": "%s Chat Message(s) Selected to Report" + }, + { + "key": "argument.entity.options.unknown", + "english_translation": "Unknown option '%s'" + }, + { + "key": "commands.place.feature.failed", + "english_translation": "Failed to place feature" + }, + { + "key": "subtitles.entity.turtle.egg_hatch", + "english_translation": "Turtle Egg hatches" + }, + { + "key": "item.minecraft.mutton", + "english_translation": "Raw Mutton" + }, + { + "key": "block.minecraft.banner.curly_border.brown", + "english_translation": "Brown Bordure Indented" + }, + { + "key": "entity.minecraft.cave_spider", + "english_translation": "Cave Spider" + }, + { + "key": "disconnect.unknownHost", + "english_translation": "Unknown host" + }, + { + "key": "gui.continue", + "english_translation": "Continue" + }, + { + "key": "controls.keybinds.title", + "english_translation": "Key Binds" + }, + { + "key": "block.minecraft.banner.half_vertical_right.magenta", + "english_translation": "Magenta Per Pale Inverted" + }, + { + "key": "subtitles.item.bundle.remove_one", + "english_translation": "Item unpacked" + }, + { + "key": "commands.data.entity.get", + "english_translation": "%s on %s after scale factor of %s is %s" + }, + { + "key": "commands.advancement.revoke.criterion.to.one.failure", + "english_translation": "Couldn't revoke criterion '%s' of advancement %s from %s as they don't have it" + }, + { + "key": "block.minecraft.skeleton_wall_skull", + "english_translation": "Skeleton Wall Skull" + }, + { + "key": "subtitles.entity.frog.death", + "english_translation": "Frog dies" + }, + { + "key": "gameMode.survival", + "english_translation": "Survival Mode" + }, + { + "key": "item.minecraft.sign", + "english_translation": "Sign" + }, + { + "key": "block.minecraft.purpur_stairs", + "english_translation": "Purpur Stairs" + }, + { + "key": "commands.scoreboard.objectives.display.alreadySet", + "english_translation": "Nothing changed. That display slot is already showing that objective" + }, + { + "key": "block.minecraft.banner.circle.green", + "english_translation": "Green Roundel" + }, + { + "key": "entity.minecraft.llama", + "english_translation": "Llama" + }, + { + "key": "subtitles.entity.iron_golem.death", + "english_translation": "Iron Golem dies" + }, + { + "key": "subtitles.entity.parrot.imitate.stray", + "english_translation": "Parrot rattles" + }, + { + "key": "item.minecraft.lingering_potion.effect.healing", + "english_translation": "Lingering Potion of Healing" + }, + { + "key": "mco.configure.world.location", + "english_translation": "Location" + }, + { + "key": "argument.float.low", + "english_translation": "Float must not be less than %s, found %s" + }, + { + "key": "block.minecraft.banner.half_vertical.brown", + "english_translation": "Brown Per Pale" + }, + { + "key": "block.minecraft.hay_block", + "english_translation": "Hay Bale" + }, + { + "key": "createWorld.customize.flat.removeLayer", + "english_translation": "Remove Layer" + }, + { + "key": "mco.configure.world.players.error", + "english_translation": "A player with the provided name does not exist" + }, + { + "key": "block.minecraft.banner.stripe_bottom.light_gray", + "english_translation": "Light Gray Base" + }, + { + "key": "block.minecraft.crimson_fungus", + "english_translation": "Crimson Fungus" + }, + { + "key": "subtitles.entity.sniffer.happy", + "english_translation": "Sniffer delights" + }, + { + "key": "selectWorld.versionJoinButton", + "english_translation": "Load Anyway" + }, + { + "key": "gameMode.adventure", + "english_translation": "Adventure Mode" + }, + { + "key": "subtitles.entity.bee.pollinate", + "english_translation": "Bee buzzes happily" + }, + { + "key": "block.minecraft.note_block", + "english_translation": "Note Block" + }, + { + "key": "item.minecraft.golden_leggings", + "english_translation": "Golden Leggings" + }, + { + "key": "item.minecraft.pumpkin_pie", + "english_translation": "Pumpkin Pie" + }, + { + "key": "subtitles.item.crop.plant", + "english_translation": "Crop planted" + }, + { + "key": "mco.configure.world.subscription.remaining.months.days", + "english_translation": "%1$s month(s), %2$s day(s)" + }, + { + "key": "subtitles.entity.camel.saddle", + "english_translation": "Saddle equips" + }, + { + "key": "commands.bossbar.create.success", + "english_translation": "Created custom bossbar %s" + }, + { + "key": "block.minecraft.banner.curly_border.lime", + "english_translation": "Lime Bordure Indented" + }, + { + "key": "mco.brokenworld.downloaded", + "english_translation": "Downloaded" + }, + { + "key": "advancements.story.mine_diamond.description", + "english_translation": "Acquire diamonds" + }, + { + "key": "block.minecraft.red_shulker_box", + "english_translation": "Red Shulker Box" + }, + { + "key": "subtitles.entity.turtle.swim", + "english_translation": "Turtle swims" + }, + { + "key": "block.minecraft.banner.flower.light_blue", + "english_translation": "Light Blue Flower Charge" + }, + { + "key": "painting.minecraft.aztec2.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "stat_type.minecraft.broken", + "english_translation": "Times Broken" + }, + { + "key": "subtitles.entity.fishing_bobber.retrieve", + "english_translation": "Bobber retrieved" + }, + { + "key": "block.minecraft.wall_torch", + "english_translation": "Wall Torch" + }, + { + "key": "entity.minecraft.horse", + "english_translation": "Horse" + }, + { + "key": "mco.backup.info.title", + "english_translation": "Changes from last backup" + }, + { + "key": "options.audioDevice", + "english_translation": "Device" + }, + { + "key": "key.spectatorOutlines", + "english_translation": "Highlight Players (Spectators)" + }, + { + "key": "block.minecraft.diorite_stairs", + "english_translation": "Diorite Stairs" + }, + { + "key": "block.minecraft.acacia_wall_hanging_sign", + "english_translation": "Acacia Wall Hanging Sign" + }, + { + "key": "block.minecraft.light_gray_terracotta", + "english_translation": "Light Gray Terracotta" + }, + { + "key": "block.minecraft.banner.piglin.black", + "english_translation": "Black Snout" + }, + { + "key": "attribute.name.generic.armor_toughness", + "english_translation": "Armor Toughness" + }, + { + "key": "block.minecraft.banner.stripe_bottom.green", + "english_translation": "Green Base" + }, + { + "key": "block.minecraft.banner.square_top_left.red", + "english_translation": "Red Chief Dexter Canton" + }, + { + "key": "death.attack.indirectMagic.item", + "english_translation": "%1$s was killed by %2$s using %3$s" + }, + { + "key": "gamerule.doMobLoot", + "english_translation": "Drop mob loot" + }, + { + "key": "item.minecraft.music_disc_otherside", + "english_translation": "Music Disc" + }, + { + "key": "block.minecraft.banner.small_stripes.brown", + "english_translation": "Brown Paly" + }, + { + "key": "block.minecraft.player_head", + "english_translation": "Player Head" + }, + { + "key": "advancements.end.enter_end_gateway.description", + "english_translation": "Escape the island" + }, + { + "key": "dataPack.validation.back", + "english_translation": "Go Back" + }, + { + "key": "item.minecraft.netherite_scrap", + "english_translation": "Netherite Scrap" + }, + { + "key": "argument.item.tag.disallowed", + "english_translation": "Tags aren't allowed here, only actual items" + }, + { + "key": "options.key.hold", + "english_translation": "Hold" + }, + { + "key": "selectWorld.recreate.error.title", + "english_translation": "An error occurred!" + }, + { + "key": "filled_map.id", + "english_translation": "Id #%s" + }, + { + "key": "gui.socialInteractions.tooltip.show", + "english_translation": "Show messages" + }, + { + "key": "subtitles.entity.phantom.flap", + "english_translation": "Phantom flaps" + }, + { + "key": "generator.single_biome_caves", + "english_translation": "Caves" + }, + { + "key": "subtitles.entity.rabbit.hurt", + "english_translation": "Rabbit hurts" + }, + { + "key": "subtitles.entity.ravager.roar", + "english_translation": "Ravager roars" + }, + { + "key": "block.minecraft.banner.mojang.blue", + "english_translation": "Blue Thing" + }, + { + "key": "mco.upload.preparing", + "english_translation": "Preparing your world" + }, + { + "key": "block.minecraft.banner.stripe_left.brown", + "english_translation": "Brown Pale Dexter" + }, + { + "key": "enchantment.minecraft.loyalty", + "english_translation": "Loyalty" + }, + { + "key": "block.minecraft.banner.circle.black", + "english_translation": "Black Roundel" + }, + { + "key": "menu.loadingForcedChunks", + "english_translation": "Loading forced chunks for dimension %s" + }, + { + "key": "subtitles.entity.illusioner.hurt", + "english_translation": "Illusioner hurts" + }, + { + "key": "block.minecraft.torchflower_crop", + "english_translation": "Torchflower Crop" + }, + { + "key": "subtitles.entity.silverfish.hurt", + "english_translation": "Silverfish hurts" + }, + { + "key": "block.minecraft.banner.square_top_right.pink", + "english_translation": "Pink Chief Sinister Canton" + }, + { + "key": "block.minecraft.banner.curly_border.blue", + "english_translation": "Blue Bordure Indented" + }, + { + "key": "item.minecraft.blade_pottery_shard", + "english_translation": "Blade Pottery Shard" + }, + { + "key": "block.minecraft.banner.square_top_left.gray", + "english_translation": "Gray Chief Dexter Canton" + }, + { + "key": "block.minecraft.mangrove_leaves", + "english_translation": "Mangrove Leaves" + }, + { + "key": "selectWorld.enterSeed", + "english_translation": "Seed for the world generator" + }, + { + "key": "subtitles.block.pointed_dripstone.land", + "english_translation": "Stalactite crashes down" + }, + { + "key": "pack.source.feature", + "english_translation": "feature" + }, + { + "key": "commands.publish.failed", + "english_translation": "Unable to host local game" + }, + { + "key": "gui.proceed", + "english_translation": "Proceed" + }, + { + "key": "block.minecraft.banner.rhombus.pink", + "english_translation": "Pink Lozenge" + }, + { + "key": "item.minecraft.blaze_rod", + "english_translation": "Blaze Rod" + }, + { + "key": "structure_block.position", + "english_translation": "Relative Position" + }, + { + "key": "item.minecraft.tipped_arrow.effect.turtle_master", + "english_translation": "Arrow of the Turtle Master" + }, + { + "key": "item.minecraft.iron_sword", + "english_translation": "Iron Sword" + }, + { + "key": "subtitles.entity.mooshroom.suspicious_milk", + "english_translation": "Mooshroom gets milked suspiciously" + }, + { + "key": "death.fell.accident.vines", + "english_translation": "%1$s fell off some vines" + }, + { + "key": "block.minecraft.banner.stripe_downleft.cyan", + "english_translation": "Cyan Bend Sinister" + }, + { + "key": "block.minecraft.banner.bricks.magenta", + "english_translation": "Magenta Field Masoned" + }, + { + "key": "gui.socialInteractions.show", + "english_translation": "Show in Chat" + }, + { + "key": "container.creative", + "english_translation": "Item Selection" + }, + { + "key": "block.minecraft.banner.mojang.lime", + "english_translation": "Lime Thing" + }, + { + "key": "entity.minecraft.armor_stand", + "english_translation": "Armor Stand" + }, + { + "key": "telemetry.property.world_load_time_ms.title", + "english_translation": "World Load Time (Milliseconds)" + }, + { + "key": "block.minecraft.banner.stripe_center.gray", + "english_translation": "Gray Pale" + }, + { + "key": "entity.minecraft.zoglin", + "english_translation": "Zoglin" + }, + { + "key": "gui.narrate.tab", + "english_translation": "%s tab" + }, + { + "key": "block.minecraft.candle_cake", + "english_translation": "Cake with Candle" + }, + { + "key": "subtitles.entity.cow.death", + "english_translation": "Cow dies" + }, + { + "key": "effect.minecraft.invisibility", + "english_translation": "Invisibility" + }, + { + "key": "gamerule.mobExplosionDropDecay.description", + "english_translation": "Some of the drops from blocks destroyed by explosions caused by mobs are lost in the explosion." + }, + { + "key": "block.minecraft.acacia_leaves", + "english_translation": "Acacia Leaves" + }, + { + "key": "block.minecraft.banner.stripe_bottom.black", + "english_translation": "Black Base" + }, + { + "key": "commands.effect.clear.everything.failed", + "english_translation": "Target has no effects to remove" + }, + { + "key": "block.minecraft.banner.gradient.red", + "english_translation": "Red Gradient" + }, + { + "key": "block.minecraft.banner.diagonal_right.lime", + "english_translation": "Lime Per Bend" + }, + { + "key": "block.minecraft.banner.flower.black", + "english_translation": "Black Flower Charge" + }, + { + "key": "options.chat.visibility", + "english_translation": "Chat" + }, + { + "key": "block.minecraft.warped_stem", + "english_translation": "Warped Stem" + }, + { + "key": "block.minecraft.soul_wall_torch", + "english_translation": "Soul Wall Torch" + }, + { + "key": "death.attack.witherSkull", + "english_translation": "%1$s was shot by a skull from %2$s" + }, + { + "key": "mco.brokenworld.reset", + "english_translation": "Reset" + }, + { + "key": "block.minecraft.banner.triangle_bottom.cyan", + "english_translation": "Cyan Chevron" + }, + { + "key": "potion.potency.5", + "english_translation": "VI" + }, + { + "key": "tutorial.craft_planks.description", + "english_translation": "The recipe book can help" + }, + { + "key": "key.keyboard.keypad.multiply", + "english_translation": "Keypad *" + }, + { + "key": "commands.scoreboard.players.add.success.single", + "english_translation": "Added %s to %s for %s (now %s)" + }, + { + "key": "item.minecraft.lingering_potion.effect.luck", + "english_translation": "Lingering Potion of Luck" + }, + { + "key": "gui.chatReport.draft.title", + "english_translation": "Edit draft chat report?" + }, + { + "key": "block.minecraft.banner.stripe_right.magenta", + "english_translation": "Magenta Pale Sinister" + }, + { + "key": "gamerule.universalAnger", + "english_translation": "Universal anger" + }, + { + "key": "subtitles.entity.cow.hurt", + "english_translation": "Cow hurts" + }, + { + "key": "subtitles.item.hoe.till", + "english_translation": "Hoe tills" + }, + { + "key": "stat.minecraft.walk_on_water_one_cm", + "english_translation": "Distance Walked on Water" + }, + { + "key": "item.minecraft.friend_pottery_shard", + "english_translation": "Friend Pottery Shard" + }, + { + "key": "commands.save.saving", + "english_translation": "Saving the game (this may take a moment!)" + }, + { + "key": "block.minecraft.dead_fire_coral_block", + "english_translation": "Dead Fire Coral Block" + }, + { + "key": "block.minecraft.birch_planks", + "english_translation": "Birch Planks" + }, + { + "key": "block.minecraft.stone_slab", + "english_translation": "Stone Slab" + }, + { + "key": "gamerule.spectatorsGenerateChunks", + "english_translation": "Allow spectators to generate terrain" + }, + { + "key": "entity.minecraft.guardian", + "english_translation": "Guardian" + }, + { + "key": "potion.potency.0", + "english_translation": "" + }, + { + "key": "gui.abuseReport.reason.false_reporting", + "english_translation": "False Reporting" + }, + { + "key": "block.minecraft.frosted_ice", + "english_translation": "Frosted Ice" + }, + { + "key": "potion.potency.4", + "english_translation": "V" + }, + { + "key": "block.minecraft.oak_slab", + "english_translation": "Oak Slab" + }, + { + "key": "commands.whitelist.alreadyOff", + "english_translation": "Whitelist is already turned off" + }, + { + "key": "potion.potency.3", + "english_translation": "IV" + }, + { + "key": "potion.potency.2", + "english_translation": "III" + }, + { + "key": "potion.potency.1", + "english_translation": "II" + }, + { + "key": "selectWorld.futureworld.error.text", + "english_translation": "Something went wrong while trying to load a world from a future version. This was a risky operation to begin with; sorry it didn't work." + }, + { + "key": "block.minecraft.pearlescent_froglight", + "english_translation": "Pearlescent Froglight" + }, + { + "key": "mco.selectServer.minigameNotSupportedInVersion", + "english_translation": "Can't play this minigame in %s" + }, + { + "key": "translation.test.args", + "english_translation": "%s %s" + }, + { + "key": "entity.minecraft.painting", + "english_translation": "Painting" + }, + { + "key": "selectWorld.experimental.details", + "english_translation": "Details" + }, + { + "key": "hanging_sign.edit", + "english_translation": "Edit Hanging Sign Message" + }, + { + "key": "entity.minecraft.villager.librarian", + "english_translation": "Librarian" + }, + { + "key": "argument.entity.options.y_rotation.description", + "english_translation": "Entity's y rotation" + }, + { + "key": "advancements.story.lava_bucket.title", + "english_translation": "Hot Stuff" + }, + { + "key": "narration.checkbox", + "english_translation": "Checkbox: %s" + }, + { + "key": "item.minecraft.vex_spawn_egg", + "english_translation": "Vex Spawn Egg" + }, + { + "key": "stat.minecraft.boat_one_cm", + "english_translation": "Distance by Boat" + }, + { + "key": "biome.minecraft.dripstone_caves", + "english_translation": "Dripstone Caves" + }, + { + "key": "subtitles.block.big_dripleaf.tilt_up", + "english_translation": "Dripleaf tilts up" + }, + { + "key": "gui.banned.description.reason_id_message", + "english_translation": "Code: %s - %s" + }, + { + "key": "advancements.adventure.spyglass_at_parrot.title", + "english_translation": "Is It a Bird?" + }, + { + "key": "block.minecraft.banner.circle.red", + "english_translation": "Red Roundel" + }, + { + "key": "debug.gamemodes.press_f4", + "english_translation": "[ F4 ]" + }, + { + "key": "block.minecraft.muddy_mangrove_roots", + "english_translation": "Muddy Mangrove Roots" + }, + { + "key": "event.minecraft.raid", + "english_translation": "Raid" + }, + { + "key": "enchantment.minecraft.power", + "english_translation": "Power" + }, + { + "key": "options.prioritizeChunkUpdates.none", + "english_translation": "Threaded" + }, + { + "key": "subtitles.entity.ravager.hurt", + "english_translation": "Ravager hurts" + }, + { + "key": "block.minecraft.warped_pressure_plate", + "english_translation": "Warped Pressure Plate" + }, + { + "key": "block.minecraft.horn_coral_fan", + "english_translation": "Horn Coral Fan" + }, + { + "key": "advancements.toast.challenge", + "english_translation": "Challenge Complete!" + }, + { + "key": "commands.experience.add.points.success.single", + "english_translation": "Gave %s experience points to %s" + }, + { + "key": "item.minecraft.zoglin_spawn_egg", + "english_translation": "Zoglin Spawn Egg" + }, + { + "key": "generator.minecraft.amplified", + "english_translation": "AMPLIFIED" + }, + { + "key": "subtitles.block.bubble_column.upwards_inside", + "english_translation": "Bubbles woosh" + }, + { + "key": "item.minecraft.lingering_potion.effect.water", + "english_translation": "Lingering Water Bottle" + }, + { + "key": "commands.team.empty.success", + "english_translation": "Removed %s member(s) from team %s" + }, + { + "key": "death.fell.accident.weeping_vines", + "english_translation": "%1$s fell off some weeping vines" + }, + { + "key": "mco.configure.world.slot.empty", + "english_translation": "Empty" + }, + { + "key": "enchantment.minecraft.lure", + "english_translation": "Lure" + }, + { + "key": "item.minecraft.miner_pottery_shard", + "english_translation": "Miner Pottery Shard" + }, + { + "key": "commands.team.option.color.unchanged", + "english_translation": "Nothing changed. That team already has that color" + }, + { + "key": "subtitles.entity.axolotl.idle_air", + "english_translation": "Axolotl chirps" + }, + { + "key": "argument.nbt.expected.value", + "english_translation": "Expected value" + }, + { + "key": "mco.backup.entry.name", + "english_translation": "Name" + }, + { + "key": "soundCategory.neutral", + "english_translation": "Friendly Creatures" + }, + { + "key": "block.minecraft.pointed_dripstone", + "english_translation": "Pointed Dripstone" + }, + { + "key": "subtitles.block.generic.place", + "english_translation": "Block placed" + }, + { + "key": "advancements.nether.summon_wither.title", + "english_translation": "Withering Heights" + }, + { + "key": "mco.configure.world.edit.subscreen.adventuremap", + "english_translation": "Some settings are disabled since your current world is an adventure" + }, + { + "key": "block.minecraft.banner.diagonal_left.white", + "english_translation": "White Per Bend Sinister" + }, + { + "key": "block.minecraft.banner.small_stripes.magenta", + "english_translation": "Magenta Paly" + }, + { + "key": "subtitles.entity.blaze.ambient", + "english_translation": "Blaze breathes" + }, + { + "key": "gamerule.fireDamage", + "english_translation": "Deal fire damage" + }, + { + "key": "commands.pardonip.failed", + "english_translation": "Nothing changed. That IP isn't banned" + }, + { + "key": "telemetry.event.game_load_times.title", + "english_translation": "Game Load Times" + }, + { + "key": "block.minecraft.banner.diagonal_up_right.white", + "english_translation": "White Per Bend Sinister Inverted" + }, + { + "key": "telemetry.event.world_loaded.title", + "english_translation": "World Loaded" + }, + { + "key": "stat.minecraft.talked_to_villager", + "english_translation": "Talked to Villagers" + }, + { + "key": "title.multiplayer.lan", + "english_translation": "Multiplayer (LAN)" + }, + { + "key": "commands.effect.give.failed", + "english_translation": "Unable to apply this effect (target is either immune to effects, or has something stronger)" + }, + { + "key": "subtitles.entity.zombified_piglin.hurt", + "english_translation": "Zombified Piglin hurts" + }, + { + "key": "advancements.husbandry.tadpole_in_a_bucket.description", + "english_translation": "Catch a Tadpole in a Bucket" + }, + { + "key": "block.minecraft.bamboo_pressure_plate", + "english_translation": "Bamboo Pressure Plate" + }, + { + "key": "painting.minecraft.aztec.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "demo.help.buy", + "english_translation": "Purchase Now!" + }, + { + "key": "mco.error.invalid.session.title", + "english_translation": "Invalid session" + }, + { + "key": "subtitles.entity.lightning_bolt.thunder", + "english_translation": "Thunder roars" + }, + { + "key": "disconnect.loginFailedInfo.serversUnavailable", + "english_translation": "The authentication servers are currently not reachable. Please try again." + }, + { + "key": "mco.warning", + "english_translation": "Warning!" + }, + { + "key": "item.minecraft.disc_fragment_5.desc", + "english_translation": "Music Disc - 5" + }, + { + "key": "mco.configure.world.closing", + "english_translation": "Closing the realm..." + }, + { + "key": "block.minecraft.yellow_concrete", + "english_translation": "Yellow Concrete" + }, + { + "key": "entity.minecraft.villager.armorer", + "english_translation": "Armorer" + }, + { + "key": "subtitles.entity.sniffer.idle", + "english_translation": "Sniffer grunts" + }, + { + "key": "block.minecraft.cherry_stairs", + "english_translation": "Cherry Stairs" + }, + { + "key": "mco.backup.button.restore", + "english_translation": "Restore" + }, + { + "key": "gui.socialInteractions.title", + "english_translation": "Social Interactions" + }, + { + "key": "item.minecraft.ravager_spawn_egg", + "english_translation": "Ravager Spawn Egg" + }, + { + "key": "block.minecraft.twisting_vines_plant", + "english_translation": "Twisting Vines Plant" + }, + { + "key": "block.minecraft.banner.half_vertical.white", + "english_translation": "White Per Pale" + }, + { + "key": "effect.minecraft.hero_of_the_village", + "english_translation": "Hero of the Village" + }, + { + "key": "createWorld.customize.flat.layer.top", + "english_translation": "Top - %s" + }, + { + "key": "mco.reset.world.warning", + "english_translation": "This will replace the current world of your realm" + }, + { + "key": "death.attack.arrow", + "english_translation": "%1$s was shot by %2$s" + }, + { + "key": "block.minecraft.void_air", + "english_translation": "Void Air" + }, + { + "key": "item.minecraft.ghast_spawn_egg", + "english_translation": "Ghast Spawn Egg" + }, + { + "key": "block.minecraft.gray_concrete_powder", + "english_translation": "Gray Concrete Powder" + }, + { + "key": "commands.place.template.invalid", + "english_translation": "There is no template with id \"%s\"" + }, + { + "key": "multiplayer.disconnect.ip_banned", + "english_translation": "You have been IP banned from this server" + }, + { + "key": "mco.download.cancelled", + "english_translation": "Download cancelled" + }, + { + "key": "options.percent_add_value", + "english_translation": "%s: +%s%%" + }, + { + "key": "item.minecraft.firework_star.light_gray", + "english_translation": "Light Gray" + }, + { + "key": "entity.minecraft.zombie_horse", + "english_translation": "Zombie Horse" + }, + { + "key": "argument.resource.not_found", + "english_translation": "Can't find element '%s' of type '%s'" + }, + { + "key": "flat_world_preset.minecraft.bottomless_pit", + "english_translation": "Bottomless Pit" + }, + { + "key": "subtitles.entity.turtle.shamble", + "english_translation": "Turtle shambles" + }, + { + "key": "argument.entity.options.valueless", + "english_translation": "Expected value for option '%s'" + }, + { + "key": "addServer.resourcePack", + "english_translation": "Server Resource Packs" + }, + { + "key": "commands.worldborder.get", + "english_translation": "The world border is currently %s block(s) wide" + }, + { + "key": "key.screenshot", + "english_translation": "Take Screenshot" + }, + { + "key": "gui.banned.title.temporary", + "english_translation": "Account temporarily suspended" + }, + { + "key": "block.minecraft.banner.triangles_bottom.cyan", + "english_translation": "Cyan Base Indented" + }, + { + "key": "block.minecraft.white_concrete", + "english_translation": "White Concrete" + }, + { + "key": "block.minecraft.birch_wall_sign", + "english_translation": "Birch Wall Sign" + }, + { + "key": "advancements.husbandry.ride_a_boat_with_a_goat.title", + "english_translation": "Whatever Floats Your Goat!" + }, + { + "key": "block.minecraft.banner.base.gray", + "english_translation": "Fully Gray Field" + }, + { + "key": "item.minecraft.experience_bottle", + "english_translation": "Bottle o' Enchanting" + }, + { + "key": "subtitles.entity.bat.death", + "english_translation": "Bat dies" + }, + { + "key": "instrument.minecraft.sing_goat_horn", + "english_translation": "Sing" + }, + { + "key": "subtitles.block.generic.break", + "english_translation": "Block broken" + }, + { + "key": "gui.banned.description.unknownreason", + "english_translation": "We recently received a report for bad behavior by your account. Our moderators have now reviewed your case and identified that it goes against the Minecraft Community Standards." + }, + { + "key": "commands.whitelist.add.success", + "english_translation": "Added %s to the whitelist" + }, + { + "key": "commands.clone.success", + "english_translation": "Successfully cloned %s block(s)" + }, + { + "key": "death.attack.explosion", + "english_translation": "%1$s blew up" + }, + { + "key": "entity.minecraft.glow_squid", + "english_translation": "Glow Squid" + }, + { + "key": "block.minecraft.crimson_hyphae", + "english_translation": "Crimson Hyphae" + }, + { + "key": "pack.dropInfo", + "english_translation": "Drag and drop files into this window to add packs" + }, + { + "key": "block.minecraft.black_wool", + "english_translation": "Black Wool" + }, + { + "key": "selectWorld.warning.experimental.question", + "english_translation": "These settings are experimental and could one day stop working. Do you wish to proceed?" + }, + { + "key": "block.minecraft.magenta_bed", + "english_translation": "Magenta Bed" + }, + { + "key": "subtitles.entity.snow_golem.death", + "english_translation": "Snow Golem dies" + }, + { + "key": "commands.spectate.self", + "english_translation": "Cannot spectate yourself" + }, + { + "key": "item.minecraft.lingering_potion.effect.regeneration", + "english_translation": "Lingering Potion of Regeneration" + }, + { + "key": "telemetry.property.load_time_loading_overlay_ms.title", + "english_translation": "Time in Loading Screen (Milliseconds)" + }, + { + "key": "block.minecraft.banner.cross.red", + "english_translation": "Red Saltire" + }, + { + "key": "block.minecraft.red_mushroom_block", + "english_translation": "Red Mushroom Block" + }, + { + "key": "entity.minecraft.fireball", + "english_translation": "Fireball" + }, + { + "key": "instrument.minecraft.ponder_goat_horn", + "english_translation": "Ponder" + }, + { + "key": "mirror.none", + "english_translation": "|" + }, + { + "key": "subtitles.entity.zombie.converted_to_drowned", + "english_translation": "Zombie converts to Drowned" + }, + { + "key": "subtitles.entity.wandering_trader.no", + "english_translation": "Wandering Trader disagrees" + }, + { + "key": "stat.minecraft.leave_game", + "english_translation": "Games Quit" + }, + { + "key": "block.minecraft.banner.gradient_up.blue", + "english_translation": "Blue Base Gradient" + }, + { + "key": "advancements.nether.ride_strider_in_overworld_lava.title", + "english_translation": "Feels Like Home" + }, + { + "key": "item.minecraft.mooshroom_spawn_egg", + "english_translation": "Mooshroom Spawn Egg" + }, + { + "key": "commands.attribute.modifier.value.get.success", + "english_translation": "Value of modifier %s on attribute %s for entity %s is %s" + }, + { + "key": "stat.minecraft.damage_blocked_by_shield", + "english_translation": "Damage Blocked by Shield" + }, + { + "key": "item.minecraft.smithing_template.armor_trim.ingredients", + "english_translation": "Ingots & Crystals" + }, + { + "key": "argument.long.big", + "english_translation": "Long must not be more than %s, found %s" + }, + { + "key": "subtitles.entity.goat.death", + "english_translation": "Goat dies" + }, + { + "key": "item.minecraft.netherite_helmet", + "english_translation": "Netherite Helmet" + }, + { + "key": "telemetry.property.user_id.title", + "english_translation": "User ID" + }, + { + "key": "key.swapOffhand", + "english_translation": "Swap Item With Offhand" + }, + { + "key": "subtitles.item.armor.equip_chain", + "english_translation": "Chain armor jingles" + }, + { + "key": "key.jump", + "english_translation": "Jump" + }, + { + "key": "selectWorld.delete_failure", + "english_translation": "Failed to delete world" + }, + { + "key": "block.minecraft.banner.bricks.orange", + "english_translation": "Orange Field Masoned" + }, + { + "key": "selectWorld.futureworld.error.title", + "english_translation": "An error occurred!" + }, + { + "key": "block.minecraft.banner.triangle_top.yellow", + "english_translation": "Yellow Inverted Chevron" + }, + { + "key": "soundCategory.master", + "english_translation": "Master Volume" + }, + { + "key": "jigsaw_block.keep_jigsaws", + "english_translation": "Keep Jigsaws" + }, + { + "key": "subtitles.item.ink_sac.use", + "english_translation": "Ink Sac splotches" + }, + { + "key": "subtitles.entity.villager.trade", + "english_translation": "Villager trades" + }, + { + "key": "block.minecraft.frogspawn", + "english_translation": "Frogspawn" + }, + { + "key": "subtitles.entity.wolf.hurt", + "english_translation": "Wolf hurts" + }, + { + "key": "argument.entity.options.team.description", + "english_translation": "Entities on team" + }, + { + "key": "telemetry.property.advancement_game_time.title", + "english_translation": "Game Time (Ticks)" + }, + { + "key": "item.minecraft.music_disc_5", + "english_translation": "Music Disc" + }, + { + "key": "commands.team.option.nametagVisibility.unchanged", + "english_translation": "Nothing changed. Nametag visibility is already that value" + }, + { + "key": "block.minecraft.oak_pressure_plate", + "english_translation": "Oak Pressure Plate" + }, + { + "key": "mco.backup.button.download", + "english_translation": "Download latest" + }, + { + "key": "advancements.adventure.spyglass_at_dragon.title", + "english_translation": "Is It a Plane?" + }, + { + "key": "commands.title.show.actionbar.single", + "english_translation": "Showing new actionbar title for %s" + }, + { + "key": "lectern.take_book", + "english_translation": "Take Book" + }, + { + "key": "subtitles.entity.painting.break", + "english_translation": "Painting breaks" + }, + { + "key": "block.minecraft.birch_wood", + "english_translation": "Birch Wood" + }, + { + "key": "createWorld.customize.custom.randomize", + "english_translation": "Randomize" + }, + { + "key": "block.minecraft.banner.gradient_up.lime", + "english_translation": "Lime Base Gradient" + }, + { + "key": "enchantment.minecraft.thorns", + "english_translation": "Thorns" + }, + { + "key": "commands.bossbar.set.name.unchanged", + "english_translation": "Nothing changed. That's already the name of this bossbar" + }, + { + "key": "argument.criteria.invalid", + "english_translation": "Unknown criterion '%s'" + }, + { + "key": "connect.authorizing", + "english_translation": "Logging in..." + }, + { + "key": "death.attack.flyIntoWall.player", + "english_translation": "%1$s experienced kinetic energy whilst trying to escape %2$s" + }, + { + "key": "commands.tag.list.multiple.empty", + "english_translation": "There are no tags on the %s entities" + }, + { + "key": "key.keyboard.space", + "english_translation": "Space" + }, + { + "key": "key.socialInteractions", + "english_translation": "Social Interactions Screen" + }, + { + "key": "commands.team.option.deathMessageVisibility.success", + "english_translation": "Death message visibility for team %s is now \"%s\"" + }, + { + "key": "gui.chatReport.discard.return", + "english_translation": "Continue Editing" + }, + { + "key": "block.minecraft.amethyst_block", + "english_translation": "Block of Amethyst" + }, + { + "key": "item.minecraft.red_dye", + "english_translation": "Red Dye" + }, + { + "key": "subtitles.entity.painting.place", + "english_translation": "Painting placed" + }, + { + "key": "mco.minigame.world.noSelection", + "english_translation": "Please make a selection" + }, + { + "key": "block.minecraft.banner.small_stripes.orange", + "english_translation": "Orange Paly" + }, + { + "key": "subtitles.entity.iron_golem.damage", + "english_translation": "Iron Golem breaks" + }, + { + "key": "pack.openFolder", + "english_translation": "Open Pack Folder" + }, + { + "key": "addServer.resourcePack.enabled", + "english_translation": "Enabled" + }, + { + "key": "block.minecraft.air", + "english_translation": "Air" + }, + { + "key": "title.32bit.deprecation.realms.header", + "english_translation": "32-bit system detected" + }, + { + "key": "commands.place.jigsaw.failed", + "english_translation": "Failed to generate jigsaw" + }, + { + "key": "subtitles.entity.parrot.imitate.slime", + "english_translation": "Parrot squishes" + }, + { + "key": "commands.debug.alreadyRunning", + "english_translation": "The tick profiler is already started" + }, + { + "key": "block.minecraft.banner.curly_border.orange", + "english_translation": "Orange Bordure Indented" + }, + { + "key": "block.minecraft.poppy", + "english_translation": "Poppy" + }, + { + "key": "block.minecraft.cherry_hanging_sign", + "english_translation": "Cherry Hanging Sign" + }, + { + "key": "item.minecraft.firework_rocket", + "english_translation": "Firework Rocket" + }, + { + "key": "advancements.nether.create_full_beacon.title", + "english_translation": "Beaconator" + }, + { + "key": "block.minecraft.crimson_pressure_plate", + "english_translation": "Crimson Pressure Plate" + }, + { + "key": "item.canPlace", + "english_translation": "Can be placed on:" + }, + { + "key": "subtitles.entity.illusioner.prepare_mirror", + "english_translation": "Illusioner prepares mirror image" + }, + { + "key": "gamerule.doEntityDrops.description", + "english_translation": "Controls drops from minecarts (including inventories), item frames, boats, etc." + }, + { + "key": "item.minecraft.shield.brown", + "english_translation": "Brown Shield" + }, + { + "key": "subtitles.entity.wither.shoot", + "english_translation": "Wither attacks" + }, + { + "key": "mco.selectServer.configure", + "english_translation": "Configure" + }, + { + "key": "commands.debug.function.traceFailed", + "english_translation": "Failed to trace function" + }, + { + "key": "options.sensitivity.max", + "english_translation": "HYPERSPEED!!!" + }, + { + "key": "gui.up", + "english_translation": "Up" + }, + { + "key": "commands.fill.failed", + "english_translation": "No blocks were filled" + }, + { + "key": "options.prioritizeChunkUpdates.byPlayer.tooltip", + "english_translation": "Some actions within a chunk will recompile the chunk immediately. This includes block placing & destroying." + }, + { + "key": "commands.scoreboard.objectives.modify.rendertype", + "english_translation": "Changed the render type of objective %s" + }, + { + "key": "commands.advancement.revoke.criterion.to.many.success", + "english_translation": "Revoked criterion '%s' of advancement %s from %s players" + }, + { + "key": "block.minecraft.deepslate_brick_slab", + "english_translation": "Deepslate Brick Slab" + }, + { + "key": "createWorld.tab.more.title", + "english_translation": "More" + }, + { + "key": "commands.team.option.suffix.success", + "english_translation": "Team suffix set to %s" + }, + { + "key": "mco.selectServer.leave", + "english_translation": "Leave realm" + }, + { + "key": "block.minecraft.purpur_block", + "english_translation": "Purpur Block" + }, + { + "key": "item.minecraft.cooked_chicken", + "english_translation": "Cooked Chicken" + }, + { + "key": "options.accessibility.high_contrast", + "english_translation": "High Contrast" + }, + { + "key": "options.attackIndicator", + "english_translation": "Attack Indicator" + }, + { + "key": "structure_block.custom_data", + "english_translation": "Custom Data Tag Name" + }, + { + "key": "block.minecraft.oak_sign", + "english_translation": "Oak Sign" + }, + { + "key": "selectWorld.newWorld", + "english_translation": "New World" + }, + { + "key": "item.minecraft.nether_star", + "english_translation": "Nether Star" + }, + { + "key": "subtitles.entity.pillager.celebrate", + "english_translation": "Pillager cheers" + }, + { + "key": "block.minecraft.structure_block", + "english_translation": "Structure Block" + }, + { + "key": "item.minecraft.splash_potion.effect.harming", + "english_translation": "Splash Potion of Harming" + }, + { + "key": "entity.minecraft.falling_block_type", + "english_translation": "Falling %s" + }, + { + "key": "chat.link.confirm", + "english_translation": "Are you sure you want to open the following website?" + }, + { + "key": "demo.help.title", + "english_translation": "Minecraft Demo Mode" + }, + { + "key": "subtitles.entity.parrot.imitate.spider", + "english_translation": "Parrot hisses" + }, + { + "key": "mco.reset.world.seed", + "english_translation": "Seed (Optional)" + }, + { + "key": "subtitles.item.nether_wart.plant", + "english_translation": "Crop planted" + }, + { + "key": "block.minecraft.bone_block", + "english_translation": "Bone Block" + }, + { + "key": "options.ao.min", + "english_translation": "Minimum" + }, + { + "key": "block.minecraft.banner.half_vertical.magenta", + "english_translation": "Magenta Per Pale" + }, + { + "key": "chat.deleted_marker", + "english_translation": "This chat message has been deleted by the server." + }, + { + "key": "subtitles.entity.camel.dash_ready", + "english_translation": "Camel recovers" + }, + { + "key": "block.minecraft.suspicious_gravel", + "english_translation": "Suspicious Gravel" + }, + { + "key": "subtitles.entity.phantom.hurt", + "english_translation": "Phantom hurts" + }, + { + "key": "block.minecraft.azalea", + "english_translation": "Azalea" + }, + { + "key": "telemetry.property.client_id.title", + "english_translation": "Client ID" + }, + { + "key": "block.minecraft.banner.rhombus.orange", + "english_translation": "Orange Lozenge" + }, + { + "key": "key.command", + "english_translation": "Open Command" + }, + { + "key": "subtitles.entity.piglin_brute.ambient", + "english_translation": "Piglin Brute snorts" + }, + { + "key": "commands.ride.mount.failure.generic", + "english_translation": "%s couldn't start riding %s" + }, + { + "key": "sign.edit", + "english_translation": "Edit Sign Message" + }, + { + "key": "narration.checkbox.usage.focused", + "english_translation": "Press Enter to toggle" + }, + { + "key": "block.minecraft.spruce_pressure_plate", + "english_translation": "Spruce Pressure Plate" + }, + { + "key": "block.minecraft.set_spawn", + "english_translation": "Respawn point set" + }, + { + "key": "gameMode.changed", + "english_translation": "Your game mode has been updated to %s" + }, + { + "key": "subtitles.entity.parrot.imitate.zoglin", + "english_translation": "Parrot growls" + }, + { + "key": "commands.data.entity.invalid", + "english_translation": "Unable to modify player data" + }, + { + "key": "multiplayer.disconnect.invalid_packet", + "english_translation": "Server sent an invalid packet" + }, + { + "key": "item.minecraft.sheaf_pottery_shard", + "english_translation": "Sheaf Pottery Shard" + }, + { + "key": "biome.minecraft.windswept_forest", + "english_translation": "Windswept Forest" + }, + { + "key": "debug.reload_resourcepacks.message", + "english_translation": "Reloaded resource packs" + }, + { + "key": "argument.nbt.list.mixed", + "english_translation": "Can't insert %s into list of %s" + }, + { + "key": "advancements.sad_label", + "english_translation": ":(" + }, + { + "key": "item.minecraft.music_disc_strad", + "english_translation": "Music Disc" + }, + { + "key": "entity.minecraft.boat", + "english_translation": "Boat" + }, + { + "key": "advancements.adventure.summon_iron_golem.description", + "english_translation": "Summon an Iron Golem to help defend a village" + }, + { + "key": "subtitles.entity.camel.death", + "english_translation": "Camel dies" + }, + { + "key": "disconnect.ignoring_status_request", + "english_translation": "Ignoring status request" + }, + { + "key": "subtitles.entity.villager.hurt", + "english_translation": "Villager hurts" + }, + { + "key": "block.minecraft.birch_fence", + "english_translation": "Birch Fence" + }, + { + "key": "subtitles.item.brush.brushing.generic", + "english_translation": "Brushing" + }, + { + "key": "debug.crash.message", + "english_translation": "F3 + C is held down. This will crash the game unless released." + }, + { + "key": "subtitles.entity.illusioner.death", + "english_translation": "Illusioner dies" + }, + { + "key": "gui.toWorld", + "english_translation": "Back to World List" + }, + { + "key": "commands.datapack.list.enabled.success", + "english_translation": "There are %s data pack(s) enabled: %s" + }, + { + "key": "block.minecraft.banner.half_vertical.green", + "english_translation": "Green Per Pale" + }, + { + "key": "gamerule.spawnRadius", + "english_translation": "Respawn location radius" + }, + { + "key": "painting.minecraft.earth.author", + "english_translation": "Mojang" + }, + { + "key": "block.minecraft.banner.triangles_top.light_gray", + "english_translation": "Light Gray Chief Indented" + }, + { + "key": "createWorld.customize.custom.coordinateScale", + "english_translation": "Coordinate Scale" + }, + { + "key": "block.minecraft.banner.square_top_left.black", + "english_translation": "Black Chief Dexter Canton" + }, + { + "key": "effect.minecraft.conduit_power", + "english_translation": "Conduit Power" + }, + { + "key": "advancements.end.elytra.description", + "english_translation": "Find Elytra" + }, + { + "key": "subtitles.entity.blaze.burn", + "english_translation": "Blaze crackles" + }, + { + "key": "advancements.end.dragon_breath.description", + "english_translation": "Collect Dragon's Breath in a Glass Bottle" + }, + { + "key": "multiplayer.disconnect.name_taken", + "english_translation": "That name is already taken" + }, + { + "key": "disconnect.loginFailedInfo.insufficientPrivileges", + "english_translation": "Multiplayer is disabled. Please check your Microsoft account settings." + }, + { + "key": "block.minecraft.dead_horn_coral_block", + "english_translation": "Dead Horn Coral Block" + }, + { + "key": "gamerule.doVinesSpread", + "english_translation": "Vines spread" + }, + { + "key": "entity.minecraft.firework_rocket", + "english_translation": "Firework Rocket" + }, + { + "key": "block.minecraft.banner.rhombus.black", + "english_translation": "Black Lozenge" + }, + { + "key": "subtitles.entity.elder_guardian.ambient_land", + "english_translation": "Elder Guardian flaps" + }, + { + "key": "block.minecraft.waxed_exposed_cut_copper_stairs", + "english_translation": "Waxed Exposed Cut Copper Stairs" + }, + { + "key": "death.attack.outOfWorld", + "english_translation": "%1$s fell out of the world" + }, + { + "key": "options.sensitivity.min", + "english_translation": "*yawn*" + }, + { + "key": "mco.connect.authorizing", + "english_translation": "Logging in..." + }, + { + "key": "menu.quit", + "english_translation": "Quit Game" + }, + { + "key": "stat.minecraft.interact_with_cartography_table", + "english_translation": "Interactions with Cartography Table" + }, + { + "key": "block.minecraft.banner.stripe_left.white", + "english_translation": "White Pale Dexter" + }, + { + "key": "chat.queue", + "english_translation": "[+%s pending lines]" + }, + { + "key": "commands.scoreboard.players.operation.success.single", + "english_translation": "Set %s for %s to %s" + }, + { + "key": "selectWorld.experimental", + "english_translation": "Experimental" + }, + { + "key": "item.minecraft.angler_pottery_sherd", + "english_translation": "Angler Pottery Sherd" + }, + { + "key": "block.minecraft.deepslate_gold_ore", + "english_translation": "Deepslate Gold Ore" + }, + { + "key": "block.minecraft.end_stone_brick_wall", + "english_translation": "End Stone Brick Wall" + }, + { + "key": "gui.banned.description.permanent", + "english_translation": "Your account is permanently banned, which means you can’t play online or join Realms." + }, + { + "key": "subtitles.entity.puffer_fish.blow_up", + "english_translation": "Pufferfish inflates" + }, + { + "key": "enchantment.minecraft.aqua_affinity", + "english_translation": "Aqua Affinity" + }, + { + "key": "commands.scoreboard.players.reset.specific.multiple", + "english_translation": "Reset %s for %s entities" + }, + { + "key": "entity.minecraft.ender_pearl", + "english_translation": "Thrown Ender Pearl" + }, + { + "key": "block.minecraft.blue_stained_glass_pane", + "english_translation": "Blue Stained Glass Pane" + }, + { + "key": "block.minecraft.smoker", + "english_translation": "Smoker" + }, + { + "key": "gui.socialInteractions.hidden_in_chat", + "english_translation": "Chat messages from %s will be hidden" + }, + { + "key": "commands.bossbar.list.bars.some", + "english_translation": "There are %s custom bossbar(s) active: %s" + }, + { + "key": "effect.minecraft.instant_damage", + "english_translation": "Instant Damage" + }, + { + "key": "item.canBreak", + "english_translation": "Can break:" + }, + { + "key": "death.attack.trident", + "english_translation": "%1$s was impaled by %2$s" + }, + { + "key": "block.minecraft.blue_stained_glass", + "english_translation": "Blue Stained Glass" + }, + { + "key": "enchantment.minecraft.protection", + "english_translation": "Protection" + }, + { + "key": "options.guiScale.auto", + "english_translation": "Auto" + }, + { + "key": "block.minecraft.spruce_hanging_sign", + "english_translation": "Spruce Hanging Sign" + }, + { + "key": "subtitles.entity.sheep.ambient", + "english_translation": "Sheep baahs" + }, + { + "key": "block.minecraft.blue_candle", + "english_translation": "Blue Candle" + }, + { + "key": "block.minecraft.weeping_vines", + "english_translation": "Weeping Vines" + }, + { + "key": "gui.banned.reason.defamation_impersonation_false_information", + "english_translation": "Impersonation or sharing information to exploit or mislead others" + }, + { + "key": "subtitles.entity.fox.teleport", + "english_translation": "Fox teleports" + }, + { + "key": "subtitles.entity.snowball.throw", + "english_translation": "Snowball flies" + }, + { + "key": "subtitles.block.note_block.note", + "english_translation": "Note Block plays" + }, + { + "key": "block.minecraft.banner.triangles_top.white", + "english_translation": "White Chief Indented" + }, + { + "key": "enchantment.level.10", + "english_translation": "X" + }, + { + "key": "subtitles.entity.vex.charge", + "english_translation": "Vex shrieks" + }, + { + "key": "item.minecraft.black_dye", + "english_translation": "Black Dye" + }, + { + "key": "menu.playerReporting", + "english_translation": "Player Reporting" + }, + { + "key": "block.minecraft.polished_blackstone_brick_wall", + "english_translation": "Polished Blackstone Brick Wall" + }, + { + "key": "commands.time.query", + "english_translation": "The time is %s" + }, + { + "key": "advancements.end.enter_end_gateway.title", + "english_translation": "Remote Getaway" + }, + { + "key": "advancements.husbandry.make_a_sign_glow.title", + "english_translation": "Glow and Behold!" + }, + { + "key": "structure_block.button.detect_size", + "english_translation": "DETECT" + }, + { + "key": "container.loom", + "english_translation": "Loom" + }, + { + "key": "entity.minecraft.ender_dragon", + "english_translation": "Ender Dragon" + }, + { + "key": "block.minecraft.banner.half_horizontal_bottom.white", + "english_translation": "White Per Fess Inverted" + }, + { + "key": "block.minecraft.anvil", + "english_translation": "Anvil" + }, + { + "key": "selectServer.edit", + "english_translation": "Edit" + }, + { + "key": "mco.backup.entry.templateName", + "english_translation": "Template Name" + }, + { + "key": "subtitles.enchant.thorns.hit", + "english_translation": "Thorns prick" + }, + { + "key": "options.ao.max", + "english_translation": "Maximum" + }, + { + "key": "block.minecraft.cyan_candle_cake", + "english_translation": "Cake with Cyan Candle" + }, + { + "key": "block.minecraft.oak_wall_sign", + "english_translation": "Oak Wall Sign" + }, + { + "key": "block.minecraft.brewing_stand", + "english_translation": "Brewing Stand" + }, + { + "key": "telemetry.property.number_of_samples.title", + "english_translation": "Sample Count" + }, + { + "key": "block.minecraft.pink_candle", + "english_translation": "Pink Candle" + }, + { + "key": "block.minecraft.banner.square_top_left.green", + "english_translation": "Green Chief Dexter Canton" + }, + { + "key": "death.attack.lightningBolt.player", + "english_translation": "%1$s was struck by lightning whilst fighting %2$s" + }, + { + "key": "options.key.toggle", + "english_translation": "Toggle" + }, + { + "key": "block.minecraft.deepslate_bricks", + "english_translation": "Deepslate Bricks" + }, + { + "key": "itemGroup.ingredients", + "english_translation": "Ingredients" + }, + { + "key": "item.minecraft.villager_spawn_egg", + "english_translation": "Villager Spawn Egg" + }, + { + "key": "effect.minecraft.absorption", + "english_translation": "Absorption" + }, + { + "key": "block.minecraft.light_gray_concrete", + "english_translation": "Light Gray Concrete" + }, + { + "key": "commands.datapack.enable.failed.no_flags", + "english_translation": "Pack '%s' cannot be enabled, since required flags are not enabled in this world: %s!" + }, + { + "key": "block.minecraft.dead_brain_coral", + "english_translation": "Dead Brain Coral" + }, + { + "key": "compliance.playtime.hours", + "english_translation": "You've been playing for %s hour(s)" + }, + { + "key": "block.minecraft.banner.rhombus.green", + "english_translation": "Green Lozenge" + }, + { + "key": "item.minecraft.saddle", + "english_translation": "Saddle" + }, + { + "key": "menu.loadingLevel", + "english_translation": "Loading world" + }, + { + "key": "structure_block.size", + "english_translation": "Structure Size" + }, + { + "key": "lanServer.otherPlayers", + "english_translation": "Settings for Other Players" + }, + { + "key": "block.minecraft.green_concrete_powder", + "english_translation": "Green Concrete Powder" + }, + { + "key": "subtitles.entity.goat.long_jump", + "english_translation": "Goat leaps" + }, + { + "key": "block.minecraft.red_mushroom", + "english_translation": "Red Mushroom" + }, + { + "key": "structure_block.integrity.integrity", + "english_translation": "Structure Integrity" + }, + { + "key": "subtitles.item.crossbow.load", + "english_translation": "Crossbow loads" + }, + { + "key": "advancements.story.shiny_gear.description", + "english_translation": "Diamond armor saves lives" + }, + { + "key": "subtitles.entity.phantom.swoop", + "english_translation": "Phantom swoops" + }, + { + "key": "block.minecraft.banner.cross.lime", + "english_translation": "Lime Saltire" + }, + { + "key": "block.minecraft.banner.stripe_downleft.light_blue", + "english_translation": "Light Blue Bend Sinister" + }, + { + "key": "book.finalizeWarning", + "english_translation": "Note! When you sign the book, it will no longer be editable." + }, + { + "key": "demo.day.2", + "english_translation": "Day Two" + }, + { + "key": "demo.day.1", + "english_translation": "This demo will last five game days. Do your best!" + }, + { + "key": "demo.day.4", + "english_translation": "Day Four" + }, + { + "key": "commands.data.block.get", + "english_translation": "%s on block %s, %s, %s after scale factor of %s is %s" + }, + { + "key": "demo.day.3", + "english_translation": "Day Three" + }, + { + "key": "enchantment.minecraft.sharpness", + "english_translation": "Sharpness" + }, + { + "key": "item.minecraft.slime_ball", + "english_translation": "Slimeball" + }, + { + "key": "demo.day.6", + "english_translation": "You have passed your fifth day. Use %s to save a screenshot of your creation." + }, + { + "key": "demo.day.5", + "english_translation": "This is your last day!" + }, + { + "key": "item.minecraft.magenta_dye", + "english_translation": "Magenta Dye" + }, + { + "key": "item.minecraft.glistering_melon_slice", + "english_translation": "Glistering Melon Slice" + }, + { + "key": "subtitles.entity.slime.attack", + "english_translation": "Slime attacks" + }, + { + "key": "subtitles.entity.enderman.ambient", + "english_translation": "Enderman vwoops" + }, + { + "key": "block.minecraft.potted_red_tulip", + "english_translation": "Potted Red Tulip" + }, + { + "key": "gamerule.playersSleepingPercentage.description", + "english_translation": "The percentage of players who must be sleeping to skip the night." + }, + { + "key": "subtitles.entity.turtle.egg_crack", + "english_translation": "Turtle Egg cracks" + }, + { + "key": "chat.tag.modified", + "english_translation": "Message modified by the server. Original:" + }, + { + "key": "gamerule.doLimitedCrafting.description", + "english_translation": "If enabled, players will be able to craft only unlocked recipes." + }, + { + "key": "advancements.husbandry.tadpole_in_a_bucket.title", + "english_translation": "Bukkit Bukkit" + }, + { + "key": "block.minecraft.banner.stripe_downright.cyan", + "english_translation": "Cyan Bend" + }, + { + "key": "item.minecraft.skull_banner_pattern.desc", + "english_translation": "Skull Charge" + }, + { + "key": "block.minecraft.banner.cross.orange", + "english_translation": "Orange Saltire" + }, + { + "key": "disconnect.closed", + "english_translation": "Connection closed" + }, + { + "key": "commands.experience.set.levels.success.single", + "english_translation": "Set %s experience levels on %s" + }, + { + "key": "container.spectatorCantOpen", + "english_translation": "Unable to open. Loot not generated yet." + }, + { + "key": "block.minecraft.banner.diagonal_left.lime", + "english_translation": "Lime Per Bend Sinister" + }, + { + "key": "block.minecraft.infested_mossy_stone_bricks", + "english_translation": "Infested Mossy Stone Bricks" + }, + { + "key": "resourcePack.vanilla.description", + "english_translation": "The default look and feel of Minecraft" + }, + { + "key": "multiplayer.disconnect.invalid_public_key_signature", + "english_translation": "Invalid signature for profile public key.\nTry restarting your game." + }, + { + "key": "death.attack.anvil", + "english_translation": "%1$s was squashed by a falling anvil" + }, + { + "key": "subtitles.entity.wandering_trader.drink_milk", + "english_translation": "Wandering Trader drinks milk" + }, + { + "key": "gui.toTitle", + "english_translation": "Back to Title Screen" + }, + { + "key": "selectServer.refresh", + "english_translation": "Refresh" + }, + { + "key": "enchantment.minecraft.swift_sneak", + "english_translation": "Swift Sneak" + }, + { + "key": "block.minecraft.banner.bricks.gray", + "english_translation": "Gray Field Masoned" + }, + { + "key": "block.minecraft.packed_ice", + "english_translation": "Packed Ice" + }, + { + "key": "gui.chatReport.observed_what", + "english_translation": "Why are you reporting this?" + }, + { + "key": "narrator.controls.unbound", + "english_translation": "%s is not bound" + }, + { + "key": "commands.effect.give.success.single", + "english_translation": "Applied effect %s to %s" + }, + { + "key": "advMode.mode.unconditional", + "english_translation": "Unconditional" + }, + { + "key": "spectatorMenu.close", + "english_translation": "Close Menu" + }, + { + "key": "block.minecraft.banner.gradient.purple", + "english_translation": "Purple Gradient" + }, + { + "key": "item.minecraft.brick", + "english_translation": "Brick" + }, + { + "key": "block.minecraft.mossy_cobblestone_slab", + "english_translation": "Mossy Cobblestone Slab" + }, + { + "key": "subtitles.ambient.cave", + "english_translation": "Eerie noise" + }, + { + "key": "subtitles.block.pointed_dripstone.drip_lava", + "english_translation": "Lava drips" + }, + { + "key": "entity.minecraft.shulker", + "english_translation": "Shulker" + }, + { + "key": "pack.available.title", + "english_translation": "Available" + }, + { + "key": "block.minecraft.banner.square_top_right.orange", + "english_translation": "Orange Chief Sinister Canton" + }, + { + "key": "commands.save.success", + "english_translation": "Saved the game" + }, + { + "key": "subtitles.item.armor.equip_diamond", + "english_translation": "Diamond armor clangs" + }, + { + "key": "subtitles.item.armor.equip_netherite", + "english_translation": "Netherite armor clanks" + }, + { + "key": "createWorld.customize.custom.useTemples", + "english_translation": "Temples" + }, + { + "key": "block.minecraft.dark_oak_stairs", + "english_translation": "Dark Oak Stairs" + }, + { + "key": "advancements.nether.uneasy_alliance.title", + "english_translation": "Uneasy Alliance" + }, + { + "key": "block.minecraft.andesite", + "english_translation": "Andesite" + }, + { + "key": "subtitles.entity.skeleton.death", + "english_translation": "Skeleton dies" + }, + { + "key": "block.minecraft.banner.stripe_middle.brown", + "english_translation": "Brown Fess" + }, + { + "key": "block.minecraft.banner.diagonal_left.green", + "english_translation": "Green Per Bend Sinister" + }, + { + "key": "block.minecraft.pink_petals", + "english_translation": "Pink Petals" + }, + { + "key": "stat.minecraft.pig_one_cm", + "english_translation": "Distance by Pig" + }, + { + "key": "subtitles.entity.zoglin.angry", + "english_translation": "Zoglin growls angrily" + }, + { + "key": "argument.entity.selector.not_allowed", + "english_translation": "Selector not allowed" + }, + { + "key": "block.minecraft.gray_carpet", + "english_translation": "Gray Carpet" + }, + { + "key": "item.nbt_tags", + "english_translation": "NBT: %s tag(s)" + }, + { + "key": "subtitles.item.armor.equip_gold", + "english_translation": "Gold armor clinks" + }, + { + "key": "potion.withAmplifier", + "english_translation": "%s %s" + }, + { + "key": "item.minecraft.diamond_leggings", + "english_translation": "Diamond Leggings" + }, + { + "key": "argument.player.entities", + "english_translation": "Only players may be affected by this command, but the provided selector includes entities" + }, + { + "key": "subtitles.entity.ravager.attack", + "english_translation": "Ravager bites" + }, + { + "key": "item.minecraft.arms_up_pottery_shard", + "english_translation": "Arms Up Pottery Shard" + }, + { + "key": "block.minecraft.cobbled_deepslate_slab", + "english_translation": "Cobbled Deepslate Slab" + }, + { + "key": "block.minecraft.banner.base.light_gray", + "english_translation": "Fully Light Gray Field" + }, + { + "key": "block.minecraft.chain_command_block", + "english_translation": "Chain Command Block" + }, + { + "key": "block.minecraft.iron_ore", + "english_translation": "Iron Ore" + }, + { + "key": "block.minecraft.banner.square_top_left.orange", + "english_translation": "Orange Chief Dexter Canton" + }, + { + "key": "multiplayer.disconnect.chat_validation_failed", + "english_translation": "Chat message validation failure" + }, + { + "key": "options.narrator.off", + "english_translation": "OFF" + }, + { + "key": "block.minecraft.purpur_pillar", + "english_translation": "Purpur Pillar" + }, + { + "key": "multiplayer.disconnect.banned.reason", + "english_translation": "You are banned from this server.\nReason: %s" + }, + { + "key": "block.minecraft.banner.triangle_top.brown", + "english_translation": "Brown Inverted Chevron" + }, + { + "key": "item.minecraft.smithing_template.netherite_upgrade.applies_to", + "english_translation": "Diamond Equipment" + }, + { + "key": "entity.minecraft.iron_golem", + "english_translation": "Iron Golem" + }, + { + "key": "subtitles.block.pointed_dripstone.drip_water_into_cauldron", + "english_translation": "Water drips into Cauldron" + }, + { + "key": "subtitles.entity.goat.prepare_ram", + "english_translation": "Goat stomps" + }, + { + "key": "advancements.adventure.walk_on_powder_snow_with_leather_boots.title", + "english_translation": "Light as a Rabbit" + }, + { + "key": "commands.save.failed", + "english_translation": "Unable to save the game (is there enough disk space?)" + }, + { + "key": "translation.test.escape", + "english_translation": "%%s %%%s %%%%s %%%%%s" + }, + { + "key": "item.minecraft.stick", + "english_translation": "Stick" + }, + { + "key": "itemGroup.buildingBlocks", + "english_translation": "Building Blocks" + }, + { + "key": "mco.brokenworld.title", + "english_translation": "Your current world is no longer supported" + }, + { + "key": "createWorld.customize.flat.height", + "english_translation": "Height" + }, + { + "key": "command.unknown.argument", + "english_translation": "Incorrect argument for command" + }, + { + "key": "lanServer.port.unavailable.new", + "english_translation": "Port not available.\nLeave the edit box empty or enter a different number between %s and %s." + }, + { + "key": "block.minecraft.deepslate_tile_stairs", + "english_translation": "Deepslate Tile Stairs" + }, + { + "key": "advancements.husbandry.allay_deliver_cake_to_note_block.title", + "english_translation": "Birthday Song" + }, + { + "key": "block.minecraft.polished_blackstone_slab", + "english_translation": "Polished Blackstone Slab" + }, + { + "key": "biome.minecraft.the_void", + "english_translation": "The Void" + }, + { + "key": "advancements.adventure.ol_betsy.title", + "english_translation": "Ol' Betsy" + }, + { + "key": "death.attack.sting.item", + "english_translation": "%1$s was stung to death by %2$s using %3$s" + }, + { + "key": "block.minecraft.light", + "english_translation": "Light" + }, + { + "key": "item.minecraft.tadpole_bucket", + "english_translation": "Bucket of Tadpole" + }, + { + "key": "advancements.adventure.throw_trident.description", + "english_translation": "Throw a Trident at something.\nNote: Throwing away your only weapon is not a good idea." + }, + { + "key": "commands.scoreboard.players.get.success", + "english_translation": "%s has %s %s" + }, + { + "key": "entity.minecraft.text_display", + "english_translation": "Text Display" + }, + { + "key": "options.chat.visibility.system", + "english_translation": "Commands Only" + }, + { + "key": "gamerule.doVinesSpread.description", + "english_translation": "Controls whether or not the Vines block spreads randomly to adjacent blocks. Does not affect other type of vine blocks such as Weeping Vines, Twisting Vines, etc." + }, + { + "key": "subtitles.entity.shulker.ambient", + "english_translation": "Shulker lurks" + }, + { + "key": "block.minecraft.redstone_torch", + "english_translation": "Redstone Torch" + }, + { + "key": "block.minecraft.banner.triangles_bottom.magenta", + "english_translation": "Magenta Base Indented" + }, + { + "key": "advancements.adventure.play_jukebox_in_meadows.title", + "english_translation": "Sound of Music" + }, + { + "key": "entity.minecraft.ghast", + "english_translation": "Ghast" + }, + { + "key": "team.collision.never", + "english_translation": "Never" + }, + { + "key": "block.minecraft.banner.cross.white", + "english_translation": "White Saltire" + }, + { + "key": "block.minecraft.light_gray_candle_cake", + "english_translation": "Cake with Light Gray Candle" + }, + { + "key": "block.minecraft.waxed_oxidized_copper", + "english_translation": "Waxed Oxidized Copper" + }, + { + "key": "multiplayer.status.cancelled", + "english_translation": "Cancelled" + }, + { + "key": "createWorld.customize.custom.useWaterLakes", + "english_translation": "Water Lakes" + }, + { + "key": "block.minecraft.mangrove_propagule", + "english_translation": "Mangrove Propagule" + }, + { + "key": "subtitles.entity.player.burp", + "english_translation": "Burp" + }, + { + "key": "gui.ok", + "english_translation": "Ok" + }, + { + "key": "gui.abuseReport.reason.child_sexual_exploitation_or_abuse.description", + "english_translation": "Someone is talking about or otherwise promoting indecent behavior involving children." + }, + { + "key": "block.minecraft.stripped_spruce_wood", + "english_translation": "Stripped Spruce Wood" + }, + { + "key": "block.minecraft.banner.half_horizontal.white", + "english_translation": "White Per Fess" + }, + { + "key": "subtitles.entity.bee.ambient", + "english_translation": "Bee buzzes" + }, + { + "key": "debug.dump_dynamic_textures.help", + "english_translation": "F3 + S = Dump dynamic textures" + }, + { + "key": "subtitles.entity.pillager.death", + "english_translation": "Pillager dies" + }, + { + "key": "chat.tag.system", + "english_translation": "Server message. Cannot be reported." + }, + { + "key": "effect.minecraft.health_boost", + "english_translation": "Health Boost" + }, + { + "key": "block.minecraft.stripped_dark_oak_log", + "english_translation": "Stripped Dark Oak Log" + }, + { + "key": "commands.give.success.multiple", + "english_translation": "Gave %s %s to %s players" + }, + { + "key": "block.minecraft.red_banner", + "english_translation": "Red Banner" + }, + { + "key": "death.attack.generic.player", + "english_translation": "%1$s died because of %2$s" + }, + { + "key": "block.minecraft.banner.flower.orange", + "english_translation": "Orange Flower Charge" + }, + { + "key": "selectWorld.dataPacks", + "english_translation": "Data Packs" + }, + { + "key": "item.minecraft.cod_bucket", + "english_translation": "Bucket of Cod" + }, + { + "key": "block.minecraft.banner.diagonal_left.black", + "english_translation": "Black Per Bend Sinister" + }, + { + "key": "block.minecraft.banner.diagonal_up_left.brown", + "english_translation": "Brown Per Bend Inverted" + }, + { + "key": "biome.minecraft.savanna_plateau", + "english_translation": "Savanna Plateau" + }, + { + "key": "gui.no", + "english_translation": "No" + }, + { + "key": "commands.bossbar.get.max", + "english_translation": "Custom bossbar %s has a maximum of %s" + }, + { + "key": "block.minecraft.banner.stripe_middle.blue", + "english_translation": "Blue Fess" + }, + { + "key": "subtitles.entity.warden.tendril_clicks", + "english_translation": "Warden's tendrils click" + }, + { + "key": "block.minecraft.warped_fence", + "english_translation": "Warped Fence" + }, + { + "key": "mco.invites.button.reject", + "english_translation": "Reject" + }, + { + "key": "item.minecraft.water_bucket", + "english_translation": "Water Bucket" + }, + { + "key": "advancements.husbandry.allay_deliver_cake_to_note_block.description", + "english_translation": "Have an Allay drop a Cake at a Note Block" + }, + { + "key": "block.minecraft.banner.cross.light_gray", + "english_translation": "Light Gray Saltire" + }, + { + "key": "subtitles.block.conduit.activate", + "english_translation": "Conduit activates" + }, + { + "key": "death.attack.drown", + "english_translation": "%1$s drowned" + }, + { + "key": "jigsaw_block.name", + "english_translation": "Name:" + }, + { + "key": "item.minecraft.ender_dragon_spawn_egg", + "english_translation": "Ender Dragon Spawn Egg" + }, + { + "key": "block.minecraft.bell", + "english_translation": "Bell" + }, + { + "key": "item.minecraft.shield.cyan", + "english_translation": "Cyan Shield" + }, + { + "key": "subtitles.block.composter.fill", + "english_translation": "Composter filled" + }, + { + "key": "block.minecraft.banner.gradient_up.purple", + "english_translation": "Purple Base Gradient" + }, + { + "key": "createWorld.customize.buffet.title", + "english_translation": "Buffet world customization" + }, + { + "key": "block.minecraft.exposed_cut_copper", + "english_translation": "Exposed Cut Copper" + }, + { + "key": "block.minecraft.sniffer_egg", + "english_translation": "Sniffer Egg" + }, + { + "key": "item.minecraft.allay_spawn_egg", + "english_translation": "Allay Spawn Egg" + }, + { + "key": "subtitles.block.beehive.shear", + "english_translation": "Shears scrape" + }, + { + "key": "telemetry.property.load_time_total_time_ms.title", + "english_translation": "Total Load Time (Milliseconds)" + }, + { + "key": "selectServer.direct", + "english_translation": "Direct Connection" + }, + { + "key": "commands.advancement.revoke.criterion.to.many.failure", + "english_translation": "Couldn't revoke criterion '%s' of advancement %s from %s players as they don't have it" + }, + { + "key": "structure_block.position.z", + "english_translation": "relative position z" + }, + { + "key": "structure_block.position.y", + "english_translation": "relative position y" + }, + { + "key": "structure_block.position.x", + "english_translation": "relative Position x" + }, + { + "key": "block.minecraft.banner.mojang.brown", + "english_translation": "Brown Thing" + }, + { + "key": "block.minecraft.dandelion", + "english_translation": "Dandelion" + }, + { + "key": "item.minecraft.tropical_fish_spawn_egg", + "english_translation": "Tropical Fish Spawn Egg" + }, + { + "key": "biome.minecraft.beach", + "english_translation": "Beach" + }, + { + "key": "commands.team.join.success.single", + "english_translation": "Added %s to team %s" + }, + { + "key": "subtitles.entity.bee.death", + "english_translation": "Bee dies" + }, + { + "key": "subtitles.entity.evoker.celebrate", + "english_translation": "Evoker cheers" + }, + { + "key": "advancements.story.mine_diamond.title", + "english_translation": "Diamonds!" + }, + { + "key": "item.minecraft.cod_spawn_egg", + "english_translation": "Cod Spawn Egg" + }, + { + "key": "item.minecraft.music_disc_relic", + "english_translation": "Music Disc" + }, + { + "key": "entity.minecraft.villager.leatherworker", + "english_translation": "Leatherworker" + }, + { + "key": "item.minecraft.writable_book", + "english_translation": "Book and Quill" + }, + { + "key": "block.minecraft.rooted_dirt", + "english_translation": "Rooted Dirt" + }, + { + "key": "subtitles.entity.parrot.imitate.vex", + "english_translation": "Parrot vexes" + }, + { + "key": "subtitles.entity.dolphin.eat", + "english_translation": "Dolphin eats" + }, + { + "key": "subtitles.block.fire.ambient", + "english_translation": "Fire crackles" + }, + { + "key": "subtitles.entity.panda.eat", + "english_translation": "Panda eats" + }, + { + "key": "block.minecraft.banner.cross.blue", + "english_translation": "Blue Saltire" + }, + { + "key": "block.minecraft.banner.half_horizontal_bottom.green", + "english_translation": "Green Per Fess Inverted" + }, + { + "key": "narration.recipe.usage", + "english_translation": "Left click to select" + }, + { + "key": "block.minecraft.banner.square_top_right.black", + "english_translation": "Black Chief Sinister Canton" + }, + { + "key": "block.minecraft.raw_gold_block", + "english_translation": "Block of Raw Gold" + }, + { + "key": "block.minecraft.banner.triangles_top.green", + "english_translation": "Green Chief Indented" + }, + { + "key": "mco.selectServer.configureRealm", + "english_translation": "Configure realm" + }, + { + "key": "item.minecraft.potion.effect.turtle_master", + "english_translation": "Potion of the Turtle Master" + }, + { + "key": "block.minecraft.gray_stained_glass_pane", + "english_translation": "Gray Stained Glass Pane" + }, + { + "key": "enchantment.minecraft.quick_charge", + "english_translation": "Quick Charge" + }, + { + "key": "block.minecraft.grindstone", + "english_translation": "Grindstone" + }, + { + "key": "subtitles.block.smoker.smoke", + "english_translation": "Smoker smokes" + }, + { + "key": "subtitles.entity.allay.item_taken", + "english_translation": "Allay allays" + }, + { + "key": "advancements.nether.obtain_ancient_debris.title", + "english_translation": "Hidden in the Depths" + }, + { + "key": "subtitles.entity.zombified_piglin.death", + "english_translation": "Zombified Piglin dies" + }, + { + "key": "advancements.nether.create_beacon.title", + "english_translation": "Bring Home the Beacon" + }, + { + "key": "block.minecraft.banner.rhombus.white", + "english_translation": "White Lozenge" + }, + { + "key": "block.minecraft.banner.bricks.light_gray", + "english_translation": "Light Gray Field Masoned" + }, + { + "key": "commands.item.block.set.success", + "english_translation": "Replaced a slot at %s, %s, %s with %s" + }, + { + "key": "team.collision.pushOtherTeams", + "english_translation": "Push other teams" + }, + { + "key": "deathScreen.title.hardcore", + "english_translation": "Game Over!" + }, + { + "key": "item.minecraft.spider_spawn_egg", + "english_translation": "Spider Spawn Egg" + }, + { + "key": "debug.pause_focus.off", + "english_translation": "Pause on lost focus: disabled" + }, + { + "key": "mco.configure.world.subscription.less_than_a_day", + "english_translation": "Less than a day" + }, + { + "key": "gui.chatReport.send.no_reported_messages", + "english_translation": "Please select at least one chat message to report" + }, + { + "key": "commands.tag.remove.success.single", + "english_translation": "Removed tag '%s' from %s" + }, + { + "key": "block.minecraft.green_bed", + "english_translation": "Green Bed" + }, + { + "key": "advancements.story.follow_ender_eye.title", + "english_translation": "Eye Spy" + }, + { + "key": "biome.minecraft.swamp", + "english_translation": "Swamp" + }, + { + "key": "mco.selectServer.open", + "english_translation": "Open realm" + }, + { + "key": "death.attack.cactus", + "english_translation": "%1$s was pricked to death" + }, + { + "key": "mco.reset.world.inspiration", + "english_translation": "Inspiration" + }, + { + "key": "block.minecraft.crimson_trapdoor", + "english_translation": "Crimson Trapdoor" + }, + { + "key": "subtitles.entity.dolphin.hurt", + "english_translation": "Dolphin hurts" + }, + { + "key": "commands.enchant.failed.incompatible", + "english_translation": "%s cannot support that enchantment" + }, + { + "key": "block.minecraft.red_bed", + "english_translation": "Red Bed" + }, + { + "key": "merchant.current_level", + "english_translation": "Trader's current level" + }, + { + "key": "block.minecraft.dead_horn_coral_wall_fan", + "english_translation": "Dead Horn Coral Wall Fan" + }, + { + "key": "advMode.mode", + "english_translation": "Mode" + }, + { + "key": "item.minecraft.firework_star.orange", + "english_translation": "Orange" + }, + { + "key": "block.minecraft.banner.square_top_right.gray", + "english_translation": "Gray Chief Sinister Canton" + }, + { + "key": "death.fell.assist", + "english_translation": "%1$s was doomed to fall by %2$s" + }, + { + "key": "gamerule.globalSoundEvents.description", + "english_translation": "When certain game events happen, like a boss spawning, the sound is heard everywhere." + }, + { + "key": "entity.minecraft.player", + "english_translation": "Player" + }, + { + "key": "block.minecraft.smooth_basalt", + "english_translation": "Smooth Basalt" + }, + { + "key": "multiplayer.disconnect.server_full", + "english_translation": "The server is full!" + }, + { + "key": "entity.minecraft.donkey", + "english_translation": "Donkey" + }, + { + "key": "subtitles.item.bucket.empty", + "english_translation": "Bucket empties" + }, + { + "key": "item.minecraft.turtle_helmet", + "english_translation": "Turtle Shell" + }, + { + "key": "block.minecraft.stripped_acacia_log", + "english_translation": "Stripped Acacia Log" + }, + { + "key": "subtitles.entity.panda.hurt", + "english_translation": "Panda hurts" + }, + { + "key": "subtitles.entity.panda.pre_sneeze", + "english_translation": "Panda's nose tickles" + }, + { + "key": "mco.time.daysAgo", + "english_translation": "%1$s day(s) ago" + }, + { + "key": "subtitles.entity.allay.item_thrown", + "english_translation": "Allay tosses" + }, + { + "key": "block.minecraft.magenta_concrete", + "english_translation": "Magenta Concrete" + }, + { + "key": "entity.minecraft.arrow", + "english_translation": "Arrow" + }, + { + "key": "item.minecraft.netherite_axe", + "english_translation": "Netherite Axe" + }, + { + "key": "block.minecraft.birch_stairs", + "english_translation": "Birch Stairs" + }, + { + "key": "mco.selectServer.expires.days", + "english_translation": "Expires in %s days" + }, + { + "key": "advancements.adventure.salvage_sherd.description", + "english_translation": "Brush a Suspicious block to obtain a Pottery Sherd" + }, + { + "key": "lanServer.title", + "english_translation": "LAN World" + }, + { + "key": "subtitles.entity.polar_bear.ambient", + "english_translation": "Polar Bear groans" + }, + { + "key": "commands.title.reset.single", + "english_translation": "Reset title options for %s" + }, + { + "key": "block.minecraft.banner.half_vertical_right.light_blue", + "english_translation": "Light Blue Per Pale Inverted" + }, + { + "key": "item.minecraft.lingering_potion.effect.slow_falling", + "english_translation": "Lingering Potion of Slow Falling" + }, + { + "key": "entity.minecraft.lightning_bolt", + "english_translation": "Lightning Bolt" + }, + { + "key": "item.minecraft.firework_star.black", + "english_translation": "Black" + }, + { + "key": "commands.banip.info", + "english_translation": "This ban affects %s player(s): %s" + }, + { + "key": "commands.scoreboard.objectives.add.duplicate", + "english_translation": "An objective already exists by that name" + }, + { + "key": "block.minecraft.cherry_log", + "english_translation": "Cherry Log" + }, + { + "key": "stat.minecraft.raid_trigger", + "english_translation": "Raids Triggered" + }, + { + "key": "options.video", + "english_translation": "Video Settings..." + }, + { + "key": "block.minecraft.bamboo_hanging_sign", + "english_translation": "Bamboo Hanging Sign" + }, + { + "key": "block.minecraft.banner.half_horizontal_bottom.magenta", + "english_translation": "Magenta Per Fess Inverted" + }, + { + "key": "mco.configure.world.buttons.open", + "english_translation": "Open realm" + }, + { + "key": "block.minecraft.banner.square_top_right.green", + "english_translation": "Green Chief Sinister Canton" + }, + { + "key": "block.minecraft.banner.stripe_center.pink", + "english_translation": "Pink Pale" + }, + { + "key": "itemGroup.inventory", + "english_translation": "Survival Inventory" + }, + { + "key": "block.minecraft.banner.triangles_top.black", + "english_translation": "Black Chief Indented" + }, + { + "key": "options.chunks", + "english_translation": "%s chunks" + }, + { + "key": "item.minecraft.salmon", + "english_translation": "Raw Salmon" + }, + { + "key": "block.minecraft.comparator", + "english_translation": "Redstone Comparator" + }, + { + "key": "item.minecraft.tipped_arrow.effect.healing", + "english_translation": "Arrow of Healing" + }, + { + "key": "item.minecraft.beetroot_seeds", + "english_translation": "Beetroot Seeds" + }, + { + "key": "item.minecraft.totem_of_undying", + "english_translation": "Totem of Undying" + }, + { + "key": "subtitles.entity.tropical_fish.flop", + "english_translation": "Tropical Fish flops" + }, + { + "key": "block.minecraft.banner.curly_border.magenta", + "english_translation": "Magenta Bordure Indented" + }, + { + "key": "item.minecraft.cauldron", + "english_translation": "Cauldron" + }, + { + "key": "advancements.nether.obtain_crying_obsidian.description", + "english_translation": "Obtain Crying Obsidian" + }, + { + "key": "block.minecraft.banner.flower.cyan", + "english_translation": "Cyan Flower Charge" + }, + { + "key": "commands.team.option.seeFriendlyInvisibles.enabled", + "english_translation": "Team %s can now see invisible teammates" + }, + { + "key": "commands.effect.clear.everything.success.multiple", + "english_translation": "Removed every effect from %s targets" + }, + { + "key": "block.minecraft.banner.square_top_right.white", + "english_translation": "White Chief Sinister Canton" + }, + { + "key": "demo.reminder", + "english_translation": "The demo time has expired. Buy the game to continue or start a new world!" + }, + { + "key": "block.minecraft.dead_fire_coral_wall_fan", + "english_translation": "Dead Fire Coral Wall Fan" + }, + { + "key": "block.minecraft.magenta_banner", + "english_translation": "Magenta Banner" + }, + { + "key": "selectWorld.select", + "english_translation": "Play Selected World" + }, + { + "key": "block.minecraft.wither_rose", + "english_translation": "Wither Rose" + }, + { + "key": "stat.minecraft.strider_one_cm", + "english_translation": "Distance by Strider" + }, + { + "key": "debug.gamemodes.help", + "english_translation": "F3 + F4 = Open game mode switcher" + }, + { + "key": "advancements.nether.get_wither_skull.description", + "english_translation": "Obtain a Wither Skeleton's skull" + }, + { + "key": "structure_block.mode.load", + "english_translation": "Load" + }, + { + "key": "debug.advanced_tooltips.off", + "english_translation": "Advanced tooltips: hidden" + }, + { + "key": "item.minecraft.firework_star.green", + "english_translation": "Green" + }, + { + "key": "chat.tag.not_secure", + "english_translation": "Unverified message. Cannot be reported." + }, + { + "key": "block.minecraft.banner.half_horizontal_bottom.black", + "english_translation": "Black Per Fess Inverted" + }, + { + "key": "block.minecraft.brick_wall", + "english_translation": "Brick Wall" + }, + { + "key": "item.minecraft.howl_pottery_shard", + "english_translation": "Howl Pottery Shard" + }, + { + "key": "subtitles.entity.skeleton_horse.hurt", + "english_translation": "Skeleton Horse hurts" + }, + { + "key": "item.minecraft.lingering_potion.effect.thick", + "english_translation": "Thick Lingering Potion" + }, + { + "key": "block.minecraft.bee_nest", + "english_translation": "Bee Nest" + }, + { + "key": "mco.activity.title", + "english_translation": "Player activity" + }, + { + "key": "block.minecraft.cut_copper", + "english_translation": "Cut Copper" + }, + { + "key": "item.minecraft.firework_star.pink", + "english_translation": "Pink" + }, + { + "key": "block.minecraft.spruce_planks", + "english_translation": "Spruce Planks" + }, + { + "key": "item.minecraft.map", + "english_translation": "Empty Map" + }, + { + "key": "block.minecraft.lapis_block", + "english_translation": "Block of Lapis Lazuli" + }, + { + "key": "item.minecraft.honeycomb", + "english_translation": "Honeycomb" + }, + { + "key": "debug.show_hitboxes.help", + "english_translation": "F3 + B = Show hitboxes" + }, + { + "key": "item.minecraft.magma_cream", + "english_translation": "Magma Cream" + }, + { + "key": "commands.team.option.name.unchanged", + "english_translation": "Nothing changed. That team already has that name" + }, + { + "key": "item.minecraft.lingering_potion.effect.empty", + "english_translation": "Lingering Uncraftable Potion" + }, + { + "key": "options.accessibility.title", + "english_translation": "Accessibility Settings..." + }, + { + "key": "subtitles.entity.dolphin.play", + "english_translation": "Dolphin plays" + }, + { + "key": "item.minecraft.music_disc_11", + "english_translation": "Music Disc" + }, + { + "key": "item.minecraft.music_disc_13", + "english_translation": "Music Disc" + }, + { + "key": "block.minecraft.green_banner", + "english_translation": "Green Banner" + }, + { + "key": "item.minecraft.firework_star.shape", + "english_translation": "Unknown Shape" + }, + { + "key": "entity.minecraft.killer_bunny", + "english_translation": "The Killer Bunny" + }, + { + "key": "commands.data.entity.modified", + "english_translation": "Modified entity data of %s" + }, + { + "key": "block.minecraft.red_sandstone_slab", + "english_translation": "Red Sandstone Slab" + }, + { + "key": "argument.pos.mixed", + "english_translation": "Cannot mix world & local coordinates (everything must either use ^ or not)" + }, + { + "key": "gui.banned.description.reason_id", + "english_translation": "Code: %s" + }, + { + "key": "item.minecraft.golden_horse_armor", + "english_translation": "Golden Horse Armor" + }, + { + "key": "biome.minecraft.nether_wastes", + "english_translation": "Nether Wastes" + }, + { + "key": "stat.minecraft.crouch_one_cm", + "english_translation": "Distance Crouched" + }, + { + "key": "painting.minecraft.kebab.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "subtitles.entity.chicken.hurt", + "english_translation": "Chicken hurts" + }, + { + "key": "subtitles.block.dispenser.fail", + "english_translation": "Dispenser failed" + }, + { + "key": "commands.bossbar.set.value.success", + "english_translation": "Custom bossbar %s has changed value to %s" + }, + { + "key": "death.attack.mob.item", + "english_translation": "%1$s was slain by %2$s using %3$s" + }, + { + "key": "argument.time.invalid_unit", + "english_translation": "Invalid unit" + }, + { + "key": "subtitles.entity.horse.angry", + "english_translation": "Horse neighs" + }, + { + "key": "block.minecraft.end_portal_frame", + "english_translation": "End Portal Frame" + }, + { + "key": "item.minecraft.tipped_arrow.effect.poison", + "english_translation": "Arrow of Poison" + }, + { + "key": "subtitles.entity.wolf.growl", + "english_translation": "Wolf growls" + }, + { + "key": "advancements.end.kill_dragon.title", + "english_translation": "Free the End" + }, + { + "key": "block.minecraft.waxed_exposed_copper", + "english_translation": "Waxed Exposed Copper" + }, + { + "key": "item.minecraft.potion.effect.mundane", + "english_translation": "Mundane Potion" + }, + { + "key": "stat.minecraft.eat_cake_slice", + "english_translation": "Cake Slices Eaten" + }, + { + "key": "block.minecraft.calibrated_sculk_sensor", + "english_translation": "Calibrated Sculk Sensor" + }, + { + "key": "block.minecraft.shroomlight", + "english_translation": "Shroomlight" + }, + { + "key": "block.minecraft.banner.skull.magenta", + "english_translation": "Magenta Skull Charge" + }, + { + "key": "item.minecraft.skull_banner_pattern", + "english_translation": "Banner Pattern" + }, + { + "key": "selectWorld.edit.optimize", + "english_translation": "Optimize World" + }, + { + "key": "commands.bossbar.get.players.none", + "english_translation": "Custom bossbar %s has no players currently online" + }, + { + "key": "entity.minecraft.strider", + "english_translation": "Strider" + }, + { + "key": "argument.block.property.duplicate", + "english_translation": "Property '%s' can only be set once for block %s" + }, + { + "key": "subtitles.entity.parrot.imitate.vindicator", + "english_translation": "Parrot mutters" + }, + { + "key": "subtitles.entity.parrot.imitate.zombie_villager", + "english_translation": "Parrot groans" + }, + { + "key": "debug.reload_chunks.message", + "english_translation": "Reloading all chunks" + }, + { + "key": "mco.selectServer.minigame", + "english_translation": "Minigame:" + }, + { + "key": "createWorld.customize.custom.next", + "english_translation": "Next Page" + }, + { + "key": "stat.minecraft.open_enderchest", + "english_translation": "Ender Chests Opened" + }, + { + "key": "subtitles.entity.parrot.fly", + "english_translation": "Parrot flutters" + }, + { + "key": "mco.configure.world.invites.remove.tooltip", + "english_translation": "Remove" + }, + { + "key": "subtitles.entity.allay.ambient_without_item", + "english_translation": "Allay yearns" + }, + { + "key": "optimizeWorld.confirm.description", + "english_translation": "This will attempt to optimize your world by making sure all data is stored in the most recent game format. This can take a very long time, depending on your world. Once done, your world may play faster but will no longer be compatible with older versions of the game. Are you sure you wish to proceed?" + }, + { + "key": "block.minecraft.orange_wool", + "english_translation": "Orange Wool" + }, + { + "key": "item.minecraft.diamond", + "english_translation": "Diamond" + }, + { + "key": "chat.disabled.profile", + "english_translation": "Chat not allowed by account settings. Press '%s' again for more information." + }, + { + "key": "painting.minecraft.wither.author", + "english_translation": "Mojang" + }, + { + "key": "item.minecraft.copper_ingot", + "english_translation": "Copper Ingot" + }, + { + "key": "key.keyboard.keypad.decimal", + "english_translation": "Keypad Decimal" + }, + { + "key": "block.minecraft.orange_shulker_box", + "english_translation": "Orange Shulker Box" + }, + { + "key": "commands.teleport.invalidPosition", + "english_translation": "Invalid position for teleport" + }, + { + "key": "subtitles.entity.phantom.death", + "english_translation": "Phantom dies" + }, + { + "key": "gamerule.lavaSourceConversion", + "english_translation": "Lava converts to source" + }, + { + "key": "item.minecraft.diamond_hoe", + "english_translation": "Diamond Hoe" + }, + { + "key": "commands.tag.add.success.single", + "english_translation": "Added tag '%s' to %s" + }, + { + "key": "narrator.button.difficulty_lock.locked", + "english_translation": "Locked" + }, + { + "key": "death.attack.message_too_long", + "english_translation": "Actually, the message was too long to deliver fully. Sorry! Here's stripped version: %s" + }, + { + "key": "block.minecraft.banner.globe.cyan", + "english_translation": "Cyan Globe" + }, + { + "key": "block.minecraft.banner.diagonal_left.blue", + "english_translation": "Blue Per Bend Sinister" + }, + { + "key": "block.minecraft.banner.half_horizontal.green", + "english_translation": "Green Per Fess" + }, + { + "key": "commands.scoreboard.players.enable.invalid", + "english_translation": "Enable only works on trigger-objectives" + }, + { + "key": "advancements.nether.netherite_armor.title", + "english_translation": "Cover Me in Debris" + }, + { + "key": "painting.minecraft.sunset.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "commands.clear.test.multiple", + "english_translation": "Found %s matching item(s) on %s players" + }, + { + "key": "commands.summon.success", + "english_translation": "Summoned new %s" + }, + { + "key": "subtitles.entity.cat.ambient", + "english_translation": "Cat meows" + }, + { + "key": "block.minecraft.horn_coral", + "english_translation": "Horn Coral" + }, + { + "key": "item.minecraft.raw_iron", + "english_translation": "Raw Iron" + }, + { + "key": "subtitles.entity.enderman.hurt", + "english_translation": "Enderman hurts" + }, + { + "key": "subtitles.entity.husk.death", + "english_translation": "Husk dies" + }, + { + "key": "subtitles.entity.piglin.step", + "english_translation": "Piglin steps" + }, + { + "key": "effect.minecraft.hunger", + "english_translation": "Hunger" + }, + { + "key": "block.minecraft.gray_candle", + "english_translation": "Gray Candle" + }, + { + "key": "mco.selectServer.closeserver", + "english_translation": "Close realm" + }, + { + "key": "mco.time.now", + "english_translation": "right now" + }, + { + "key": "item.minecraft.lingering_potion.effect.mundane", + "english_translation": "Mundane Lingering Potion" + }, + { + "key": "multiplayer.status.pinging", + "english_translation": "Pinging..." + }, + { + "key": "commands.forceload.removed.all", + "english_translation": "Unmarked all force loaded chunks in %s" + }, + { + "key": "block.minecraft.dead_bubble_coral_block", + "english_translation": "Dead Bubble Coral Block" + }, + { + "key": "item.minecraft.music_disc_pigstep", + "english_translation": "Music Disc" + }, + { + "key": "subtitles.entity.player.freeze_hurt", + "english_translation": "Player freezes" + }, + { + "key": "block.minecraft.banner.square_top_left.pink", + "english_translation": "Pink Chief Dexter Canton" + }, + { + "key": "block.minecraft.banner.half_vertical.purple", + "english_translation": "Purple Per Pale" + }, + { + "key": "block.minecraft.dark_oak_pressure_plate", + "english_translation": "Dark Oak Pressure Plate" + }, + { + "key": "subtitles.entity.drowned.shoot", + "english_translation": "Drowned throws Trident" + }, + { + "key": "block.minecraft.crimson_roots", + "english_translation": "Crimson Roots" + }, + { + "key": "biome.minecraft.the_end", + "english_translation": "The End" + }, + { + "key": "effect.minecraft.haste", + "english_translation": "Haste" + }, + { + "key": "block.minecraft.polished_blackstone_stairs", + "english_translation": "Polished Blackstone Stairs" + }, + { + "key": "options.showSubtitles", + "english_translation": "Show Subtitles" + }, + { + "key": "block.minecraft.banner.square_bottom_left.light_blue", + "english_translation": "Light Blue Base Dexter Canton" + }, + { + "key": "advancements.adventure.craft_decorated_pot_using_only_sherds.title", + "english_translation": "Careful Restoration" + }, + { + "key": "advancements.husbandry.silk_touch_nest.description", + "english_translation": "Move a Bee Nest, with 3 Bees inside, using Silk Touch" + }, + { + "key": "gui.copy_link_to_clipboard", + "english_translation": "Copy Link to Clipboard" + }, + { + "key": "block.minecraft.nether_quartz_ore", + "english_translation": "Nether Quartz Ore" + }, + { + "key": "color.minecraft.cyan", + "english_translation": "Cyan" + }, + { + "key": "subtitles.entity.ravager.step", + "english_translation": "Ravager steps" + }, + { + "key": "debug.advanced_tooltips.on", + "english_translation": "Advanced tooltips: shown" + }, + { + "key": "commands.seed.success", + "english_translation": "Seed: %s" + }, + { + "key": "argument.entity.options.predicate.description", + "english_translation": "Custom predicate" + }, + { + "key": "subtitles.entity.strider.retreat", + "english_translation": "Strider retreats" + }, + { + "key": "enchantment.minecraft.impaling", + "english_translation": "Impaling" + }, + { + "key": "block.minecraft.banner.stripe_left.cyan", + "english_translation": "Cyan Pale Dexter" + }, + { + "key": "block.minecraft.crimson_button", + "english_translation": "Crimson Button" + }, + { + "key": "advancements.story.upgrade_tools.title", + "english_translation": "Getting an Upgrade" + }, + { + "key": "createWorld.customize.custom.useRavines", + "english_translation": "Ravines" + }, + { + "key": "subtitles.entity.pig.ambient", + "english_translation": "Pig oinks" + }, + { + "key": "block.minecraft.banner.half_horizontal.black", + "english_translation": "Black Per Fess" + }, + { + "key": "block.minecraft.banner.stripe_right.pink", + "english_translation": "Pink Pale Sinister" + }, + { + "key": "trim_material.minecraft.copper", + "english_translation": "Copper Material" + }, + { + "key": "narrator.toast.disabled", + "english_translation": "Narrator Disabled" + }, + { + "key": "block.minecraft.banner.gradient.black", + "english_translation": "Black Gradient" + }, + { + "key": "block.minecraft.ochre_froglight", + "english_translation": "Ochre Froglight" + }, + { + "key": "enchantment.level.8", + "english_translation": "VIII" + }, + { + "key": "enchantment.level.7", + "english_translation": "VII" + }, + { + "key": "enchantment.level.6", + "english_translation": "VI" + }, + { + "key": "enchantment.level.5", + "english_translation": "V" + }, + { + "key": "enchantment.level.4", + "english_translation": "IV" + }, + { + "key": "enchantment.level.3", + "english_translation": "III" + }, + { + "key": "enchantment.level.2", + "english_translation": "II" + }, + { + "key": "narration.suggestion.tooltip", + "english_translation": "Selected suggestion %s out of %s: %s (%s)" + }, + { + "key": "enchantment.level.1", + "english_translation": "I" + }, + { + "key": "advancements.adventure.spyglass_at_parrot.description", + "english_translation": "Look at a Parrot through a Spyglass" + }, + { + "key": "commands.forceload.added.single", + "english_translation": "Marked chunk %s in %s to be force loaded" + }, + { + "key": "enchantment.level.9", + "english_translation": "IX" + }, + { + "key": "item.minecraft.stone_shovel", + "english_translation": "Stone Shovel" + }, + { + "key": "item.minecraft.arrow", + "english_translation": "Arrow" + }, + { + "key": "subtitles.block.end_portal.spawn", + "english_translation": "End Portal opens" + }, + { + "key": "block.minecraft.banner.base.magenta", + "english_translation": "Fully Magenta Field" + }, + { + "key": "advMode.mode.sequence", + "english_translation": "Chain" + }, + { + "key": "options.hideLightningFlashes.tooltip", + "english_translation": "Prevents Lightning Bolts from making the sky flash. The bolts themselves will still be visible." + }, + { + "key": "block.minecraft.yellow_wool", + "english_translation": "Yellow Wool" + }, + { + "key": "advancements.husbandry.feed_snifflet.description", + "english_translation": "Feed a Snifflet" + }, + { + "key": "mco.terms.buttons.agree", + "english_translation": "Agree" + }, + { + "key": "block.minecraft.oak_wall_hanging_sign", + "english_translation": "Oak Wall Hanging Sign" + }, + { + "key": "block.minecraft.crimson_fence", + "english_translation": "Crimson Fence" + }, + { + "key": "advancements.adventure.avoid_vibration.title", + "english_translation": "Sneak 100" + }, + { + "key": "attribute.name.generic.luck", + "english_translation": "Luck" + }, + { + "key": "attribute.name.generic.attack_speed", + "english_translation": "Attack Speed" + }, + { + "key": "block.minecraft.banner.gradient.lime", + "english_translation": "Lime Gradient" + }, + { + "key": "block.minecraft.banner.stripe_downright.brown", + "english_translation": "Brown Bend" + }, + { + "key": "commands.pardonip.invalid", + "english_translation": "Invalid IP address" + }, + { + "key": "selectWorld.load_folder_access", + "english_translation": "Unable to read or access folder where game worlds are saved!" + }, + { + "key": "advancements.adventure.play_jukebox_in_meadows.description", + "english_translation": "Make the Meadows come alive with the sound of music from a Jukebox" + }, + { + "key": "key.keyboard.equal", + "english_translation": "=" + }, + { + "key": "mco.configure.world.subscription.day", + "english_translation": "day" + }, + { + "key": "entity.minecraft.polar_bear", + "english_translation": "Polar Bear" + }, + { + "key": "subtitles.entity.warden.sniff", + "english_translation": "Warden sniffs" + }, + { + "key": "block.minecraft.green_candle_cake", + "english_translation": "Cake with Green Candle" + }, + { + "key": "narration.recipe.usage.more", + "english_translation": "Right click to show more recipes" + }, + { + "key": "painting.random", + "english_translation": "Random variant" + }, + { + "key": "subtitles.entity.villager.work_farmer", + "english_translation": "Farmer works" + }, + { + "key": "block.minecraft.banner.mojang.orange", + "english_translation": "Orange Thing" + }, + { + "key": "key.advancements", + "english_translation": "Advancements" + }, + { + "key": "subtitles.block.tripwire.detach", + "english_translation": "Tripwire detaches" + }, + { + "key": "block.minecraft.cracked_deepslate_tiles", + "english_translation": "Cracked Deepslate Tiles" + }, + { + "key": "death.attack.starve.player", + "english_translation": "%1$s starved to death whilst fighting %2$s" + }, + { + "key": "item.minecraft.elder_guardian_spawn_egg", + "english_translation": "Elder Guardian Spawn Egg" + }, + { + "key": "block.minecraft.stripped_mangrove_wood", + "english_translation": "Stripped Mangrove Wood" + }, + { + "key": "painting.minecraft.graham.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "painting.minecraft.wanderer.title", + "english_translation": "Wanderer" + }, + { + "key": "block.minecraft.chiseled_deepslate", + "english_translation": "Chiseled Deepslate" + }, + { + "key": "item.minecraft.spectral_arrow", + "english_translation": "Spectral Arrow" + }, + { + "key": "stat.minecraft.interact_with_loom", + "english_translation": "Interactions with Loom" + }, + { + "key": "subtitles.item.brush.brushing.sand.complete", + "english_translation": "Brushing Sand completed" + }, + { + "key": "block.minecraft.banner.piglin.lime", + "english_translation": "Lime Snout" + }, + { + "key": "selectWorld.versionQuestion", + "english_translation": "Do you really want to load this world?" + }, + { + "key": "item.minecraft.salmon_bucket", + "english_translation": "Bucket of Salmon" + }, + { + "key": "advancements.husbandry.root.description", + "english_translation": "The world is full of friends and food" + }, + { + "key": "outOfMemory.message", + "english_translation": "Minecraft has run out of memory.\n\nThis could be caused by a bug in the game or by the Java Virtual Machine not being allocated enough memory.\n\nTo prevent level corruption, the current game has quit. We've tried to free up enough memory to let you go back to the main menu and back to playing, but this may not have worked.\n\nPlease restart the game if you see this message again." + }, + { + "key": "biome.minecraft.crimson_forest", + "english_translation": "Crimson Forest" + }, + { + "key": "block.minecraft.banner.gradient_up.light_gray", + "english_translation": "Light Gray Base Gradient" + }, + { + "key": "subtitles.entity.enderman.stare", + "english_translation": "Enderman cries out" + }, + { + "key": "block.minecraft.cyan_banner", + "english_translation": "Cyan Banner" + }, + { + "key": "block.minecraft.andesite_slab", + "english_translation": "Andesite Slab" + }, + { + "key": "mco.backup.entry.worldType", + "english_translation": "World Type" + }, + { + "key": "entity.minecraft.goat", + "english_translation": "Goat" + }, + { + "key": "commands.item.entity.set.success.multiple", + "english_translation": "Replaced a slot on %s entities with %s" + }, + { + "key": "block.minecraft.banner.diagonal_right.white", + "english_translation": "White Per Bend" + }, + { + "key": "subtitles.entity.goat.step", + "english_translation": "Goat steps" + }, + { + "key": "commands.save.enabled", + "english_translation": "Automatic saving is now enabled" + }, + { + "key": "item.minecraft.golden_carrot", + "english_translation": "Golden Carrot" + }, + { + "key": "mco.upload.button.name", + "english_translation": "Upload" + }, + { + "key": "commands.place.structure.failed", + "english_translation": "Failed to place structure" + }, + { + "key": "block.minecraft.pitcher_plant", + "english_translation": "Pitcher Plant" + }, + { + "key": "commands.spreadplayers.failed.entities", + "english_translation": "Could not spread %s entity/entities around %s, %s (too many entities for space - try using spread of at most %s)" + }, + { + "key": "item.disabled", + "english_translation": "Disabled item" + }, + { + "key": "block.minecraft.banner.stripe_downleft.black", + "english_translation": "Black Bend Sinister" + }, + { + "key": "generator.custom", + "english_translation": "Custom" + }, + { + "key": "argument.entity.selector.missing", + "english_translation": "Missing selector type" + }, + { + "key": "narration.slider.usage.hovered", + "english_translation": "Drag slider to change value" + }, + { + "key": "item.minecraft.baked_potato", + "english_translation": "Baked Potato" + }, + { + "key": "block.minecraft.smooth_red_sandstone_slab", + "english_translation": "Smooth Red Sandstone Slab" + }, + { + "key": "death.attack.badRespawnPoint.link", + "english_translation": "Intentional Game Design" + }, + { + "key": "gamerule.fallDamage", + "english_translation": "Deal fall damage" + }, + { + "key": "block.minecraft.banner.diagonal_up_right.yellow", + "english_translation": "Yellow Per Bend Sinister Inverted" + }, + { + "key": "block.minecraft.warped_planks", + "english_translation": "Warped Planks" + }, + { + "key": "dataPack.bundle.name", + "english_translation": "Bundles" + }, + { + "key": "item.minecraft.mangrove_boat", + "english_translation": "Mangrove Boat" + }, + { + "key": "narrator.position.screen", + "english_translation": "Screen element %s out of %s" + }, + { + "key": "block.minecraft.banner.half_vertical_right.purple", + "english_translation": "Purple Per Pale Inverted" + }, + { + "key": "block.minecraft.banner.diagonal_right.light_gray", + "english_translation": "Light Gray Per Bend" + }, + { + "key": "block.minecraft.banner.cross.green", + "english_translation": "Green Saltire" + }, + { + "key": "block.minecraft.cracked_nether_bricks", + "english_translation": "Cracked Nether Bricks" + }, + { + "key": "key.keyboard.up", + "english_translation": "Up Arrow" + }, + { + "key": "block.minecraft.banner.stripe_downleft.green", + "english_translation": "Green Bend Sinister" + }, + { + "key": "block.minecraft.banner.diagonal_right.pink", + "english_translation": "Pink Per Bend" + }, + { + "key": "mco.configure.current.minigame", + "english_translation": "Current" + }, + { + "key": "block.minecraft.banner.piglin.blue", + "english_translation": "Blue Snout" + }, + { + "key": "item.minecraft.zombie_villager_spawn_egg", + "english_translation": "Zombie Villager Spawn Egg" + }, + { + "key": "subtitles.entity.parrot.imitate.blaze", + "english_translation": "Parrot breathes" + }, + { + "key": "block.minecraft.stone_bricks", + "english_translation": "Stone Bricks" + }, + { + "key": "block.minecraft.blackstone_slab", + "english_translation": "Blackstone Slab" + }, + { + "key": "block.minecraft.snow", + "english_translation": "Snow" + }, + { + "key": "options.difficulty.peaceful.info", + "english_translation": "No hostile mobs and only some neutral mobs spawn. Hunger bar doesn't deplete and health replenishes over time." + }, + { + "key": "item.minecraft.shulker_spawn_egg", + "english_translation": "Shulker Spawn Egg" + }, + { + "key": "commands.publish.alreadyPublished", + "english_translation": "Multiplayer game is already hosted on port %s" + }, + { + "key": "subtitles.entity.goat.eat", + "english_translation": "Goat eats" + }, + { + "key": "item.minecraft.heart_pottery_shard", + "english_translation": "Heart Pottery Shard" + }, + { + "key": "block.minecraft.purple_stained_glass_pane", + "english_translation": "Purple Stained Glass Pane" + }, + { + "key": "inventory.hotbarSaved", + "english_translation": "Item hotbar saved (restore with %1$s+%2$s)" + }, + { + "key": "structure_block.load_prepare", + "english_translation": "Structure '%s' position prepared" + }, + { + "key": "subtitles.entity.warden.emerge", + "english_translation": "Warden emerges" + }, + { + "key": "subtitles.item.axe.scrape", + "english_translation": "Axe scrapes" + }, + { + "key": "gamerule.announceAdvancements", + "english_translation": "Announce advancements" + }, + { + "key": "subtitles.entity.stray.death", + "english_translation": "Stray dies" + }, + { + "key": "item.modifiers.chest", + "english_translation": "When on Body:" + }, + { + "key": "block.minecraft.banner.square_top_right.cyan", + "english_translation": "Cyan Chief Sinister Canton" + }, + { + "key": "block.minecraft.cobweb", + "english_translation": "Cobweb" + }, + { + "key": "color.minecraft.brown", + "english_translation": "Brown" + }, + { + "key": "options.entityShadows", + "english_translation": "Entity Shadows" + }, + { + "key": "entity.minecraft.item_display", + "english_translation": "Item Display" + }, + { + "key": "filled_map.buried_treasure", + "english_translation": "Buried Treasure Map" + }, + { + "key": "subtitles.entity.guardian.flop", + "english_translation": "Guardian flops" + }, + { + "key": "subtitles.entity.bat.takeoff", + "english_translation": "Bat takes off" + }, + { + "key": "entity.minecraft.tropical_fish.type.sunstreak", + "english_translation": "Sunstreak" + }, + { + "key": "block.minecraft.mycelium", + "english_translation": "Mycelium" + }, + { + "key": "multiplayer.applyingPack", + "english_translation": "Applying resource pack" + }, + { + "key": "item.minecraft.milk_bucket", + "english_translation": "Milk Bucket" + }, + { + "key": "painting.minecraft.pigscene.title", + "english_translation": "Pigscene" + }, + { + "key": "commands.debug.stopped", + "english_translation": "Stopped tick profiling after %s seconds and %s ticks (%s ticks per second)" + }, + { + "key": "entity.minecraft.blaze", + "english_translation": "Blaze" + }, + { + "key": "selectWorld.backupQuestion.experimental", + "english_translation": "Worlds using Experimental Settings are not supported" + }, + { + "key": "gui.narrate.editBox", + "english_translation": "%s edit box: %s" + }, + { + "key": "block.minecraft.bamboo_trapdoor", + "english_translation": "Bamboo Trapdoor" + }, + { + "key": "argument.entity.options.inapplicable", + "english_translation": "Option '%s' isn't applicable here" + }, + { + "key": "block.minecraft.beacon", + "english_translation": "Beacon" + }, + { + "key": "telemetry_info.screen.description", + "english_translation": "Collecting this data helps us improve Minecraft by guiding us in directions that are relevant to our players.\nYou can also send in additional feedback to help us keep improving Minecraft." + }, + { + "key": "stat.minecraft.aviate_one_cm", + "english_translation": "Distance by Elytra" + }, + { + "key": "book.finalizeButton", + "english_translation": "Sign and Close" + }, + { + "key": "subtitles.entity.strider.hurt", + "english_translation": "Strider hurts" + }, + { + "key": "block.minecraft.smooth_stone_slab", + "english_translation": "Smooth Stone Slab" + }, + { + "key": "biome.minecraft.snowy_beach", + "english_translation": "Snowy Beach" + }, + { + "key": "death.fell.accident.other_climbable", + "english_translation": "%1$s fell while climbing" + }, + { + "key": "item.minecraft.iron_horse_armor", + "english_translation": "Iron Horse Armor" + }, + { + "key": "chat.copy", + "english_translation": "Copy to Clipboard" + }, + { + "key": "entity.minecraft.fox", + "english_translation": "Fox" + }, + { + "key": "mco.selectServer.uninitialized", + "english_translation": "Click to start your new realm!" + }, + { + "key": "selectWorld.backupWarning.snapshot", + "english_translation": "This world was last played in version %s; you are on version %s. Please make a backup in case you experience world corruptions!" + }, + { + "key": "subtitles.entity.rabbit.ambient", + "english_translation": "Rabbit squeaks" + }, + { + "key": "subtitles.entity.sniffer.digging", + "english_translation": "Sniffer digs" + }, + { + "key": "spectatorMenu.previous_page", + "english_translation": "Previous Page" + }, + { + "key": "item.minecraft.filled_map", + "english_translation": "Map" + }, + { + "key": "stat.minecraft.interact_with_beacon", + "english_translation": "Interactions with Beacon" + }, + { + "key": "block.minecraft.banner.piglin.red", + "english_translation": "Red Snout" + }, + { + "key": "item.minecraft.cherry_boat", + "english_translation": "Cherry Boat" + }, + { + "key": "block.minecraft.cave_air", + "english_translation": "Cave Air" + }, + { + "key": "block.minecraft.podzol", + "english_translation": "Podzol" + }, + { + "key": "gamerule.snowAccumulationHeight", + "english_translation": "Snow accumulation height" + }, + { + "key": "slot.unknown", + "english_translation": "Unknown slot '%s'" + }, + { + "key": "subtitles.block.iron_trapdoor.close", + "english_translation": "Trapdoor closes" + }, + { + "key": "block.minecraft.banner.square_bottom_left.magenta", + "english_translation": "Magenta Base Dexter Canton" + }, + { + "key": "options.autosaveIndicator", + "english_translation": "Autosave Indicator" + }, + { + "key": "selectWorld.version", + "english_translation": "Version:" + }, + { + "key": "death.attack.inWall.player", + "english_translation": "%1$s suffocated in a wall whilst fighting %2$s" + }, + { + "key": "item.minecraft.llama_spawn_egg", + "english_translation": "Llama Spawn Egg" + }, + { + "key": "item.minecraft.splash_potion.effect.luck", + "english_translation": "Splash Potion of Luck" + }, + { + "key": "options.narrator.chat", + "english_translation": "Narrates Chat" + }, + { + "key": "death.fell.accident.scaffolding", + "english_translation": "%1$s fell off scaffolding" + }, + { + "key": "item.minecraft.stone_hoe", + "english_translation": "Stone Hoe" + }, + { + "key": "block.minecraft.banner.flower.red", + "english_translation": "Red Flower Charge" + }, + { + "key": "item.minecraft.iron_nugget", + "english_translation": "Iron Nugget" + }, + { + "key": "item.minecraft.dolphin_spawn_egg", + "english_translation": "Dolphin Spawn Egg" + }, + { + "key": "commands.teleport.success.location.single", + "english_translation": "Teleported %s to %s, %s, %s" + }, + { + "key": "options.graphics.fancy.tooltip", + "english_translation": "Fancy graphics balances performance and quality for the majority of machines.\nWeather, clouds, and particles may not appear behind translucent blocks or water." + }, + { + "key": "block.minecraft.banner.half_vertical_right.red", + "english_translation": "Red Per Pale Inverted" + }, + { + "key": "key.keyboard.caps.lock", + "english_translation": "Caps Lock" + }, + { + "key": "itemGroup.foodAndDrink", + "english_translation": "Food & Drinks" + }, + { + "key": "merchant.next_level", + "english_translation": "Trader's next level" + }, + { + "key": "block.minecraft.banner.diagonal_left.red", + "english_translation": "Red Per Bend Sinister" + }, + { + "key": "item.minecraft.item_frame", + "english_translation": "Item Frame" + }, + { + "key": "block.minecraft.banner.half_vertical_right.cyan", + "english_translation": "Cyan Per Pale Inverted" + }, + { + "key": "subtitles.entity.generic.eat", + "english_translation": "Eating" + }, + { + "key": "biome.minecraft.old_growth_pine_taiga", + "english_translation": "Old Growth Pine Taiga" + }, + { + "key": "subtitles.entity.hoglin.death", + "english_translation": "Hoglin dies" + }, + { + "key": "arguments.nbtpath.nothing_found", + "english_translation": "Found no elements matching %s" + }, + { + "key": "mco.reset.world.adventure", + "english_translation": "Adventures" + }, + { + "key": "painting.minecraft.sea.title", + "english_translation": "Seaside" + }, + { + "key": "options.difficulty.easy.info", + "english_translation": "Hostile mobs spawn but deal less damage. Hunger bar depletes and drains health down to 5 hearts." + }, + { + "key": "options.darkMojangStudiosBackgroundColor", + "english_translation": "Monochrome Logo" + }, + { + "key": "stat.minecraft.interact_with_campfire", + "english_translation": "Interactions with Campfire" + }, + { + "key": "subtitles.entity.shulker_bullet.hit", + "english_translation": "Shulker Bullet explodes" + }, + { + "key": "block.minecraft.cyan_wool", + "english_translation": "Cyan Wool" + }, + { + "key": "death.attack.magic.player", + "english_translation": "%1$s was killed by magic whilst trying to escape %2$s" + }, + { + "key": "commands.attribute.failed.no_attribute", + "english_translation": "Entity %s has no attribute %s" + }, + { + "key": "item.minecraft.music_disc_strad.desc", + "english_translation": "C418 - strad" + }, + { + "key": "commands.gamemode.success.other", + "english_translation": "Set %s's game mode to %s" + }, + { + "key": "item.minecraft.lingering_potion.effect.harming", + "english_translation": "Lingering Potion of Harming" + }, + { + "key": "block.minecraft.banner.straight_cross.pink", + "english_translation": "Pink Cross" + }, + { + "key": "subtitles.entity.shulker.open", + "english_translation": "Shulker opens" + }, + { + "key": "argument.entity.selector.allPlayers", + "english_translation": "All players" + }, + { + "key": "trim_pattern.minecraft.sentry", + "english_translation": "Sentry Armor Trim" + }, + { + "key": "container.enchant.lapis.one", + "english_translation": "1 Lapis Lazuli" + }, + { + "key": "stat.minecraft.fly_one_cm", + "english_translation": "Distance Flown" + }, + { + "key": "item.modifiers.legs", + "english_translation": "When on Legs:" + }, + { + "key": "block.minecraft.banner.diagonal_up_left.cyan", + "english_translation": "Cyan Per Bend Inverted" + }, + { + "key": "commands.bossbar.set.visible.success.visible", + "english_translation": "Custom bossbar %s is now visible" + }, + { + "key": "block.minecraft.banner.small_stripes.lime", + "english_translation": "Lime Paly" + }, + { + "key": "block.minecraft.cut_sandstone", + "english_translation": "Cut Sandstone" + }, + { + "key": "block.minecraft.red_tulip", + "english_translation": "Red Tulip" + }, + { + "key": "subtitles.block.cake.add_candle", + "english_translation": "Cake squishes" + }, + { + "key": "gui.chatReport.send.no_reason", + "english_translation": "Please select a report category" + }, + { + "key": "controls.title", + "english_translation": "Controls" + }, + { + "key": "subtitles.entity.piglin.jealous", + "english_translation": "Piglin snorts enviously" + }, + { + "key": "telemetry.event.performance_metrics.description", + "english_translation": "Knowing the overall performance profile of Minecraft helps us tune and optimize the game for a wide range of machine specifications and operating systems. \nGame version is included to help us compare the performance profile for new versions of Minecraft." + }, + { + "key": "block.minecraft.light_gray_banner", + "english_translation": "Light Gray Banner" + }, + { + "key": "multiplayer.title", + "english_translation": "Play Multiplayer" + }, + { + "key": "gamerule.randomTickSpeed", + "english_translation": "Random tick speed rate" + }, + { + "key": "item.minecraft.heart_of_the_sea", + "english_translation": "Heart of the Sea" + }, + { + "key": "key.keyboard.left.alt", + "english_translation": "Left Alt" + }, + { + "key": "block.minecraft.banner.diagonal_up_left.red", + "english_translation": "Red Per Bend Inverted" + }, + { + "key": "deathScreen.score", + "english_translation": "Score" + }, + { + "key": "block.minecraft.banner.diagonal_up_right.magenta", + "english_translation": "Magenta Per Bend Sinister Inverted" + }, + { + "key": "optimizeWorld.info.skipped", + "english_translation": "Skipped chunks: %s" + }, + { + "key": "commands.ride.dismount.success", + "english_translation": "%s stopped riding %s" + }, + { + "key": "subtitles.entity.turtle.death", + "english_translation": "Turtle dies" + }, + { + "key": "item.minecraft.name_tag", + "english_translation": "Name Tag" + }, + { + "key": "stat.minecraft.jump", + "english_translation": "Jumps" + }, + { + "key": "block.minecraft.polished_deepslate_wall", + "english_translation": "Polished Deepslate Wall" + }, + { + "key": "subtitles.entity.elder_guardian.curse", + "english_translation": "Elder Guardian curses" + }, + { + "key": "block.minecraft.banner.stripe_top.purple", + "english_translation": "Purple Chief" + }, + { + "key": "commands.fillbiome.success.count", + "english_translation": "%s biome entry/entries set between %s, %s, %s and %s, %s, %s" + }, + { + "key": "item.minecraft.glass_bottle", + "english_translation": "Glass Bottle" + }, + { + "key": "block.minecraft.banner.piglin.magenta", + "english_translation": "Magenta Snout" + }, + { + "key": "item.minecraft.ender_eye", + "english_translation": "Eye of Ender" + }, + { + "key": "chat.disabled.options", + "english_translation": "Chat disabled in client options." + }, + { + "key": "item.minecraft.archer_pottery_shard", + "english_translation": "Archer Pottery Shard" + }, + { + "key": "key.keyboard.pause", + "english_translation": "Pause" + }, + { + "key": "block.minecraft.jungle_wall_sign", + "english_translation": "Jungle Wall Sign" + }, + { + "key": "block.minecraft.waxed_copper_block", + "english_translation": "Waxed Block of Copper" + }, + { + "key": "item.minecraft.pitcher_pod", + "english_translation": "Pitcher Pod" + }, + { + "key": "mco.template.select.failure", + "english_translation": "We couldn't retrieve the list of content for this category.\nPlease check your internet connection, or try again later." + }, + { + "key": "pack.name.fabricMods", + "english_translation": "Fabric Mods" + }, + { + "key": "commands.trigger.simple.success", + "english_translation": "Triggered %s" + }, + { + "key": "quickplay.error.title", + "english_translation": "Failed to Quick Play" + }, + { + "key": "item.minecraft.firework_star.white", + "english_translation": "White" + }, + { + "key": "block.minecraft.gray_stained_glass", + "english_translation": "Gray Stained Glass" + }, + { + "key": "block.minecraft.sandstone_slab", + "english_translation": "Sandstone Slab" + }, + { + "key": "item.minecraft.lingering_potion.effect.leaping", + "english_translation": "Lingering Potion of Leaping" + }, + { + "key": "container.furnace", + "english_translation": "Furnace" + }, + { + "key": "commands.forceload.query.success", + "english_translation": "Chunk at %s in %s is marked for force loading" + }, + { + "key": "commands.whitelist.remove.failed", + "english_translation": "Player is not whitelisted" + }, + { + "key": "block.minecraft.banner.skull.white", + "english_translation": "White Skull Charge" + }, + { + "key": "block.minecraft.banner.square_bottom_left.yellow", + "english_translation": "Yellow Base Dexter Canton" + }, + { + "key": "block.minecraft.banner.circle.cyan", + "english_translation": "Cyan Roundel" + }, + { + "key": "subtitles.item.flintandsteel.use", + "english_translation": "Flint and Steel click" + }, + { + "key": "options.telemetry.state.all", + "english_translation": "All" + }, + { + "key": "block.minecraft.potted_allium", + "english_translation": "Potted Allium" + }, + { + "key": "subtitles.entity.endermite.hurt", + "english_translation": "Endermite hurts" + }, + { + "key": "commands.debug.function.noRecursion", + "english_translation": "Can't trace from inside of function" + }, + { + "key": "block.minecraft.banner.small_stripes.blue", + "english_translation": "Blue Paly" + }, + { + "key": "block.minecraft.waxed_weathered_cut_copper_stairs", + "english_translation": "Waxed Weathered Cut Copper Stairs" + }, + { + "key": "block.minecraft.stone", + "english_translation": "Stone" + }, + { + "key": "subtitles.entity.allay.death", + "english_translation": "Allay dies" + }, + { + "key": "dataPack.vanilla.description", + "english_translation": "The default data for Minecraft" + }, + { + "key": "block.minecraft.banner.diagonal_up_left.light_blue", + "english_translation": "Light Blue Per Bend Inverted" + }, + { + "key": "commands.place.jigsaw.success", + "english_translation": "Generated jigsaw at %s, %s, %s" + }, + { + "key": "trim_pattern.minecraft.wayfinder", + "english_translation": "Wayfinder Armor Trim" + }, + { + "key": "block.minecraft.banner.globe.black", + "english_translation": "Black Globe" + }, + { + "key": "block.minecraft.banner.skull.gray", + "english_translation": "Gray Skull Charge" + }, + { + "key": "advancements.adventure.very_very_frightening.description", + "english_translation": "Strike a Villager with lightning" + }, + { + "key": "selectWorld.backupQuestion.snapshot", + "english_translation": "Do you really want to load this world?" + }, + { + "key": "telemetry.property.game_mode.title", + "english_translation": "Game Mode" + }, + { + "key": "commands.scoreboard.players.list.empty", + "english_translation": "There are no tracked entities" + }, + { + "key": "gamerule.doTraderSpawning", + "english_translation": "Spawn Wandering Traders" + }, + { + "key": "advancements.story.lava_bucket.description", + "english_translation": "Fill a Bucket with lava" + }, + { + "key": "key.keyboard.minus", + "english_translation": "-" + }, + { + "key": "options.entityDistanceScaling", + "english_translation": "Entity Distance" + }, + { + "key": "item.minecraft.diamond_horse_armor", + "english_translation": "Diamond Horse Armor" + }, + { + "key": "gamerule.maxEntityCramming", + "english_translation": "Entity cramming threshold" + }, + { + "key": "advancements.adventure.totem_of_undying.title", + "english_translation": "Postmortal" + }, + { + "key": "entity.minecraft.snow_golem", + "english_translation": "Snow Golem" + }, + { + "key": "options.particles.minimal", + "english_translation": "Minimal" + }, + { + "key": "subtitles.block.barrel.open", + "english_translation": "Barrel opens" + }, + { + "key": "title.32bit.deprecation.realms", + "english_translation": "Minecraft will soon require a 64-bit system, which will prevent you from playing or using Realms on this device. You will need to manually cancel any Realms subscription." + }, + { + "key": "block.minecraft.copper_ore", + "english_translation": "Copper Ore" + }, + { + "key": "gui.socialInteractions.empty_blocked", + "english_translation": "No blocked players in chat" + }, + { + "key": "block.minecraft.green_wool", + "english_translation": "Green Wool" + }, + { + "key": "block.minecraft.carrots", + "english_translation": "Carrots" + }, + { + "key": "subtitles.entity.villager.work_mason", + "english_translation": "Mason works" + }, + { + "key": "mco.notification.dismiss", + "english_translation": "Dismiss" + }, + { + "key": "mco.configure.world.minigame", + "english_translation": "Current: %s" + }, + { + "key": "commands.summon.failed.uuid", + "english_translation": "Unable to summon entity due to duplicate UUIDs" + }, + { + "key": "advMode.trackOutput", + "english_translation": "Track output" + }, + { + "key": "mco.minigame.world.switch.title", + "english_translation": "Switch minigame" + }, + { + "key": "item.minecraft.cod", + "english_translation": "Raw Cod" + }, + { + "key": "block.minecraft.gray_candle_cake", + "english_translation": "Cake with Gray Candle" + }, + { + "key": "item.minecraft.debug_stick.select", + "english_translation": "selected \"%s\" (%s)" + }, + { + "key": "block.minecraft.piston_head", + "english_translation": "Piston Head" + }, + { + "key": "item.minecraft.potion.effect.slow_falling", + "english_translation": "Potion of Slow Falling" + }, + { + "key": "options.resourcepack", + "english_translation": "Resource Packs..." + }, + { + "key": "subtitles.entity.wither.hurt", + "english_translation": "Wither hurts" + }, + { + "key": "death.attack.mob", + "english_translation": "%1$s was slain by %2$s" + }, + { + "key": "block.minecraft.lime_carpet", + "english_translation": "Lime Carpet" + }, + { + "key": "advancements.nether.netherite_armor.description", + "english_translation": "Get a full suit of Netherite armor" + }, + { + "key": "subtitles.item.armor.equip_elytra", + "english_translation": "Elytra rustle" + }, + { + "key": "selectServer.hiddenAddress", + "english_translation": "(Hidden)" + }, + { + "key": "commands.weather.set.thunder", + "english_translation": "Set the weather to rain & thunder" + }, + { + "key": "color.minecraft.light_blue", + "english_translation": "Light Blue" + }, + { + "key": "block.minecraft.banner.mojang.red", + "english_translation": "Red Thing" + }, + { + "key": "subtitles.entity.salmon.flop", + "english_translation": "Salmon flops" + }, + { + "key": "block.minecraft.potted_crimson_roots", + "english_translation": "Potted Crimson Roots" + }, + { + "key": "item.minecraft.debug_stick.update", + "english_translation": "\"%s\" to %s" + }, + { + "key": "pack.incompatible.confirm.old", + "english_translation": "This pack was made for an older version of Minecraft and may no longer work correctly." + }, + { + "key": "options.narrator", + "english_translation": "Narrator" + }, + { + "key": "block.minecraft.stripped_crimson_hyphae", + "english_translation": "Stripped Crimson Hyphae" + }, + { + "key": "gui.chatReport.draft.content", + "english_translation": "Would you like to continue editing the existing report or discard it and create a new one?" + }, + { + "key": "mco.brokenworld.download", + "english_translation": "Download" + }, + { + "key": "subtitles.entity.zombie.break_wooden_door", + "english_translation": "Door breaks" + }, + { + "key": "block.minecraft.banner.gradient_up.gray", + "english_translation": "Gray Base Gradient" + }, + { + "key": "multiplayer.player.list.narration", + "english_translation": "Online players: %s" + }, + { + "key": "item.minecraft.bundle.fullness", + "english_translation": "%s/%s" + }, + { + "key": "subtitles.entity.hoglin.step", + "english_translation": "Hoglin steps" + }, + { + "key": "death.attack.dryout.player", + "english_translation": "%1$s died from dehydration whilst trying to escape %2$s" + }, + { + "key": "item.minecraft.iron_helmet", + "english_translation": "Iron Helmet" + }, + { + "key": "commands.experience.add.points.success.multiple", + "english_translation": "Gave %s experience points to %s players" + }, + { + "key": "subtitles.entity.parrot.imitate.piglin_brute", + "english_translation": "Parrot snorts" + }, + { + "key": "subtitles.entity.polar_bear.ambient_baby", + "english_translation": "Polar Bear hums" + }, + { + "key": "options.difficulty.normal.info", + "english_translation": "Hostile mobs spawn and deal standard damage. Hunger bar depletes and drains health down to half a heart." + }, + { + "key": "gui.toRealms", + "english_translation": "Back to Realms List" + }, + { + "key": "selectWorld.gameMode.survival", + "english_translation": "Survival" + }, + { + "key": "key.playerlist", + "english_translation": "List Players" + }, + { + "key": "options.graphics.warning.cancel", + "english_translation": "Take Me Back" + }, + { + "key": "debug.help.message", + "english_translation": "Key bindings:" + }, + { + "key": "block.minecraft.potted_blue_orchid", + "english_translation": "Potted Blue Orchid" + }, + { + "key": "block.minecraft.brick_stairs", + "english_translation": "Brick Stairs" + }, + { + "key": "structure_block.mode.data", + "english_translation": "Data" + }, + { + "key": "item.minecraft.beetroot_soup", + "english_translation": "Beetroot Soup" + }, + { + "key": "subtitles.entity.turtle.death_baby", + "english_translation": "Turtle baby dies" + }, + { + "key": "addServer.enterName", + "english_translation": "Server Name" + }, + { + "key": "multiplayer.disconnect.kicked", + "english_translation": "Kicked by an operator" + }, + { + "key": "block.minecraft.waxed_cut_copper_slab", + "english_translation": "Waxed Cut Copper Slab" + }, + { + "key": "mco.backup.changes.tooltip", + "english_translation": "Changes" + }, + { + "key": "subtitles.entity.skeleton.converted_to_stray", + "english_translation": "Skeleton converts to Stray" + }, + { + "key": "block.minecraft.banner.flower.yellow", + "english_translation": "Yellow Flower Charge" + }, + { + "key": "block.minecraft.banner.diagonal_right.magenta", + "english_translation": "Magenta Per Bend" + }, + { + "key": "mco.upload.size.failure.line2", + "english_translation": "It is %s. The maximum allowed size is %s." + }, + { + "key": "mco.upload.size.failure.line1", + "english_translation": "'%s' is too big!" + }, + { + "key": "createWorld.customize.custom.minHeight", + "english_translation": "Min. Height" + }, + { + "key": "item.minecraft.burn_pottery_shard", + "english_translation": "Burn Pottery Shard" + }, + { + "key": "block.minecraft.banner.square_bottom_right.purple", + "english_translation": "Purple Base Sinister Canton" + }, + { + "key": "commands.scoreboard.objectives.add.success", + "english_translation": "Created new objective %s" + }, + { + "key": "flat_world_preset.minecraft.water_world", + "english_translation": "Water World" + }, + { + "key": "key.keyboard.left.shift", + "english_translation": "Left Shift" + }, + { + "key": "block.minecraft.banner.base.brown", + "english_translation": "Fully Brown Field" + }, + { + "key": "block.minecraft.banner.base.red", + "english_translation": "Fully Red Field" + }, + { + "key": "command.context.here", + "english_translation": "<--[HERE]" + }, + { + "key": "mco.template.title", + "english_translation": "World templates" + }, + { + "key": "subtitles.entity.horse.ambient", + "english_translation": "Horse neighs" + }, + { + "key": "block.minecraft.cherry_wall_hanging_sign", + "english_translation": "Cherry Wall Hanging Sign" + }, + { + "key": "mco.configure.world.spawnNPCs", + "english_translation": "Spawn NPCs" + }, + { + "key": "item.minecraft.pillager_spawn_egg", + "english_translation": "Pillager Spawn Egg" + }, + { + "key": "structure_block.include_entities", + "english_translation": "Include Entities:" + }, + { + "key": "multiplayerWarning.check", + "english_translation": "Do not show this screen again" + }, + { + "key": "subtitles.entity.leash_knot.break", + "english_translation": "Leash Knot breaks" + }, + { + "key": "block.minecraft.banner.triangle_bottom.magenta", + "english_translation": "Magenta Chevron" + }, + { + "key": "options.hidden", + "english_translation": "Hidden" + }, + { + "key": "block.minecraft.banner.circle.brown", + "english_translation": "Brown Roundel" + }, + { + "key": "item.minecraft.strider_spawn_egg", + "english_translation": "Strider Spawn Egg" + }, + { + "key": "subtitles.entity.parrot.imitate.wither_skeleton", + "english_translation": "Parrot rattles" + }, + { + "key": "mco.gui.button", + "english_translation": "Button" + }, + { + "key": "block.minecraft.banner.diagonal_up_right.pink", + "english_translation": "Pink Per Bend Sinister Inverted" + }, + { + "key": "gui.socialInteractions.status_offline", + "english_translation": "Offline" + }, + { + "key": "block.minecraft.weeping_vines_plant", + "english_translation": "Weeping Vines Plant" + }, + { + "key": "mco.download.preparing", + "english_translation": "Preparing download" + }, + { + "key": "block.minecraft.banner.rhombus.light_blue", + "english_translation": "Light Blue Lozenge" + }, + { + "key": "mco.upload.entry.cheats", + "english_translation": "%1$s, %2$s" + }, + { + "key": "death.attack.outsideBorder.player", + "english_translation": "%1$s left the confines of this world whilst fighting %2$s" + }, + { + "key": "block.minecraft.gray_banner", + "english_translation": "Gray Banner" + }, + { + "key": "commands.function.success.single", + "english_translation": "Executed %s command(s) from function '%s'" + }, + { + "key": "multiplayer.message_not_delivered", + "english_translation": "Can't deliver chat message, check server logs: %s" + }, + { + "key": "subtitles.entity.fox.aggro", + "english_translation": "Fox angers" + }, + { + "key": "gamerule.mobGriefing", + "english_translation": "Allow destructive mob actions" + }, + { + "key": "item.minecraft.spyglass", + "english_translation": "Spyglass" + }, + { + "key": "subtitles.item.bucket.fill_axolotl", + "english_translation": "Axolotl scooped" + }, + { + "key": "options.screenEffectScale.tooltip", + "english_translation": "Strength of nausea and Nether portal screen distortion effects.\nAt lower values, the nausea effect is replaced with a green overlay." + }, + { + "key": "selectWorld.gameMode", + "english_translation": "Game Mode" + }, + { + "key": "entity.minecraft.tropical_fish.type.stripey", + "english_translation": "Stripey" + }, + { + "key": "createWorld.customize.custom.prev", + "english_translation": "Previous Page" + }, + { + "key": "createWorld.customize.presets.title", + "english_translation": "Select a Preset" + }, + { + "key": "block.minecraft.white_stained_glass_pane", + "english_translation": "White Stained Glass Pane" + }, + { + "key": "block.minecraft.potted_jungle_sapling", + "english_translation": "Potted Jungle Sapling" + }, + { + "key": "options.modelPart.right_sleeve", + "english_translation": "Right Sleeve" + }, + { + "key": "commands.summon.failed", + "english_translation": "Unable to summon entity" + }, + { + "key": "arguments.operation.invalid", + "english_translation": "Invalid operation" + }, + { + "key": "block.minecraft.banner.half_vertical.black", + "english_translation": "Black Per Pale" + }, + { + "key": "item.minecraft.lingering_potion", + "english_translation": "Lingering Potion" + }, + { + "key": "subtitles.entity.villager.ambient", + "english_translation": "Villager mumbles" + }, + { + "key": "block.minecraft.banner.rhombus.lime", + "english_translation": "Lime Lozenge" + }, + { + "key": "block.minecraft.banner.half_vertical.cyan", + "english_translation": "Cyan Per Pale" + }, + { + "key": "key.keyboard.left.bracket", + "english_translation": "[" + }, + { + "key": "item.minecraft.tipped_arrow.effect.swiftness", + "english_translation": "Arrow of Swiftness" + }, + { + "key": "subtitles.item.trident.thunder", + "english_translation": "Trident thunder cracks" + }, + { + "key": "argument.time.invalid_tick_count", + "english_translation": "Tick count must be non-negative" + }, + { + "key": "block.minecraft.banner.stripe_top.magenta", + "english_translation": "Magenta Chief" + }, + { + "key": "menu.reportBugs", + "english_translation": "Report Bugs" + }, + { + "key": "enchantment.minecraft.frost_walker", + "english_translation": "Frost Walker" + }, + { + "key": "block.minecraft.banner.half_vertical_right.light_gray", + "english_translation": "Light Gray Per Pale Inverted" + }, + { + "key": "block.minecraft.banner.stripe_downright.orange", + "english_translation": "Orange Bend" + }, + { + "key": "biome.minecraft.stony_shore", + "english_translation": "Stony Shore" + }, + { + "key": "item.minecraft.goat_horn", + "english_translation": "Goat Horn" + }, + { + "key": "painting.minecraft.pointer.title", + "english_translation": "Pointer" + }, + { + "key": "block.minecraft.birch_button", + "english_translation": "Birch Button" + }, + { + "key": "subtitles.weather.rain", + "english_translation": "Rain falls" + }, + { + "key": "gamerule.tntExplosionDropDecay", + "english_translation": "In TNT explosions, some blocks won't drop their loot" + }, + { + "key": "block.minecraft.purple_candle_cake", + "english_translation": "Cake with Purple Candle" + }, + { + "key": "commands.summon.invalidPosition", + "english_translation": "Invalid position for summon" + }, + { + "key": "block.minecraft.stripped_crimson_stem", + "english_translation": "Stripped Crimson Stem" + }, + { + "key": "subtitles.block.sculk_sensor.clicking", + "english_translation": "Sculk Sensor starts clicking" + }, + { + "key": "subtitles.entity.camel.eat", + "english_translation": "Camel eats" + }, + { + "key": "subtitles.entity.wandering_trader.death", + "english_translation": "Wandering Trader dies" + }, + { + "key": "gui.abuseReport.reason.hate_speech", + "english_translation": "Hate speech" + }, + { + "key": "block.minecraft.jungle_fence", + "english_translation": "Jungle Fence" + }, + { + "key": "entity.minecraft.item", + "english_translation": "Item" + }, + { + "key": "selectWorld.mapType.normal", + "english_translation": "Normal" + }, + { + "key": "instrument.minecraft.yearn_goat_horn", + "english_translation": "Yearn" + }, + { + "key": "commands.schedule.cleared.success", + "english_translation": "Removed %s schedule(s) with id %s" + }, + { + "key": "block.minecraft.banner.globe.magenta", + "english_translation": "Magenta Globe" + }, + { + "key": "advMode.type", + "english_translation": "Type" + }, + { + "key": "generator.minecraft.flat", + "english_translation": "Superflat" + }, + { + "key": "menu.singleplayer", + "english_translation": "Singleplayer" + }, + { + "key": "narrator.loading.done", + "english_translation": "Done" + }, + { + "key": "commands.attribute.failed.entity", + "english_translation": "%s is not a valid entity for this command" + }, + { + "key": "disconnect.timeout", + "english_translation": "Timed out" + }, + { + "key": "selectWorld.recreate.error.text", + "english_translation": "Something went wrong while trying to recreate a world." + }, + { + "key": "book.generation.3", + "english_translation": "Tattered" + }, + { + "key": "book.generation.1", + "english_translation": "Copy of original" + }, + { + "key": "book.generation.2", + "english_translation": "Copy of a copy" + }, + { + "key": "gamerule.waterSourceConversion.description", + "english_translation": "When flowing water is surrounded on two sides by water sources it converts into a source." + }, + { + "key": "subtitles.entity.wandering_trader.reappeared", + "english_translation": "Wandering Trader appears" + }, + { + "key": "block.minecraft.seagrass", + "english_translation": "Seagrass" + }, + { + "key": "block.minecraft.diamond_block", + "english_translation": "Block of Diamond" + }, + { + "key": "item.minecraft.potion.effect.healing", + "english_translation": "Potion of Healing" + }, + { + "key": "mco.configure.world.subscription.remaining.days", + "english_translation": "%1$s day(s)" + }, + { + "key": "block.minecraft.blue_carpet", + "english_translation": "Blue Carpet" + }, + { + "key": "block.minecraft.lightning_rod", + "english_translation": "Lightning Rod" + }, + { + "key": "enchantment.minecraft.sweeping", + "english_translation": "Sweeping Edge" + }, + { + "key": "commands.data.block.query", + "english_translation": "%s, %s, %s has the following block data: %s" + }, + { + "key": "subtitles.entity.zombie.attack_wooden_door", + "english_translation": "Door shakes" + }, + { + "key": "item.minecraft.dark_oak_boat", + "english_translation": "Dark Oak Boat" + }, + { + "key": "options.chat.delay_none", + "english_translation": "Chat Delay: None" + }, + { + "key": "item.minecraft.white_dye", + "english_translation": "White Dye" + }, + { + "key": "block.minecraft.potted_cactus", + "english_translation": "Potted Cactus" + }, + { + "key": "gui.chatReport.send.comments_too_long", + "english_translation": "Please shorten the comment" + }, + { + "key": "item.minecraft.crossbow.projectile", + "english_translation": "Projectile:" + }, + { + "key": "container.enchant.clue", + "english_translation": "%s . . . ?" + }, + { + "key": "block.minecraft.banner.rhombus.blue", + "english_translation": "Blue Lozenge" + }, + { + "key": "selectWorld.edit.export_worldgen_settings", + "english_translation": "Export World Generation Settings" + }, + { + "key": "subtitles.entity.zombie.ambient", + "english_translation": "Zombie groans" + }, + { + "key": "item.minecraft.feather", + "english_translation": "Feather" + }, + { + "key": "options.languageWarning", + "english_translation": "Language translations may not be 100%% accurate" + }, + { + "key": "painting.minecraft.skeleton.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "block.minecraft.banner.border.light_gray", + "english_translation": "Light Gray Bordure" + }, + { + "key": "subtitles.entity.zombie.death", + "english_translation": "Zombie dies" + }, + { + "key": "item.minecraft.chainmail_helmet", + "english_translation": "Chainmail Helmet" + }, + { + "key": "gui.banned.title.permanent", + "english_translation": "Account permanently banned" + }, + { + "key": "item.minecraft.warden_spawn_egg", + "english_translation": "Warden Spawn Egg" + }, + { + "key": "commands.forceload.removed.multiple", + "english_translation": "Unmarked %s chunks in %s from %s to %s for force loading" + }, + { + "key": "options.damageTiltStrength", + "english_translation": "Damage Tilt" + }, + { + "key": "team.visibility.always", + "english_translation": "Always" + }, + { + "key": "block.minecraft.mud_brick_slab", + "english_translation": "Mud Brick Slab" + }, + { + "key": "argument.entity.options.level.description", + "english_translation": "Experience level" + }, + { + "key": "block.minecraft.banner.gradient.orange", + "english_translation": "Orange Gradient" + }, + { + "key": "block.minecraft.netherrack", + "english_translation": "Netherrack" + }, + { + "key": "block.minecraft.ice", + "english_translation": "Ice" + }, + { + "key": "item.minecraft.tadpole_spawn_egg", + "english_translation": "Tadpole Spawn Egg" + }, + { + "key": "block.minecraft.banner.square_bottom_right.light_gray", + "english_translation": "Light Gray Base Sinister Canton" + }, + { + "key": "book.generation.0", + "english_translation": "Original" + }, + { + "key": "block.minecraft.banner.square_top_right.purple", + "english_translation": "Purple Chief Sinister Canton" + }, + { + "key": "block.minecraft.crimson_sign", + "english_translation": "Crimson Sign" + }, + { + "key": "block.minecraft.lantern", + "english_translation": "Lantern" + }, + { + "key": "mco.configure.world.invites.normal.tooltip", + "english_translation": "Normal user" + }, + { + "key": "block.minecraft.banner.stripe_bottom.brown", + "english_translation": "Brown Base" + }, + { + "key": "color.minecraft.magenta", + "english_translation": "Magenta" + }, + { + "key": "gui.banned.reason.extreme_violence_or_gore", + "english_translation": "Depictions of real-life excessive violence or gore" + }, + { + "key": "block.minecraft.banner.half_horizontal.purple", + "english_translation": "Purple Per Fess" + }, + { + "key": "block.minecraft.dropper", + "english_translation": "Dropper" + }, + { + "key": "commands.perf.notRunning", + "english_translation": "The performance profiler hasn't started" + }, + { + "key": "subtitles.entity.goat.ambient", + "english_translation": "Goat bleats" + }, + { + "key": "subtitles.entity.tadpole.flop", + "english_translation": "Tadpole flops" + }, + { + "key": "advMode.self", + "english_translation": "Use \"@s\" to target the executing entity" + }, + { + "key": "key.categories.gameplay", + "english_translation": "Gameplay" + }, + { + "key": "narration.selection.usage", + "english_translation": "Press up and down buttons to move to another entry" + }, + { + "key": "block.minecraft.banner.straight_cross.brown", + "english_translation": "Brown Cross" + }, + { + "key": "advancements.toast.task", + "english_translation": "Advancement Made!" + }, + { + "key": "block.minecraft.banner.triangles_top.red", + "english_translation": "Red Chief Indented" + }, + { + "key": "block.minecraft.banner.half_horizontal_bottom.lime", + "english_translation": "Lime Per Fess Inverted" + }, + { + "key": "options.sensitivity", + "english_translation": "Sensitivity" + }, + { + "key": "subtitles.entity.enderman.teleport", + "english_translation": "Enderman teleports" + }, + { + "key": "block.minecraft.pink_banner", + "english_translation": "Pink Banner" + }, + { + "key": "commands.clear.test.single", + "english_translation": "Found %s matching item(s) on player %s" + }, + { + "key": "block.minecraft.pink_tulip", + "english_translation": "Pink Tulip" + }, + { + "key": "commands.drop.no_held_items", + "english_translation": "Entity can't hold any items" + }, + { + "key": "narrator.position.object_list", + "english_translation": "Selected row element %s out of %s" + }, + { + "key": "mco.trial.message.line1", + "english_translation": "Want to get your own realm?" + }, + { + "key": "mco.trial.message.line2", + "english_translation": "Click here for more info!" + }, + { + "key": "quickplay.error.realm_permission", + "english_translation": "Lacking permission to connect to this Realm" + }, + { + "key": "subtitles.entity.strider.eat", + "english_translation": "Strider eats" + }, + { + "key": "block.minecraft.banner.globe.green", + "english_translation": "Green Globe" + }, + { + "key": "argument.entity.options.tag.description", + "english_translation": "Entities with tag" + }, + { + "key": "argument.entity.options.dz.description", + "english_translation": "Entities between z and z + dz" + }, + { + "key": "item.minecraft.golden_shovel", + "english_translation": "Golden Shovel" + }, + { + "key": "subtitles.entity.leash_knot.place", + "english_translation": "Leash Knot tied" + }, + { + "key": "advancements.husbandry.allay_deliver_item_to_player.description", + "english_translation": "Have an Allay deliver items to you" + }, + { + "key": "block.minecraft.redstone_lamp", + "english_translation": "Redstone Lamp" + }, + { + "key": "effect.minecraft.jump_boost", + "english_translation": "Jump Boost" + }, + { + "key": "commands.scoreboard.objectives.display.alreadyEmpty", + "english_translation": "Nothing changed. That display slot is already empty" + }, + { + "key": "effect.minecraft.instant_health", + "english_translation": "Instant Health" + }, + { + "key": "mco.brokenworld.play", + "english_translation": "Play" + }, + { + "key": "options.modelPart.right_pants_leg", + "english_translation": "Right Pants Leg" + }, + { + "key": "subtitles.entity.skeleton_horse.swim", + "english_translation": "Skeleton Horse swims" + }, + { + "key": "commands.team.add.success", + "english_translation": "Created team %s" + }, + { + "key": "subtitles.entity.parrot.imitate.piglin", + "english_translation": "Parrot snorts" + }, + { + "key": "debug.inspect.server.block", + "english_translation": "Copied server-side block data to clipboard" + }, + { + "key": "block.minecraft.diorite_wall", + "english_translation": "Diorite Wall" + }, + { + "key": "commands.effect.clear.specific.success.multiple", + "english_translation": "Removed effect %s from %s targets" + }, + { + "key": "advancements.husbandry.breed_all_animals.description", + "english_translation": "Breed all the animals!" + }, + { + "key": "subtitles.block.beacon.power_select", + "english_translation": "Beacon power selected" + }, + { + "key": "resourcePack.programmer_art.name", + "english_translation": "Programmer Art" + }, + { + "key": "subtitles.block.beacon.deactivate", + "english_translation": "Beacon deactivates" + }, + { + "key": "options.off", + "english_translation": "OFF" + }, + { + "key": "item.minecraft.tipped_arrow.effect.levitation", + "english_translation": "Arrow of Levitation" + }, + { + "key": "item.minecraft.painting", + "english_translation": "Painting" + }, + { + "key": "block.minecraft.oak_button", + "english_translation": "Oak Button" + }, + { + "key": "commands.perf.stopped", + "english_translation": "Stopped performance profiling after %s second(s) and %s tick(s) (%s tick(s) per second)" + }, + { + "key": "commands.stopsound.success.source.sound", + "english_translation": "Stopped sound '%s' on source '%s'" + }, + { + "key": "subtitles.item.crossbow.hit", + "english_translation": "Arrow hits" + }, + { + "key": "entity.minecraft.minecart", + "english_translation": "Minecart" + }, + { + "key": "block.minecraft.polished_basalt", + "english_translation": "Polished Basalt" + }, + { + "key": "item.minecraft.lingering_potion.effect.water_breathing", + "english_translation": "Lingering Potion of Water Breathing" + }, + { + "key": "item.minecraft.acacia_chest_boat", + "english_translation": "Acacia Boat with Chest" + }, + { + "key": "multiplayer.status.old", + "english_translation": "Old" + }, + { + "key": "command.context.parse_error", + "english_translation": "%s at position %s: %s" + }, + { + "key": "stat.minecraft.drop", + "english_translation": "Items Dropped" + }, + { + "key": "block.minecraft.banner.stripe_downleft.red", + "english_translation": "Red Bend Sinister" + }, + { + "key": "block.minecraft.light_gray_bed", + "english_translation": "Light Gray Bed" + }, + { + "key": "stat_type.minecraft.crafted", + "english_translation": "Times Crafted" + }, + { + "key": "subtitles.block.sniffer_egg.plop", + "english_translation": "Sniffer plops" + }, + { + "key": "block.minecraft.polished_andesite_slab", + "english_translation": "Polished Andesite Slab" + }, + { + "key": "item.minecraft.firework_star.magenta", + "english_translation": "Magenta" + }, + { + "key": "subtitles.entity.villager.work_shepherd", + "english_translation": "Shepherd works" + }, + { + "key": "block.minecraft.mossy_cobblestone_wall", + "english_translation": "Mossy Cobblestone Wall" + }, + { + "key": "multiplayer.stopSleeping", + "english_translation": "Leave Bed" + }, + { + "key": "commands.particle.failed", + "english_translation": "The particle was not visible for anybody" + }, + { + "key": "subtitles.entity.camel.hurt", + "english_translation": "Camel hurts" + }, + { + "key": "advancements.husbandry.froglights.description", + "english_translation": "Have all Froglights in your inventory" + }, + { + "key": "screenshot.failure", + "english_translation": "Couldn't save screenshot: %s" + }, + { + "key": "parsing.quote.escape", + "english_translation": "Invalid escape sequence '\\%s' in quoted string" + }, + { + "key": "advancements.adventure.read_power_from_chiseled_bookshelf.title", + "english_translation": "The Power of Books" + }, + { + "key": "stat.minecraft.sprint_one_cm", + "english_translation": "Distance Sprinted" + }, + { + "key": "commands.scoreboard.objectives.remove.success", + "english_translation": "Removed objective %s" + }, + { + "key": "biome.minecraft.dark_forest", + "english_translation": "Dark Forest" + }, + { + "key": "entity.minecraft.trident", + "english_translation": "Trident" + }, + { + "key": "multiplayer.disconnect.unexpected_query_response", + "english_translation": "Unexpected custom data from client" + }, + { + "key": "block.minecraft.gilded_blackstone", + "english_translation": "Gilded Blackstone" + }, + { + "key": "subtitles.entity.husk.hurt", + "english_translation": "Husk hurts" + }, + { + "key": "advancements.story.form_obsidian.title", + "english_translation": "Ice Bucket Challenge" + }, + { + "key": "advancements.nether.charge_respawn_anchor.title", + "english_translation": "Not Quite \"Nine\" Lives" + }, + { + "key": "block.minecraft.jungle_slab", + "english_translation": "Jungle Slab" + }, + { + "key": "multiplayer.downloadingStats", + "english_translation": "Retrieving statistics..." + }, + { + "key": "subtitles.entity.cat.purr", + "english_translation": "Cat purrs" + }, + { + "key": "difficulty.lock.question", + "english_translation": "Are you sure you want to lock the difficulty of this world? This will set this world to always be %1$s, and you will never be able to change that again." + }, + { + "key": "item.minecraft.jungle_chest_boat", + "english_translation": "Jungle Boat with Chest" + }, + { + "key": "team.visibility.hideForOtherTeams", + "english_translation": "Hide for other teams" + }, + { + "key": "block.minecraft.mangrove_button", + "english_translation": "Mangrove Button" + }, + { + "key": "item.minecraft.chicken", + "english_translation": "Raw Chicken" + }, + { + "key": "block.minecraft.banner.square_bottom_left.white", + "english_translation": "White Base Dexter Canton" + }, + { + "key": "death.attack.fireworks.item", + "english_translation": "%1$s went off with a bang due to a firework fired from %3$s by %2$s" + }, + { + "key": "mco.selectServer.trial", + "english_translation": "Get a trial!" + }, + { + "key": "block.minecraft.yellow_stained_glass", + "english_translation": "Yellow Stained Glass" + }, + { + "key": "chat.coordinates", + "english_translation": "%s, %s, %s" + }, + { + "key": "subtitles.entity.skeleton_horse.ambient", + "english_translation": "Skeleton Horse cries" + }, + { + "key": "subtitles.block.chest.close", + "english_translation": "Chest closes" + }, + { + "key": "advancements.nether.find_bastion.title", + "english_translation": "Those Were the Days" + }, + { + "key": "item.minecraft.tipped_arrow.effect.empty", + "english_translation": "Uncraftable Tipped Arrow" + }, + { + "key": "block.minecraft.banner.square_top_left.white", + "english_translation": "White Chief Dexter Canton" + }, + { + "key": "block.minecraft.weathered_cut_copper_slab", + "english_translation": "Weathered Cut Copper Slab" + }, + { + "key": "gui.abuseReport.reason.alcohol_tobacco_drugs.description", + "english_translation": "Someone is encouraging others to partake in illegal drug related activities or encouraging underage drinking." + }, + { + "key": "options.prioritizeChunkUpdates.none.tooltip", + "english_translation": "Nearby chunks are compiled in parallel threads. This may result in brief visual holes when blocks are destroyed." + }, + { + "key": "block.minecraft.banner.mojang.pink", + "english_translation": "Pink Thing" + }, + { + "key": "gui.abuseReport.reason.defamation_impersonation_false_information", + "english_translation": "Defamation, impersonation, or false information" + }, + { + "key": "block.minecraft.birch_sign", + "english_translation": "Birch Sign" + }, + { + "key": "block.minecraft.banner.stripe_left.light_gray", + "english_translation": "Light Gray Pale Dexter" + }, + { + "key": "subtitles.entity.hoglin.hurt", + "english_translation": "Hoglin hurts" + }, + { + "key": "chat_screen.usage", + "english_translation": "Input message and press Enter to send" + }, + { + "key": "key.drop", + "english_translation": "Drop Selected Item" + }, + { + "key": "mco.configure.world.players.title", + "english_translation": "Players" + }, + { + "key": "flat_world_preset.minecraft.snowy_kingdom", + "english_translation": "Snowy Kingdom" + }, + { + "key": "item.minecraft.wheat", + "english_translation": "Wheat" + }, + { + "key": "entity.minecraft.end_crystal", + "english_translation": "End Crystal" + }, + { + "key": "options.mouse_settings.title", + "english_translation": "Mouse Settings" + }, + { + "key": "block.minecraft.shulker_box", + "english_translation": "Shulker Box" + }, + { + "key": "subtitles.entity.zombie_horse.ambient", + "english_translation": "Zombie Horse cries" + }, + { + "key": "subtitles.entity.mooshroom.eat", + "english_translation": "Mooshroom eats" + }, + { + "key": "block.minecraft.banner.base.cyan", + "english_translation": "Fully Cyan Field" + }, + { + "key": "gui.abuseReport.sending.title", + "english_translation": "Sending your report..." + }, + { + "key": "credits_and_attribution.button.attribution", + "english_translation": "Attribution" + }, + { + "key": "selectWorld.backupWarning.downgrade", + "english_translation": "This world was last played in version %s; you are on version %s. Downgrading a world could cause corruption - we cannot guarantee that it will load or work. If you still want to continue, please make a backup!" + }, + { + "key": "key.keyboard.keypad.add", + "english_translation": "Keypad +" + }, + { + "key": "block.minecraft.player_head.named", + "english_translation": "%s's Head" + }, + { + "key": "key.keyboard.slash", + "english_translation": "/" + }, + { + "key": "subtitles.entity.player.death", + "english_translation": "Player dies" + }, + { + "key": "block.minecraft.banner.diagonal_up_left.yellow", + "english_translation": "Yellow Per Bend Inverted" + }, + { + "key": "menu.generatingTerrain", + "english_translation": "Building terrain" + }, + { + "key": "item.minecraft.golden_sword", + "english_translation": "Golden Sword" + }, + { + "key": "mco.error.invalid.session.message", + "english_translation": "Please try restarting Minecraft" + }, + { + "key": "commands.ride.not_riding", + "english_translation": "%s is not riding any vehicle" + }, + { + "key": "createWorld.customize.custom.preset.mountains", + "english_translation": "Mountain Madness" + }, + { + "key": "block.minecraft.farmland", + "english_translation": "Farmland" + }, + { + "key": "commands.data.get.multiple", + "english_translation": "This argument accepts a single NBT value" + }, + { + "key": "options.forceUnicodeFont", + "english_translation": "Force Unicode Font" + }, + { + "key": "block.minecraft.cobblestone", + "english_translation": "Cobblestone" + }, + { + "key": "entity.minecraft.egg", + "english_translation": "Thrown Egg" + }, + { + "key": "block.minecraft.cyan_terracotta", + "english_translation": "Cyan Terracotta" + }, + { + "key": "gui.chatReport.send.too_many_messages", + "english_translation": "Trying to include too many messages in the report" + }, + { + "key": "merchant.trades", + "english_translation": "Trades" + }, + { + "key": "block.minecraft.light_blue_concrete", + "english_translation": "Light Blue Concrete" + }, + { + "key": "block.minecraft.acacia_button", + "english_translation": "Acacia Button" + }, + { + "key": "item.minecraft.fermented_spider_eye", + "english_translation": "Fermented Spider Eye" + }, + { + "key": "mco.configure.world.activityfeed.disabled", + "english_translation": "Player feed temporarily disabled" + }, + { + "key": "block.minecraft.honeycomb_block", + "english_translation": "Honeycomb Block" + }, + { + "key": "commands.deop.success", + "english_translation": "Made %s no longer a server operator" + }, + { + "key": "key.fullscreen", + "english_translation": "Toggle Fullscreen" + }, + { + "key": "block.minecraft.banner.border.gray", + "english_translation": "Gray Bordure" + }, + { + "key": "commands.function.success.single.result", + "english_translation": "Function '%2$s' returned %1$s" + }, + { + "key": "selectWorld.mapFeatures", + "english_translation": "Generate Structures" + }, + { + "key": "subtitles.block.chorus_flower.death", + "english_translation": "Chorus Flower withers" + }, + { + "key": "subtitles.block.sculk_catalyst.bloom", + "english_translation": "Sculk Catalyst blooms" + }, + { + "key": "subtitles.entity.warden.attack_impact", + "english_translation": "Warden lands hit" + }, + { + "key": "block.minecraft.magenta_terracotta", + "english_translation": "Magenta Terracotta" + }, + { + "key": "accessibility.onboarding.screen.narrator", + "english_translation": "Press enter to enable the narrator" + }, + { + "key": "enchantment.minecraft.projectile_protection", + "english_translation": "Projectile Protection" + }, + { + "key": "subtitles.block.beehive.enter", + "english_translation": "Bee enters hive" + }, + { + "key": "enchantment.minecraft.bane_of_arthropods", + "english_translation": "Bane of Arthropods" + }, + { + "key": "block.minecraft.banner.base.purple", + "english_translation": "Fully Purple Field" + }, + { + "key": "block.minecraft.stripped_jungle_wood", + "english_translation": "Stripped Jungle Wood" + }, + { + "key": "trim_material.minecraft.quartz", + "english_translation": "Quartz Material" + }, + { + "key": "createWorld.customize.custom.fixedBiome", + "english_translation": "Biome" + }, + { + "key": "block.minecraft.banner.stripe_middle.magenta", + "english_translation": "Magenta Fess" + }, + { + "key": "subtitles.item.bundle.insert", + "english_translation": "Item packed" + }, + { + "key": "subtitles.block.tripwire.attach", + "english_translation": "Tripwire attaches" + }, + { + "key": "subtitles.entity.zombie_villager.ambient", + "english_translation": "Zombie Villager groans" + }, + { + "key": "pack.incompatible.confirm.new", + "english_translation": "This pack was made for a newer version of Minecraft and may not work correctly." + }, + { + "key": "commands.advancement.advancementNotFound", + "english_translation": "No advancement was found by the name '%1$s'" + }, + { + "key": "subtitles.entity.sniffer.scenting", + "english_translation": "Sniffer scents" + }, + { + "key": "block.minecraft.banner.stripe_downleft.pink", + "english_translation": "Pink Bend Sinister" + }, + { + "key": "painting.minecraft.water.author", + "english_translation": "Mojang" + }, + { + "key": "block.minecraft.yellow_bed", + "english_translation": "Yellow Bed" + }, + { + "key": "gui.done", + "english_translation": "Done" + }, + { + "key": "commands.schedule.created.tag", + "english_translation": "Scheduled tag '%s' in %s ticks at gametime %s" + }, + { + "key": "arguments.nbtpath.node.invalid", + "english_translation": "Invalid NBT path element" + }, + { + "key": "death.attack.dragonBreath", + "english_translation": "%1$s was roasted in dragon's breath" + }, + { + "key": "commands.jfr.dump.failed", + "english_translation": "Failed to dump JFR recording: %s" + }, + { + "key": "mco.time.hoursAgo", + "english_translation": "%1$s hour(s) ago" + }, + { + "key": "stat.minecraft.climb_one_cm", + "english_translation": "Distance Climbed" + }, + { + "key": "subtitles.entity.iron_golem.repair", + "english_translation": "Iron Golem repaired" + }, + { + "key": "death.fell.assist.item", + "english_translation": "%1$s was doomed to fall by %2$s using %3$s" + }, + { + "key": "advancements.adventure.trim_with_all_exclusive_armor_patterns.title", + "english_translation": "Smithing with Style" + }, + { + "key": "block.minecraft.crimson_nylium", + "english_translation": "Crimson Nylium" + }, + { + "key": "item.minecraft.sheep_spawn_egg", + "english_translation": "Sheep Spawn Egg" + }, + { + "key": "advancements.adventure.sniper_duel.title", + "english_translation": "Sniper Duel" + }, + { + "key": "entity.minecraft.vex", + "english_translation": "Vex" + }, + { + "key": "advancements.nether.loot_bastion.title", + "english_translation": "War Pigs" + }, + { + "key": "block.minecraft.mossy_cobblestone", + "english_translation": "Mossy Cobblestone" + }, + { + "key": "death.attack.sweetBerryBush.player", + "english_translation": "%1$s was poked to death by a sweet berry bush whilst trying to escape %2$s" + }, + { + "key": "block.minecraft.prismarine_brick_stairs", + "english_translation": "Prismarine Brick Stairs" + }, + { + "key": "block.minecraft.ladder", + "english_translation": "Ladder" + }, + { + "key": "selectWorld.customizeType", + "english_translation": "Customize" + }, + { + "key": "subtitles.item.bundle.drop_contents", + "english_translation": "Bundle empties" + }, + { + "key": "block.minecraft.jungle_planks", + "english_translation": "Jungle Planks" + }, + { + "key": "subtitles.entity.frog.eat", + "english_translation": "Frog eats" + }, + { + "key": "argument.anchor.invalid", + "english_translation": "Invalid entity anchor position %s" + }, + { + "key": "subtitles.entity.item_frame.break", + "english_translation": "Item Frame breaks" + }, + { + "key": "block.minecraft.banner.diagonal_left.purple", + "english_translation": "Purple Per Bend Sinister" + }, + { + "key": "gui.banned.description", + "english_translation": "%s\n\n%s\n\nLearn more at the following link: %s" + }, + { + "key": "itemGroup.redstone", + "english_translation": "Redstone Blocks" + }, + { + "key": "stat.minecraft.trigger_trapped_chest", + "english_translation": "Trapped Chests Triggered" + }, + { + "key": "editGamerule.title", + "english_translation": "Edit Game Rules" + }, + { + "key": "item.minecraft.chainmail_leggings", + "english_translation": "Chainmail Leggings" + }, + { + "key": "item.minecraft.skeleton_horse_spawn_egg", + "english_translation": "Skeleton Horse Spawn Egg" + }, + { + "key": "item.minecraft.squid_spawn_egg", + "english_translation": "Squid Spawn Egg" + }, + { + "key": "selectWorld.conversion.tooltip", + "english_translation": "This world must be opened in an older version (like 1.6.4) to be safely converted" + }, + { + "key": "block.minecraft.banner.square_bottom_right.cyan", + "english_translation": "Cyan Base Sinister Canton" + }, + { + "key": "block.minecraft.banner.creeper.light_gray", + "english_translation": "Light Gray Creeper Charge" + }, + { + "key": "block.minecraft.banner.triangles_top.yellow", + "english_translation": "Yellow Chief Indented" + }, + { + "key": "block.minecraft.oak_fence", + "english_translation": "Oak Fence" + }, + { + "key": "item.minecraft.lingering_potion.effect.invisibility", + "english_translation": "Lingering Potion of Invisibility" + }, + { + "key": "dataPack.bundle.description", + "english_translation": "Enables experimental Bundle item" + }, + { + "key": "container.beacon", + "english_translation": "Beacon" + }, + { + "key": "commands.clone.overlap", + "english_translation": "The source and destination areas cannot overlap" + }, + { + "key": "block.minecraft.banner.half_vertical_right.black", + "english_translation": "Black Per Pale Inverted" + }, + { + "key": "biome.minecraft.lush_caves", + "english_translation": "Lush Caves" + }, + { + "key": "selectWorld.backupEraseCache", + "english_translation": "Erase Cached Data" + }, + { + "key": "block.minecraft.crimson_fence_gate", + "english_translation": "Crimson Fence Gate" + }, + { + "key": "block.minecraft.banner.cross.light_blue", + "english_translation": "Light Blue Saltire" + }, + { + "key": "block.minecraft.potted_pink_tulip", + "english_translation": "Potted Pink Tulip" + }, + { + "key": "mco.download.resourcePack.fail", + "english_translation": "Failed to download resource pack!" + }, + { + "key": "block.minecraft.potted_fern", + "english_translation": "Potted Fern" + }, + { + "key": "item.minecraft.nautilus_shell", + "english_translation": "Nautilus Shell" + }, + { + "key": "item.minecraft.golden_hoe", + "english_translation": "Golden Hoe" + }, + { + "key": "item.minecraft.potion.effect.fire_resistance", + "english_translation": "Potion of Fire Resistance" + }, + { + "key": "gui.chatSelection.context", + "english_translation": "Messages surrounding this selection will be included to provide additional context" + }, + { + "key": "subtitles.entity.tropical_fish.death", + "english_translation": "Tropical Fish dies" + }, + { + "key": "flat_world_preset.minecraft.overworld", + "english_translation": "Overworld" + }, + { + "key": "item.minecraft.carrot_on_a_stick", + "english_translation": "Carrot on a Stick" + }, + { + "key": "multiplayer.disconnect.out_of_order_chat", + "english_translation": "Out-of-order chat packet received. Did your system time change?" + }, + { + "key": "narration.recipe", + "english_translation": "Recipe for %s" + }, + { + "key": "controls.reset", + "english_translation": "Reset" + }, + { + "key": "trim_pattern.minecraft.eye", + "english_translation": "Eye Armor Trim" + }, + { + "key": "entity.minecraft.mooshroom", + "english_translation": "Mooshroom" + }, + { + "key": "argument.resource.invalid_type", + "english_translation": "Element '%s' has wrong type '%s' (expected '%s')" + }, + { + "key": "commands.team.option.seeFriendlyInvisibles.alreadyEnabled", + "english_translation": "Nothing changed. That team can already see invisible teammates" + }, + { + "key": "item.minecraft.bow", + "english_translation": "Bow" + }, + { + "key": "options.glintStrength", + "english_translation": "Glint Strength" + }, + { + "key": "block.minecraft.banner.stripe_bottom.gray", + "english_translation": "Gray Base" + }, + { + "key": "block.minecraft.deepslate", + "english_translation": "Deepslate" + }, + { + "key": "block.minecraft.wheat", + "english_translation": "Wheat Crops" + }, + { + "key": "gamerule.maxCommandChainLength.description", + "english_translation": "Applies to command block chains and functions." + }, + { + "key": "menu.online", + "english_translation": "Minecraft Realms" + }, + { + "key": "stat.minecraft.damage_dealt_absorbed", + "english_translation": "Damage Dealt (Absorbed)" + }, + { + "key": "block.minecraft.banner.triangle_bottom.white", + "english_translation": "White Chevron" + }, + { + "key": "options.accessibility.text_background.everywhere", + "english_translation": "Everywhere" + }, + { + "key": "item.minecraft.debug_stick", + "english_translation": "Debug Stick" + }, + { + "key": "block.minecraft.banner.piglin.brown", + "english_translation": "Brown Snout" + }, + { + "key": "block.minecraft.dark_oak_hanging_sign", + "english_translation": "Dark Oak Hanging Sign" + }, + { + "key": "mco.selectServer.expiredRenew", + "english_translation": "Renew" + }, + { + "key": "item.minecraft.mule_spawn_egg", + "english_translation": "Mule Spawn Egg" + }, + { + "key": "instrument.minecraft.seek_goat_horn", + "english_translation": "Seek" + }, + { + "key": "block.minecraft.banner.cross.gray", + "english_translation": "Gray Saltire" + }, + { + "key": "block.minecraft.bamboo_block", + "english_translation": "Block of Bamboo" + }, + { + "key": "lanServer.port.unavailable", + "english_translation": "Port not available.\nLeave the edit box empty or enter a different number between 1024 and 65535." + }, + { + "key": "item.minecraft.hopper_minecart", + "english_translation": "Minecart with Hopper" + }, + { + "key": "demo.remainingTime", + "english_translation": "Remaining time: %s" + }, + { + "key": "gamerule.waterSourceConversion", + "english_translation": "Water converts to source" + }, + { + "key": "pack.description.modResources", + "english_translation": "Mod resources." + }, + { + "key": "item.minecraft.tipped_arrow.effect.awkward", + "english_translation": "Tipped Arrow" + }, + { + "key": "mco.client.incompatible.title", + "english_translation": "Client incompatible!" + }, + { + "key": "block.minecraft.banner.stripe_center.orange", + "english_translation": "Orange Pale" + }, + { + "key": "mco.selectServer.create", + "english_translation": "Create realm" + }, + { + "key": "block.minecraft.banner.stripe_left.purple", + "english_translation": "Purple Pale Dexter" + }, + { + "key": "subtitles.entity.player.attack.crit", + "english_translation": "Critical attack" + }, + { + "key": "subtitles.entity.panda.worried_ambient", + "english_translation": "Panda whimpers" + }, + { + "key": "subtitles.item.dye.use", + "english_translation": "Dye stains" + }, + { + "key": "instrument.minecraft.dream_goat_horn", + "english_translation": "Dream" + }, + { + "key": "block.minecraft.banner.globe.white", + "english_translation": "White Globe" + }, + { + "key": "dataPack.vanilla.name", + "english_translation": "Default" + }, + { + "key": "gui.down", + "english_translation": "Down" + }, + { + "key": "block.minecraft.black_bed", + "english_translation": "Black Bed" + }, + { + "key": "entity.minecraft.sniffer", + "english_translation": "Sniffer" + }, + { + "key": "block.minecraft.banner.stripe_middle.gray", + "english_translation": "Gray Fess" + }, + { + "key": "death.attack.onFire.player", + "english_translation": "%1$s was burnt to a crisp whilst fighting %2$s" + }, + { + "key": "subtitles.block.composter.empty", + "english_translation": "Composter emptied" + }, + { + "key": "subtitles.entity.warden.nearby_closer", + "english_translation": "Warden advances" + }, + { + "key": "demo.demoExpired", + "english_translation": "Demo time's up!" + }, + { + "key": "item.minecraft.spruce_boat", + "english_translation": "Spruce Boat" + }, + { + "key": "commands.weather.set.clear", + "english_translation": "Set the weather to clear" + }, + { + "key": "subtitles.item.crossbow.shoot", + "english_translation": "Crossbow fires" + }, + { + "key": "mco.backup.restoring", + "english_translation": "Restoring your realm" + }, + { + "key": "subtitles.entity.item_frame.place", + "english_translation": "Item Frame placed" + }, + { + "key": "subtitles.entity.hoglin.converted_to_zombified", + "english_translation": "Hoglin converts to Zoglin" + }, + { + "key": "subtitles.entity.magma_cube.death", + "english_translation": "Magma Cube dies" + }, + { + "key": "commands.worldborder.warning.time.failed", + "english_translation": "Nothing changed. The world border warning is already that amount of time" + }, + { + "key": "block.minecraft.banner.half_vertical_right.green", + "english_translation": "Green Per Pale Inverted" + }, + { + "key": "item.minecraft.tipped_arrow.effect.mundane", + "english_translation": "Tipped Arrow" + }, + { + "key": "subtitles.entity.parrot.imitate.wither", + "english_translation": "Parrot angers" + }, + { + "key": "advancements.adventure.honey_block_slide.description", + "english_translation": "Jump into a Honey Block to break your fall" + }, + { + "key": "advancements.adventure.two_birds_one_arrow.title", + "english_translation": "Two Birds, One Arrow" + }, + { + "key": "block.minecraft.banner.gradient.blue", + "english_translation": "Blue Gradient" + }, + { + "key": "mco.selectServer.closed", + "english_translation": "Closed realm" + }, + { + "key": "block.minecraft.sea_lantern", + "english_translation": "Sea Lantern" + }, + { + "key": "block.minecraft.stripped_jungle_log", + "english_translation": "Stripped Jungle Log" + }, + { + "key": "container.brewing", + "english_translation": "Brewing Stand" + }, + { + "key": "subtitles.block.generic.hit", + "english_translation": "Block breaking" + }, + { + "key": "block.minecraft.prismarine_bricks", + "english_translation": "Prismarine Bricks" + }, + { + "key": "selectServer.deleteWarning", + "english_translation": "'%s' will be lost forever! (A long time!)" + }, + { + "key": "subtitles.entity.piglin.death", + "english_translation": "Piglin dies" + }, + { + "key": "block.minecraft.banner.creeper.cyan", + "english_translation": "Cyan Creeper Charge" + }, + { + "key": "advancements.husbandry.wax_on.description", + "english_translation": "Apply Honeycomb to a Copper block!" + }, + { + "key": "item.minecraft.brown_dye", + "english_translation": "Brown Dye" + }, + { + "key": "mco.upload.hardcore", + "english_translation": "Hardcore worlds can't be uploaded!" + }, + { + "key": "subtitles.entity.egg.throw", + "english_translation": "Egg flies" + }, + { + "key": "advancements.adventure.kill_mob_near_sculk_catalyst.description", + "english_translation": "Kill a mob near a Sculk Catalyst" + }, + { + "key": "item.minecraft.prize_pottery_sherd", + "english_translation": "Prize Pottery Sherd" + }, + { + "key": "stat.minecraft.walk_under_water_one_cm", + "english_translation": "Distance Walked under Water" + }, + { + "key": "createWorld.customize.custom.preset.caveChaos", + "english_translation": "Caves of Chaos" + }, + { + "key": "stat.minecraft.interact_with_blast_furnace", + "english_translation": "Interactions with Blast Furnace" + }, + { + "key": "gui.recipebook.toggleRecipes.smeltable", + "english_translation": "Showing Smeltable" + }, + { + "key": "item.minecraft.panda_spawn_egg", + "english_translation": "Panda Spawn Egg" + }, + { + "key": "block.minecraft.conduit", + "english_translation": "Conduit" + }, + { + "key": "block.minecraft.oxidized_cut_copper", + "english_translation": "Oxidized Cut Copper" + }, + { + "key": "commands.worldborder.damage.buffer.failed", + "english_translation": "Nothing changed. The world border damage buffer is already that distance" + }, + { + "key": "block.minecraft.white_candle_cake", + "english_translation": "Cake with White Candle" + }, + { + "key": "block.minecraft.dead_bubble_coral", + "english_translation": "Dead Bubble Coral" + }, + { + "key": "block.minecraft.cobblestone_stairs", + "english_translation": "Cobblestone Stairs" + }, + { + "key": "gui.abuseReport.reason.imminent_harm", + "english_translation": "Imminent harm - Threat to harm others" + }, + { + "key": "mco.invites.nopending", + "english_translation": "No pending invites!" + }, + { + "key": "subtitles.entity.parrot.imitate.husk", + "english_translation": "Parrot groans" + }, + { + "key": "stat.minecraft.play_time", + "english_translation": "Time Played" + }, + { + "key": "block.minecraft.banner.curly_border.red", + "english_translation": "Red Bordure Indented" + }, + { + "key": "block.minecraft.calcite", + "english_translation": "Calcite" + }, + { + "key": "subtitles.entity.skeleton.hurt", + "english_translation": "Skeleton hurts" + }, + { + "key": "block.minecraft.cyan_concrete_powder", + "english_translation": "Cyan Concrete Powder" + }, + { + "key": "commands.spawnpoint.success.single", + "english_translation": "Set spawn point to %s, %s, %s [%s] in %s for %s" + }, + { + "key": "block.minecraft.gray_bed", + "english_translation": "Gray Bed" + }, + { + "key": "argument.entity.invalid", + "english_translation": "Invalid name or UUID" + }, + { + "key": "block.minecraft.grass", + "english_translation": "Grass" + }, + { + "key": "mirror.left_right", + "english_translation": "← →" + }, + { + "key": "subtitles.item.spyglass.use", + "english_translation": "Spyglass expands" + }, + { + "key": "createWorld.customize.presets.select", + "english_translation": "Use Preset" + }, + { + "key": "commands.fillbiome.toobig", + "english_translation": "Too many blocks in the specified volume (maximum %s, specified %s)" + }, + { + "key": "createWorld.customize.custom.useMansions", + "english_translation": "Woodland Mansions" + }, + { + "key": "commands.advancement.revoke.one.to.one.success", + "english_translation": "Revoked the advancement %s from %s" + }, + { + "key": "selectWorld.recreate.customized.text", + "english_translation": "Customized worlds are no longer supported in this version of Minecraft. We can try to recreate it with the same seed and properties, but any terrain customizations will be lost. We're sorry for the inconvenience!" + }, + { + "key": "block.minecraft.jungle_door", + "english_translation": "Jungle Door" + }, + { + "key": "death.attack.freeze.player", + "english_translation": "%1$s was frozen to death by %2$s" + }, + { + "key": "entity.minecraft.drowned", + "english_translation": "Drowned" + }, + { + "key": "entity.minecraft.pufferfish", + "english_translation": "Pufferfish" + }, + { + "key": "block.minecraft.banner.globe.red", + "english_translation": "Red Globe" + }, + { + "key": "item.minecraft.dried_kelp", + "english_translation": "Dried Kelp" + }, + { + "key": "subtitles.entity.camel.step", + "english_translation": "Camel steps" + }, + { + "key": "block.minecraft.basalt", + "english_translation": "Basalt" + }, + { + "key": "item.minecraft.diamond_chestplate", + "english_translation": "Diamond Chestplate" + }, + { + "key": "credits_and_attribution.button.licenses", + "english_translation": "Licenses" + }, + { + "key": "selectWorld.resultFolder", + "english_translation": "Will be saved in:" + }, + { + "key": "block.minecraft.creeper_head", + "english_translation": "Creeper Head" + }, + { + "key": "commands.advancement.revoke.criterion.to.one.success", + "english_translation": "Revoked criterion '%s' of advancement %s from %s" + }, + { + "key": "pack.source.server", + "english_translation": "server" + }, + { + "key": "block.minecraft.dark_prismarine", + "english_translation": "Dark Prismarine" + }, + { + "key": "subtitles.item.armor.equip_turtle", + "english_translation": "Turtle Shell thunks" + }, + { + "key": "stat.minecraft.minecart_one_cm", + "english_translation": "Distance by Minecart" + }, + { + "key": "selectWorld.edit.backupSize", + "english_translation": "size: %s MB" + }, + { + "key": "subtitles.entity.parrot.imitate.phantom", + "english_translation": "Parrot screeches" + }, + { + "key": "subtitles.entity.dolphin.splash", + "english_translation": "Dolphin splashes" + }, + { + "key": "item.minecraft.bamboo_raft", + "english_translation": "Bamboo Raft" + }, + { + "key": "item.minecraft.firework_star.brown", + "english_translation": "Brown" + }, + { + "key": "item.minecraft.emerald", + "english_translation": "Emerald" + }, + { + "key": "subtitles.entity.salmon.hurt", + "english_translation": "Salmon hurts" + }, + { + "key": "tutorial.punch_tree.description", + "english_translation": "Hold down %s" + }, + { + "key": "commands.title.reset.multiple", + "english_translation": "Reset title options for %s players" + }, + { + "key": "pack.source.local", + "english_translation": "local" + }, + { + "key": "subtitles.entity.evoker.death", + "english_translation": "Evoker dies" + }, + { + "key": "item.modifiers.feet", + "english_translation": "When on Feet:" + }, + { + "key": "subtitles.entity.horse.saddle", + "english_translation": "Saddle equips" + }, + { + "key": "subtitles.entity.wither.ambient", + "english_translation": "Wither angers" + }, + { + "key": "mco.backup.entry.uploaded", + "english_translation": "Uploaded" + }, + { + "key": "entity.minecraft.zombified_piglin", + "english_translation": "Zombified Piglin" + }, + { + "key": "chat.disabled.profile.moreInfo", + "english_translation": "Chat not allowed by account settings. Cannot send or view messages." + }, + { + "key": "stat.minecraft.play_noteblock", + "english_translation": "Note Blocks Played" + }, + { + "key": "advancements.husbandry.make_a_sign_glow.description", + "english_translation": "Make the text of any kind of sign glow" + }, + { + "key": "block.minecraft.cherry_fence", + "english_translation": "Cherry Fence" + }, + { + "key": "subtitles.entity.arrow.hit_player", + "english_translation": "Player hit" + }, + { + "key": "disconnect.lost", + "english_translation": "Connection Lost" + }, + { + "key": "advMode.mode.autoexec.bat", + "english_translation": "Always Active" + }, + { + "key": "block.minecraft.copper_block", + "english_translation": "Block of Copper" + }, + { + "key": "block.minecraft.lime_shulker_box", + "english_translation": "Lime Shulker Box" + }, + { + "key": "gui.socialInteractions.status_hidden", + "english_translation": "Hidden" + }, + { + "key": "commands.spreadplayers.failed.teams", + "english_translation": "Could not spread %s team(s) around %s, %s (too many entities for space - try using spread of at most %s)" + }, + { + "key": "pack.incompatible.old", + "english_translation": "(Made for an older version of Minecraft)" + }, + { + "key": "block.minecraft.acacia_wood", + "english_translation": "Acacia Wood" + }, + { + "key": "gamerule.doTileDrops.description", + "english_translation": "Controls resource drops from blocks, including experience orbs." + }, + { + "key": "block.minecraft.potted_azalea_bush", + "english_translation": "Potted Azalea" + }, + { + "key": "block.minecraft.banner.circle.orange", + "english_translation": "Orange Roundel" + }, + { + "key": "block.minecraft.gravel", + "english_translation": "Gravel" + }, + { + "key": "block.minecraft.bubble_coral_wall_fan", + "english_translation": "Bubble Coral Wall Fan" + }, + { + "key": "subtitles.entity.minecart.riding", + "english_translation": "Minecart rolls" + }, + { + "key": "block.minecraft.banner.mojang.gray", + "english_translation": "Gray Thing" + }, + { + "key": "death.attack.genericKill", + "english_translation": "%1$s was killed" + }, + { + "key": "block.minecraft.light_blue_terracotta", + "english_translation": "Light Blue Terracotta" + }, + { + "key": "commands.team.remove.success", + "english_translation": "Removed team %s" + }, + { + "key": "key.togglePerspective", + "english_translation": "Toggle Perspective" + }, + { + "key": "subtitles.entity.enderman.scream", + "english_translation": "Enderman screams" + }, + { + "key": "item.minecraft.rabbit_stew", + "english_translation": "Rabbit Stew" + }, + { + "key": "item.minecraft.netherite_sword", + "english_translation": "Netherite Sword" + }, + { + "key": "biome.minecraft.ice_spikes", + "english_translation": "Ice Spikes" + }, + { + "key": "options.hideMatchedNames.tooltip", + "english_translation": "3rd-party Servers may send chat messages in non-standard formats.\nWith this option on, hidden players will be matched based on chat sender names." + }, + { + "key": "mco.client.incompatible.msg.line1", + "english_translation": "Your client is not compatible with Realms." + }, + { + "key": "block.minecraft.pink_concrete", + "english_translation": "Pink Concrete" + }, + { + "key": "item.minecraft.chainmail_chestplate", + "english_translation": "Chainmail Chestplate" + }, + { + "key": "mco.client.incompatible.msg.line3", + "english_translation": "Realms is not compatible with snapshot versions." + }, + { + "key": "mco.client.incompatible.msg.line2", + "english_translation": "Please use the most recent version of Minecraft." + }, + { + "key": "commands.tag.remove.failed", + "english_translation": "Target does not have this tag" + }, + { + "key": "deathScreen.titleScreen", + "english_translation": "Title Screen" + }, + { + "key": "item.minecraft.lingering_potion.effect.levitation", + "english_translation": "Lingering Potion of Levitation" + }, + { + "key": "item.minecraft.nether_brick", + "english_translation": "Nether Brick" + }, + { + "key": "death.attack.inFire.player", + "english_translation": "%1$s walked into fire whilst fighting %2$s" + }, + { + "key": "block.minecraft.prismarine", + "english_translation": "Prismarine" + }, + { + "key": "block.minecraft.banner.half_vertical_right.gray", + "english_translation": "Gray Per Pale Inverted" + }, + { + "key": "item.minecraft.music_disc_far", + "english_translation": "Music Disc" + }, + { + "key": "structure_block.size_failure", + "english_translation": "Unable to detect structure size. Add corners with matching structure names" + }, + { + "key": "entity.minecraft.panda", + "english_translation": "Panda" + }, + { + "key": "narration.button", + "english_translation": "Button: %s" + }, + { + "key": "options.difficulty.hard.info", + "english_translation": "Hostile mobs spawn and deal more damage. Hunger bar depletes and drains all health." + }, + { + "key": "selectWorld.backupJoinConfirmButton", + "english_translation": "Create Backup and Load" + }, + { + "key": "multiplayer.status.quitting", + "english_translation": "Quitting" + }, + { + "key": "subtitles.entity.goat.ram_impact", + "english_translation": "Goat rams" + }, + { + "key": "subtitles.item.brush.brushing.gravel.complete", + "english_translation": "Brushing Gravel completed" + }, + { + "key": "block.minecraft.brown_stained_glass_pane", + "english_translation": "Brown Stained Glass Pane" + }, + { + "key": "advancements.adventure.avoid_vibration.description", + "english_translation": "Sneak near a Sculk Sensor or Warden to prevent it from detecting you" + }, + { + "key": "entity.minecraft.potion", + "english_translation": "Potion" + }, + { + "key": "soundCategory.weather", + "english_translation": "Weather" + }, + { + "key": "block.minecraft.banner.straight_cross.red", + "english_translation": "Red Cross" + }, + { + "key": "gui.chatSelection.heading", + "english_translation": "%s %s" + }, + { + "key": "commands.attribute.value.get.success", + "english_translation": "Value of attribute %s for entity %s is %s" + }, + { + "key": "merchant.deprecated", + "english_translation": "Villagers restock up to two times per day." + }, + { + "key": "commands.title.times.multiple", + "english_translation": "Changed title display times for %s players" + }, + { + "key": "block.minecraft.banner.stripe_middle.green", + "english_translation": "Green Fess" + }, + { + "key": "subtitles.entity.creeper.primed", + "english_translation": "Creeper hisses" + }, + { + "key": "block.minecraft.light_blue_stained_glass", + "english_translation": "Light Blue Stained Glass" + }, + { + "key": "entity.minecraft.villager.toolsmith", + "english_translation": "Toolsmith" + }, + { + "key": "item.minecraft.diamond_shovel", + "english_translation": "Diamond Shovel" + }, + { + "key": "pack.copyFailure", + "english_translation": "Failed to copy packs" + }, + { + "key": "gui.socialInteractions.shown_in_chat", + "english_translation": "Chat messages from %s will be shown" + }, + { + "key": "subtitles.entity.axolotl.idle_water", + "english_translation": "Axolotl chirps" + }, + { + "key": "narrator.controls.bound", + "english_translation": "%s is bound to %s" + }, + { + "key": "block.minecraft.banner.triangles_bottom.purple", + "english_translation": "Purple Base Indented" + }, + { + "key": "subtitles.entity.sniffer.egg_hatch", + "english_translation": "Sniffer Egg hatches" + }, + { + "key": "telemetry_info.button.show_data", + "english_translation": "Open My Data" + }, + { + "key": "subtitles.entity.zombie_villager.cure", + "english_translation": "Zombie Villager snuffles" + }, + { + "key": "commands.drop.success.single_with_table", + "english_translation": "Dropped %s %s from loot table %s" + }, + { + "key": "block.minecraft.waxed_exposed_cut_copper_slab", + "english_translation": "Waxed Exposed Cut Copper Slab" + }, + { + "key": "structure_block.mode.corner", + "english_translation": "Corner" + }, + { + "key": "commands.ride.mount.failure.cant_ride_players", + "english_translation": "Players can't be ridden" + }, + { + "key": "gamerule.doInsomnia", + "english_translation": "Spawn phantoms" + }, + { + "key": "filled_map.level", + "english_translation": "(Level %s/%s)" + }, + { + "key": "commands.team.list.members.empty", + "english_translation": "There are no members on team %s" + }, + { + "key": "subtitles.entity.wolf.ambient", + "english_translation": "Wolf pants" + }, + { + "key": "mco.configure.world.buttons.close", + "english_translation": "Close realm" + }, + { + "key": "key.smoothCamera", + "english_translation": "Toggle Cinematic Camera" + }, + { + "key": "block.minecraft.banner.stripe_top.light_blue", + "english_translation": "Light Blue Chief" + }, + { + "key": "selectWorld.experimental.message", + "english_translation": "Be careful!\nThis configuration requires features that are still under development. Your world might crash, break, or not work with future updates." + }, + { + "key": "options.glintSpeed", + "english_translation": "Glint Speed" + }, + { + "key": "subtitles.entity.wither.death", + "english_translation": "Wither dies" + }, + { + "key": "argument.item.id.invalid", + "english_translation": "Unknown item '%s'" + }, + { + "key": "block.minecraft.stone_brick_stairs", + "english_translation": "Stone Brick Stairs" + }, + { + "key": "mco.backup.entry.enabledPack", + "english_translation": "Enabled Pack" + }, + { + "key": "commands.list.nameAndId", + "english_translation": "%s (%s)" + }, + { + "key": "pack.incompatible.confirm.title", + "english_translation": "Are you sure you want to load this pack?" + }, + { + "key": "subtitles.entity.frog.ambient", + "english_translation": "Frog croaks" + }, + { + "key": "argument.entity.options.advancements.description", + "english_translation": "Players with advancements" + }, + { + "key": "gamerule.freezeDamage", + "english_translation": "Deal freeze damage" + }, + { + "key": "subtitles.block.big_dripleaf.tilt_down", + "english_translation": "Dripleaf tilts down" + }, + { + "key": "block.minecraft.target", + "english_translation": "Target" + }, + { + "key": "item.minecraft.tipped_arrow.effect.water", + "english_translation": "Arrow of Splashing" + }, + { + "key": "block.minecraft.hanging_roots", + "english_translation": "Hanging Roots" + }, + { + "key": "block.minecraft.birch_sapling", + "english_translation": "Birch Sapling" + }, + { + "key": "gui.abuseReport.sent.title", + "english_translation": "Report sent" + }, + { + "key": "item.minecraft.iron_golem_spawn_egg", + "english_translation": "Iron Golem Spawn Egg" + }, + { + "key": "block.minecraft.banner.half_vertical_right.white", + "english_translation": "White Per Pale Inverted" + }, + { + "key": "commands.difficulty.query", + "english_translation": "The difficulty is %s" + }, + { + "key": "mco.time.secondsAgo", + "english_translation": "%1$s second(s) ago" + }, + { + "key": "block.minecraft.jungle_sapling", + "english_translation": "Jungle Sapling" + }, + { + "key": "block.minecraft.kelp", + "english_translation": "Kelp" + }, + { + "key": "demo.help.movementMouse", + "english_translation": "Look around using the mouse" + }, + { + "key": "commands.whitelist.remove.success", + "english_translation": "Removed %s from the whitelist" + }, + { + "key": "advancements.adventure.kill_a_mob.title", + "english_translation": "Monster Hunter" + }, + { + "key": "death.attack.hotFloor.player", + "english_translation": "%1$s walked into the danger zone due to %2$s" + }, + { + "key": "commands.spectate.success.started", + "english_translation": "Now spectating %s" + }, + { + "key": "block.minecraft.banner.stripe_right.light_blue", + "english_translation": "Light Blue Pale Sinister" + }, + { + "key": "advancements.adventure.whos_the_pillager_now.description", + "english_translation": "Give a Pillager a taste of their own medicine" + }, + { + "key": "parsing.expected", + "english_translation": "Expected '%s'" + }, + { + "key": "block.minecraft.chorus_plant", + "english_translation": "Chorus Plant" + }, + { + "key": "options.graphics.warning.version", + "english_translation": "OpenGL Version detected: [%s]" + }, + { + "key": "gui.chatReport.draft.discard", + "english_translation": "Discard" + }, + { + "key": "selectWorld.backupQuestion.downgrade", + "english_translation": "Downgrading a world is not supported" + }, + { + "key": "options.hideLightningFlashes", + "english_translation": "Hide Lightning Flashes" + }, + { + "key": "item.minecraft.cooked_rabbit", + "english_translation": "Cooked Rabbit" + }, + { + "key": "key.keyboard.right.bracket", + "english_translation": "]" + }, + { + "key": "entity.minecraft.shulker_bullet", + "english_translation": "Shulker Bullet" + }, + { + "key": "gui.recipebook.search_hint", + "english_translation": "Search..." + }, + { + "key": "mco.selectServer.expiredTrial", + "english_translation": "Your trial has ended" + }, + { + "key": "block.minecraft.banner.stripe_downleft.purple", + "english_translation": "Purple Bend Sinister" + }, + { + "key": "argument.entity.options.type.description", + "english_translation": "Entities of type" + }, + { + "key": "block.minecraft.azure_bluet", + "english_translation": "Azure Bluet" + }, + { + "key": "trim_material.minecraft.lapis", + "english_translation": "Lapis Material" + }, + { + "key": "trim_pattern.minecraft.tide", + "english_translation": "Tide Armor Trim" + }, + { + "key": "block.minecraft.banner.stripe_middle.white", + "english_translation": "White Fess" + }, + { + "key": "subtitles.entity.squid.squirt", + "english_translation": "Squid shoots ink" + }, + { + "key": "gui.abuseReport.reason.alcohol_tobacco_drugs", + "english_translation": "Drugs or alcohol" + }, + { + "key": "mco.create.world.skip", + "english_translation": "Skip" + }, + { + "key": "debug.pause_focus.help", + "english_translation": "F3 + P = Pause on lost focus" + }, + { + "key": "options.chat.opacity", + "english_translation": "Chat Text Opacity" + }, + { + "key": "subtitles.block.blastfurnace.fire_crackle", + "english_translation": "Blast Furnace crackles" + }, + { + "key": "createWorld.customize.custom.size", + "english_translation": "Spawn Size" + }, + { + "key": "block.minecraft.purpur_slab", + "english_translation": "Purpur Slab" + }, + { + "key": "item.minecraft.lingering_potion.effect.turtle_master", + "english_translation": "Lingering Potion of the Turtle Master" + }, + { + "key": "mco.selectServer.close", + "english_translation": "Close" + }, + { + "key": "block.minecraft.banner.triangle_bottom.purple", + "english_translation": "Purple Chevron" + }, + { + "key": "block.minecraft.spruce_sign", + "english_translation": "Spruce Sign" + }, + { + "key": "item.minecraft.light_blue_dye", + "english_translation": "Light Blue Dye" + }, + { + "key": "stat.minecraft.fall_one_cm", + "english_translation": "Distance Fallen" + }, + { + "key": "block.minecraft.dragon_egg", + "english_translation": "Dragon Egg" + }, + { + "key": "block.minecraft.banner.bricks.yellow", + "english_translation": "Yellow Field Masoned" + }, + { + "key": "block.minecraft.banner.gradient_up.pink", + "english_translation": "Pink Base Gradient" + }, + { + "key": "block.minecraft.banner.square_bottom_left.cyan", + "english_translation": "Cyan Base Dexter Canton" + }, + { + "key": "block.minecraft.sculk_catalyst", + "english_translation": "Sculk Catalyst" + }, + { + "key": "block.minecraft.red_wool", + "english_translation": "Red Wool" + }, + { + "key": "item.minecraft.wheat_seeds", + "english_translation": "Wheat Seeds" + }, + { + "key": "options.audioDevice.default", + "english_translation": "System Default" + }, + { + "key": "commands.bossbar.set.max.success", + "english_translation": "Custom bossbar %s has changed maximum to %s" + }, + { + "key": "block.minecraft.polished_diorite", + "english_translation": "Polished Diorite" + }, + { + "key": "parsing.int.expected", + "english_translation": "Expected integer" + }, + { + "key": "item.minecraft.hoglin_spawn_egg", + "english_translation": "Hoglin Spawn Egg" + }, + { + "key": "mco.upload.verifying", + "english_translation": "Verifying your world" + }, + { + "key": "commands.experience.query.points", + "english_translation": "%s has %s experience points" + }, + { + "key": "block.minecraft.banner.half_horizontal_bottom.blue", + "english_translation": "Blue Per Fess Inverted" + }, + { + "key": "block.minecraft.lava_cauldron", + "english_translation": "Lava Cauldron" + }, + { + "key": "options.directionalAudio", + "english_translation": "Directional Audio" + }, + { + "key": "block.minecraft.dead_horn_coral", + "english_translation": "Dead Horn Coral" + }, + { + "key": "item.minecraft.suspicious_stew", + "english_translation": "Suspicious Stew" + }, + { + "key": "subtitles.block.bell.use", + "english_translation": "Bell rings" + }, + { + "key": "block.minecraft.stone_button", + "english_translation": "Stone Button" + }, + { + "key": "advancements.husbandry.leash_all_frog_variants.title", + "english_translation": "When the Squad Hops into Town" + }, + { + "key": "selectWorld.gameMode.creative.info", + "english_translation": "Create, build, and explore without limits. You can fly, have endless materials, and can't be hurt by monsters." + }, + { + "key": "stat.minecraft.inspect_dropper", + "english_translation": "Droppers Searched" + }, + { + "key": "subtitles.entity.zoglin.step", + "english_translation": "Zoglin steps" + }, + { + "key": "block.minecraft.pink_stained_glass", + "english_translation": "Pink Stained Glass" + }, + { + "key": "death.attack.sting.player", + "english_translation": "%1$s was stung to death by %2$s" + }, + { + "key": "item.minecraft.shears", + "english_translation": "Shears" + }, + { + "key": "biome.minecraft.taiga", + "english_translation": "Taiga" + }, + { + "key": "block.minecraft.banner.triangles_bottom.light_blue", + "english_translation": "Light Blue Base Indented" + }, + { + "key": "item.minecraft.potion.effect.water_breathing", + "english_translation": "Potion of Water Breathing" + }, + { + "key": "death.attack.fallingStalactite.player", + "english_translation": "%1$s was skewered by a falling stalactite whilst fighting %2$s" + }, + { + "key": "block.minecraft.banner.stripe_middle.yellow", + "english_translation": "Yellow Fess" + }, + { + "key": "multiplayer.disconnect.banned.expiration", + "english_translation": "\nYour ban will be removed on %s" + }, + { + "key": "subtitles.entity.sniffer.egg_crack", + "english_translation": "Sniffer Egg cracks" + }, + { + "key": "trim_pattern.minecraft.vex", + "english_translation": "Vex Armor Trim" + }, + { + "key": "effect.minecraft.regeneration", + "english_translation": "Regeneration" + }, + { + "key": "mco.configure.world.commandBlocks", + "english_translation": "Command blocks" + }, + { + "key": "subtitles.entity.horse.breathe", + "english_translation": "Horse breathes" + }, + { + "key": "block.minecraft.red_candle", + "english_translation": "Red Candle" + }, + { + "key": "commands.scoreboard.players.list.entity.success", + "english_translation": "%s has %s score(s):" + }, + { + "key": "block.minecraft.blue_concrete_powder", + "english_translation": "Blue Concrete Powder" + }, + { + "key": "mco.configure.world.subscription.month", + "english_translation": "month" + }, + { + "key": "multiplayer.player.left", + "english_translation": "%s left the game" + }, + { + "key": "createWorld.customize.custom.useMonuments", + "english_translation": "Ocean Monuments" + }, + { + "key": "mco.configure.world.subscription.title", + "english_translation": "Your subscription" + }, + { + "key": "block.minecraft.banner.square_top_left.light_blue", + "english_translation": "Light Blue Chief Dexter Canton" + }, + { + "key": "commands.team.option.friendlyfire.disabled", + "english_translation": "Disabled friendly fire for team %s" + }, + { + "key": "block.minecraft.crimson_door", + "english_translation": "Crimson Door" + }, + { + "key": "block.minecraft.granite_stairs", + "english_translation": "Granite Stairs" + }, + { + "key": "block.minecraft.banner.globe.purple", + "english_translation": "Purple Globe" + }, + { + "key": "subtitles.entity.phantom.ambient", + "english_translation": "Phantom screeches" + }, + { + "key": "block.minecraft.bed.too_far_away", + "english_translation": "You may not rest now; the bed is too far away" + }, + { + "key": "trim_pattern.minecraft.ward", + "english_translation": "Ward Armor Trim" + }, + { + "key": "gui.chatSelection.join", + "english_translation": "%s joined the chat" + }, + { + "key": "block.minecraft.banner.stripe_right.gray", + "english_translation": "Gray Pale Sinister" + }, + { + "key": "commands.place.template.success", + "english_translation": "Loaded template \"%s\" at %s, %s, %s" + }, + { + "key": "block.minecraft.banner.piglin.purple", + "english_translation": "Purple Snout" + }, + { + "key": "gui.narrate.button", + "english_translation": "%s button" + }, + { + "key": "block.minecraft.banner.diagonal_left.light_blue", + "english_translation": "Light Blue Per Bend Sinister" + }, + { + "key": "options.notifications.display_time.tooltip", + "english_translation": "Affects the length of time that all notifications stay visible on the screen." + }, + { + "key": "block.minecraft.bamboo_sapling", + "english_translation": "Bamboo Shoot" + }, + { + "key": "advancements.nether.get_wither_skull.title", + "english_translation": "Spooky Scary Skeleton" + }, + { + "key": "block.minecraft.birch_pressure_plate", + "english_translation": "Birch Pressure Plate" + }, + { + "key": "mco.download.failed", + "english_translation": "Download failed" + }, + { + "key": "mco.reset.world.generate", + "english_translation": "New world" + }, + { + "key": "selectWorld.gameMode.creative", + "english_translation": "Creative" + }, + { + "key": "advancements.husbandry.tactical_fishing.description", + "english_translation": "Catch a Fish... without a Fishing Rod!" + }, + { + "key": "block.minecraft.banner.straight_cross.gray", + "english_translation": "Gray Cross" + }, + { + "key": "color.minecraft.orange", + "english_translation": "Orange" + }, + { + "key": "commands.op.success", + "english_translation": "Made %s a server operator" + }, + { + "key": "gui.chatSelection.title", + "english_translation": "Select Chat Messages to Report" + }, + { + "key": "block.minecraft.banner.half_vertical.red", + "english_translation": "Red Per Pale" + }, + { + "key": "parsing.float.invalid", + "english_translation": "Invalid float '%s'" + }, + { + "key": "advMode.allPlayers", + "english_translation": "Use \"@a\" to target all players" + }, + { + "key": "block.minecraft.banner.stripe_right.orange", + "english_translation": "Orange Pale Sinister" + }, + { + "key": "block.minecraft.cherry_sapling", + "english_translation": "Cherry Sapling" + }, + { + "key": "subtitles.entity.ender_dragon.ambient", + "english_translation": "Dragon roars" + }, + { + "key": "block.minecraft.glowstone", + "english_translation": "Glowstone" + }, + { + "key": "mco.download.confirmation.line1", + "english_translation": "The world you are going to download is larger than %s" + }, + { + "key": "mco.download.confirmation.line2", + "english_translation": "You won't be able to upload this world to your realm again" + }, + { + "key": "block.minecraft.potted_cornflower", + "english_translation": "Potted Cornflower" + }, + { + "key": "subtitles.item.axe.wax_off", + "english_translation": "Wax off" + }, + { + "key": "multiplayer.lan.server_found", + "english_translation": "New server found: %s" + }, + { + "key": "subtitles.entity.spider.hurt", + "english_translation": "Spider hurts" + }, + { + "key": "entity.minecraft.marker", + "english_translation": "Marker" + }, + { + "key": "subtitles.entity.piglin_brute.death", + "english_translation": "Piglin Brute dies" + }, + { + "key": "advancements.nether.use_lodestone.title", + "english_translation": "Country Lode, Take Me Home" + }, + { + "key": "block.minecraft.oxeye_daisy", + "english_translation": "Oxeye Daisy" + }, + { + "key": "subtitles.entity.player.attack.strong", + "english_translation": "Strong attack" + }, + { + "key": "subtitles.entity.witch.ambient", + "english_translation": "Witch giggles" + }, + { + "key": "subtitles.block.pointed_dripstone.drip_lava_into_cauldron", + "english_translation": "Lava drips into Cauldron" + }, + { + "key": "block.minecraft.granite", + "english_translation": "Granite" + }, + { + "key": "book.invalid.tag", + "english_translation": "* Invalid book tag *" + }, + { + "key": "block.minecraft.sculk_shrieker", + "english_translation": "Sculk Shrieker" + }, + { + "key": "commands.deop.failed", + "english_translation": "Nothing changed. The player is not an operator" + }, + { + "key": "block.minecraft.banner.circle.gray", + "english_translation": "Gray Roundel" + }, + { + "key": "block.minecraft.banner.diagonal_up_left.gray", + "english_translation": "Gray Per Bend Inverted" + }, + { + "key": "argument.block.property.unknown", + "english_translation": "Block %s does not have property '%s'" + }, + { + "key": "key.keyboard.apostrophe", + "english_translation": "'" + }, + { + "key": "stat.minecraft.deaths", + "english_translation": "Number of Deaths" + }, + { + "key": "block.minecraft.banner.triangle_top.magenta", + "english_translation": "Magenta Inverted Chevron" + }, + { + "key": "narrator.screen.title", + "english_translation": "Title Screen" + }, + { + "key": "item.minecraft.arms_up_pottery_sherd", + "english_translation": "Arms Up Pottery Sherd" + }, + { + "key": "subtitles.entity.lightning_bolt.impact", + "english_translation": "Lightning strikes" + }, + { + "key": "subtitles.entity.sheep.death", + "english_translation": "Sheep dies" + }, + { + "key": "commands.recipe.take.success.multiple", + "english_translation": "Took %s recipes from %s players" + }, + { + "key": "subtitles.ui.stonecutter.take_result", + "english_translation": "Stonecutter used" + }, + { + "key": "block.minecraft.pink_wool", + "english_translation": "Pink Wool" + }, + { + "key": "multiplayer.status.ping.narration", + "english_translation": "Ping %s milliseconds" + }, + { + "key": "tutorial.move.title", + "english_translation": "Move with %s, %s, %s and %s" + }, + { + "key": "block.minecraft.banner.skull.cyan", + "english_translation": "Cyan Skull Charge" + }, + { + "key": "structure_block.hover.corner", + "english_translation": "Corner: %s" + }, + { + "key": "advancements.husbandry.root.title", + "english_translation": "Husbandry" + }, + { + "key": "item.minecraft.plenty_pottery_shard", + "english_translation": "Plenty Pottery Shard" + }, + { + "key": "painting.minecraft.alban.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "block.minecraft.green_stained_glass_pane", + "english_translation": "Green Stained Glass Pane" + }, + { + "key": "item.minecraft.wooden_axe", + "english_translation": "Wooden Axe" + }, + { + "key": "block.minecraft.cobblestone_wall", + "english_translation": "Cobblestone Wall" + }, + { + "key": "optimizeWorld.title", + "english_translation": "Optimizing World '%s'" + }, + { + "key": "subtitles.block.campfire.crackle", + "english_translation": "Campfire crackles" + }, + { + "key": "item.minecraft.cyan_dye", + "english_translation": "Cyan Dye" + }, + { + "key": "commands.gamerule.set", + "english_translation": "Gamerule %s is now set to: %s" + }, + { + "key": "block.minecraft.banner.stripe_bottom.orange", + "english_translation": "Orange Base" + }, + { + "key": "title.singleplayer", + "english_translation": "Singleplayer" + }, + { + "key": "block.minecraft.banner.diagonal_right.black", + "english_translation": "Black Per Bend" + }, + { + "key": "block.minecraft.banner.stripe_downleft.white", + "english_translation": "White Bend Sinister" + }, + { + "key": "subtitles.entity.vex.ambient", + "english_translation": "Vex vexes" + }, + { + "key": "block.minecraft.tall_grass", + "english_translation": "Tall Grass" + }, + { + "key": "commands.advancement.grant.criterion.to.many.success", + "english_translation": "Granted criterion '%s' of advancement %s to %s players" + }, + { + "key": "advancements.adventure.adventuring_time.description", + "english_translation": "Discover every biome" + }, + { + "key": "block.minecraft.potted_dark_oak_sapling", + "english_translation": "Potted Dark Oak Sapling" + }, + { + "key": "entity.minecraft.villager.fisherman", + "english_translation": "Fisherman" + }, + { + "key": "mco.configure.world.buttons.players", + "english_translation": "Players" + }, + { + "key": "mco.brokenworld.message.line2", + "english_translation": "You can also choose to download the world to singleplayer." + }, + { + "key": "mco.brokenworld.message.line1", + "english_translation": "Please reset or select another world." + }, + { + "key": "advancements.adventure.spyglass_at_ghast.title", + "english_translation": "Is It a Balloon?" + }, + { + "key": "item.minecraft.sweet_berries", + "english_translation": "Sweet Berries" + }, + { + "key": "effect.minecraft.water_breathing", + "english_translation": "Water Breathing" + }, + { + "key": "item.minecraft.glowstone_dust", + "english_translation": "Glowstone Dust" + }, + { + "key": "trim_material.minecraft.netherite", + "english_translation": "Netherite Material" + }, + { + "key": "item.minecraft.flint_and_steel", + "english_translation": "Flint and Steel" + }, + { + "key": "item.minecraft.cherry_chest_boat", + "english_translation": "Cherry Boat with Chest" + }, + { + "key": "resourcePack.high_contrast.name", + "english_translation": "High Contrast" + }, + { + "key": "block.minecraft.banner.half_horizontal.cyan", + "english_translation": "Cyan Per Fess" + }, + { + "key": "generator.customized", + "english_translation": "Old Customized" + }, + { + "key": "item.minecraft.firework_star.yellow", + "english_translation": "Yellow" + }, + { + "key": "commands.recipe.give.failed", + "english_translation": "No new recipes were learned" + }, + { + "key": "stat_type.minecraft.used", + "english_translation": "Times Used" + }, + { + "key": "block.minecraft.banner.square_top_left.brown", + "english_translation": "Brown Chief Dexter Canton" + }, + { + "key": "block.minecraft.red_concrete_powder", + "english_translation": "Red Concrete Powder" + }, + { + "key": "item.minecraft.firework_star.blue", + "english_translation": "Blue" + }, + { + "key": "key.attack", + "english_translation": "Attack/Destroy" + }, + { + "key": "block.minecraft.banner.stripe_top.lime", + "english_translation": "Lime Chief" + }, + { + "key": "block.minecraft.banner.skull.light_gray", + "english_translation": "Light Gray Skull Charge" + }, + { + "key": "block.minecraft.spore_blossom", + "english_translation": "Spore Blossom" + }, + { + "key": "entity.minecraft.zombie", + "english_translation": "Zombie" + }, + { + "key": "block.minecraft.birch_hanging_sign", + "english_translation": "Birch Hanging Sign" + }, + { + "key": "controls.keybinds.duplicateKeybinds", + "english_translation": "This key is also used for:\n%s" + }, + { + "key": "block.minecraft.detector_rail", + "english_translation": "Detector Rail" + }, + { + "key": "block.minecraft.damaged_anvil", + "english_translation": "Damaged Anvil" + }, + { + "key": "block.minecraft.green_glazed_terracotta", + "english_translation": "Green Glazed Terracotta" + }, + { + "key": "gui.banned.reason.drugs", + "english_translation": "References to illegal drugs" + }, + { + "key": "item.minecraft.music_disc_ward.desc", + "english_translation": "C418 - ward" + }, + { + "key": "subtitles.entity.mule.angry", + "english_translation": "Mule neighs" + }, + { + "key": "block.minecraft.light_gray_glazed_terracotta", + "english_translation": "Light Gray Glazed Terracotta" + }, + { + "key": "commands.forceload.added.multiple", + "english_translation": "Marked %s chunks in %s from %s to %s to be force loaded" + }, + { + "key": "pack.nameAndSource", + "english_translation": "%s (%s)" + }, + { + "key": "subtitles.entity.ender_dragon.hurt", + "english_translation": "Dragon hurts" + }, + { + "key": "block.minecraft.banner.square_bottom_left.orange", + "english_translation": "Orange Base Dexter Canton" + }, + { + "key": "selectWorld.gameRules", + "english_translation": "Game Rules" + }, + { + "key": "options.fovEffectScale", + "english_translation": "FOV Effects" + }, + { + "key": "options.chat.title", + "english_translation": "Chat Settings..." + }, + { + "key": "subtitles.entity.ender_dragon.shoot", + "english_translation": "Dragon shoots" + }, + { + "key": "death.fell.finish", + "english_translation": "%1$s fell too far and was finished by %2$s" + }, + { + "key": "pack.incompatible.new", + "english_translation": "(Made for a newer version of Minecraft)" + }, + { + "key": "subtitles.entity.zoglin.hurt", + "english_translation": "Zoglin hurts" + }, + { + "key": "block.minecraft.stripped_spruce_log", + "english_translation": "Stripped Spruce Log" + }, + { + "key": "block.minecraft.banner.triangles_top.cyan", + "english_translation": "Cyan Chief Indented" + }, + { + "key": "pack.source.world", + "english_translation": "world" + }, + { + "key": "block.minecraft.lime_concrete", + "english_translation": "Lime Concrete" + }, + { + "key": "subtitles.entity.turtle.lay_egg", + "english_translation": "Turtle lays egg" + }, + { + "key": "biome.minecraft.warm_ocean", + "english_translation": "Warm Ocean" + }, + { + "key": "gamerule.snowAccumulationHeight.description", + "english_translation": "When it snows, layers of snow form on the ground up to at most this number of layers." + }, + { + "key": "subtitles.entity.warden.nearby_closest", + "english_translation": "Warden draws close" + }, + { + "key": "block.minecraft.waxed_weathered_cut_copper", + "english_translation": "Waxed Weathered Cut Copper" + }, + { + "key": "subtitles.chiseled_bookshelf.insert", + "english_translation": "Book placed" + }, + { + "key": "item.minecraft.shield.purple", + "english_translation": "Purple Shield" + }, + { + "key": "block.minecraft.deepslate_iron_ore", + "english_translation": "Deepslate Iron Ore" + }, + { + "key": "death.attack.badRespawnPoint.message", + "english_translation": "%1$s was killed by %2$s" + }, + { + "key": "key.keyboard.keypad.0", + "english_translation": "Keypad 0" + }, + { + "key": "key.keyboard.keypad.1", + "english_translation": "Keypad 1" + }, + { + "key": "container.upgrade.missing_template_tooltip", + "english_translation": "Add Smithing Template" + }, + { + "key": "block.minecraft.banner.diagonal_right.green", + "english_translation": "Green Per Bend" + }, + { + "key": "key.keyboard.keypad.2", + "english_translation": "Keypad 2" + }, + { + "key": "subtitles.entity.donkey.hurt", + "english_translation": "Donkey hurts" + }, + { + "key": "key.keyboard.keypad.3", + "english_translation": "Keypad 3" + }, + { + "key": "key.keyboard.keypad.4", + "english_translation": "Keypad 4" + }, + { + "key": "key.keyboard.keypad.5", + "english_translation": "Keypad 5" + }, + { + "key": "key.keyboard.keypad.6", + "english_translation": "Keypad 6" + }, + { + "key": "key.keyboard.keypad.7", + "english_translation": "Keypad 7" + }, + { + "key": "key.keyboard.keypad.8", + "english_translation": "Keypad 8" + }, + { + "key": "stat.minecraft.target_hit", + "english_translation": "Targets Hit" + }, + { + "key": "key.keyboard.keypad.9", + "english_translation": "Keypad 9" + }, + { + "key": "commands.data.modify.expected_object", + "english_translation": "Expected object, got: %s" + }, + { + "key": "stat.minecraft.interact_with_anvil", + "english_translation": "Interactions with Anvil" + }, + { + "key": "options.graphics.warning.title", + "english_translation": "Graphics Device Unsupported" + }, + { + "key": "block.minecraft.banner.stripe_top.blue", + "english_translation": "Blue Chief" + }, + { + "key": "argument.entity.options.level.negative", + "english_translation": "Level shouldn't be negative" + }, + { + "key": "block.minecraft.spruce_log", + "english_translation": "Spruce Log" + }, + { + "key": "item.minecraft.ink_sac", + "english_translation": "Ink Sac" + }, + { + "key": "subtitles.entity.salmon.death", + "english_translation": "Salmon dies" + }, + { + "key": "item.minecraft.gold_ingot", + "english_translation": "Gold Ingot" + }, + { + "key": "stat.minecraft.tune_noteblock", + "english_translation": "Note Blocks Tuned" + }, + { + "key": "subtitles.entity.wither_skeleton.death", + "english_translation": "Wither Skeleton dies" + }, + { + "key": "block.minecraft.respawn_anchor", + "english_translation": "Respawn Anchor" + }, + { + "key": "item.minecraft.piglin_brute_spawn_egg", + "english_translation": "Piglin Brute Spawn Egg" + }, + { + "key": "commands.title.cleared.single", + "english_translation": "Cleared titles for %s" + }, + { + "key": "advancements.nether.ride_strider.title", + "english_translation": "This Boat Has Legs" + }, + { + "key": "commands.forceload.list.single", + "english_translation": "A force loaded chunk was found in %s at: %s" + }, + { + "key": "block.minecraft.brain_coral", + "english_translation": "Brain Coral" + }, + { + "key": "argument.nbt.array.invalid", + "english_translation": "Invalid array type '%s'" + }, + { + "key": "options.graphics.warning.renderer", + "english_translation": "Renderer detected: [%s]" + }, + { + "key": "block.minecraft.banner.half_horizontal.magenta", + "english_translation": "Magenta Per Fess" + }, + { + "key": "item.minecraft.cooked_mutton", + "english_translation": "Cooked Mutton" + }, + { + "key": "selectWorld.world", + "english_translation": "World" + }, + { + "key": "block.minecraft.banner.square_bottom_left.brown", + "english_translation": "Brown Base Dexter Canton" + }, + { + "key": "gui.acknowledge", + "english_translation": "Acknowledge" + }, + { + "key": "block.minecraft.banner.rhombus.magenta", + "english_translation": "Magenta Lozenge" + }, + { + "key": "block.minecraft.banner.stripe_middle.pink", + "english_translation": "Pink Fess" + }, + { + "key": "createWorld.customize.custom.count", + "english_translation": "Spawn Tries" + }, + { + "key": "subtitles.entity.parrot.imitate.endermite", + "english_translation": "Parrot scuttles" + }, + { + "key": "block.minecraft.banner.stripe_center.lime", + "english_translation": "Lime Pale" + }, + { + "key": "block.minecraft.dead_bubble_coral_fan", + "english_translation": "Dead Bubble Coral Fan" + }, + { + "key": "selectWorld.edit.backupFolder", + "english_translation": "Open Backups Folder" + }, + { + "key": "subtitles.item.trident.throw", + "english_translation": "Trident clangs" + }, + { + "key": "death.attack.fireworks.player", + "english_translation": "%1$s went off with a bang whilst fighting %2$s" + }, + { + "key": "subtitles.entity.parrot.imitate.pillager", + "english_translation": "Parrot murmurs" + }, + { + "key": "gui.abuseReport.send.json_error", + "english_translation": "Encountered malformed payload while sending your report." + }, + { + "key": "item.minecraft.shelter_pottery_shard", + "english_translation": "Shelter Pottery Shard" + }, + { + "key": "block.minecraft.beacon.secondary", + "english_translation": "Secondary Power" + }, + { + "key": "block.minecraft.water_cauldron", + "english_translation": "Water Cauldron" + }, + { + "key": "item.minecraft.splash_potion.effect.strength", + "english_translation": "Splash Potion of Strength" + }, + { + "key": "effect.minecraft.night_vision", + "english_translation": "Night Vision" + }, + { + "key": "subtitles.entity.fox.death", + "english_translation": "Fox dies" + }, + { + "key": "container.enderchest", + "english_translation": "Ender Chest" + }, + { + "key": "item.minecraft.purple_dye", + "english_translation": "Purple Dye" + }, + { + "key": "biome.minecraft.birch_forest", + "english_translation": "Birch Forest" + }, + { + "key": "block.minecraft.banner.gradient.white", + "english_translation": "White Gradient" + }, + { + "key": "item.minecraft.pitcher_plant", + "english_translation": "Pitcher Plant" + }, + { + "key": "fabric-registry-sync-v0.unknown-remote.title.plural", + "english_translation": "Received %s registry entries that are unknown to this client.\n" + }, + { + "key": "subtitles.block.grindstone.use", + "english_translation": "Grindstone used" + }, + { + "key": "biome.minecraft.forest", + "english_translation": "Forest" + }, + { + "key": "gui.abuseReport.reason.self_harm_or_suicide.description", + "english_translation": "Someone is threatening to harm themselves in real life or talking about harming themselves in real life." + }, + { + "key": "commands.scoreboard.objectives.modify.displayname", + "english_translation": "Changed the display name of %s to %s" + }, + { + "key": "block.minecraft.water", + "english_translation": "Water" + }, + { + "key": "subtitles.entity.boat.paddle_water", + "english_translation": "Rowing" + }, + { + "key": "gui.banned.reason.harassment_or_bullying", + "english_translation": "Abusive language used in a directed, harmful manner" + }, + { + "key": "selectWorld.deleteWarning", + "english_translation": "'%s' will be lost forever! (A long time!)" + }, + { + "key": "block.minecraft.green_carpet", + "english_translation": "Green Carpet" + }, + { + "key": "team.collision.always", + "english_translation": "Always" + }, + { + "key": "subtitles.entity.guardian.ambient_land", + "english_translation": "Guardian flaps" + }, + { + "key": "mco.configure.world.delete.button", + "english_translation": "Delete realm" + }, + { + "key": "telemetry.property.launcher_name.title", + "english_translation": "Launcher Name" + }, + { + "key": "gamerule.sendCommandFeedback", + "english_translation": "Send command feedback" + }, + { + "key": "block.minecraft.banner.triangle_top.purple", + "english_translation": "Purple Inverted Chevron" + }, + { + "key": "item.minecraft.lingering_potion.effect.slowness", + "english_translation": "Lingering Potion of Slowness" + }, + { + "key": "mco.backup.unknown", + "english_translation": "UNKNOWN" + }, + { + "key": "multiplayer.disconnect.invalid_player_movement", + "english_translation": "Invalid move player packet received" + }, + { + "key": "advancements.end.respawn_dragon.description", + "english_translation": "Respawn the Ender Dragon" + }, + { + "key": "block.minecraft.banner.stripe_bottom.magenta", + "english_translation": "Magenta Base" + }, + { + "key": "subtitles.block.smithing_table.use", + "english_translation": "Smithing Table used" + }, + { + "key": "block.minecraft.sculk_vein", + "english_translation": "Sculk Vein" + }, + { + "key": "command.unknown.command", + "english_translation": "Unknown or incomplete command, see below for error" + }, + { + "key": "advMode.previousOutput", + "english_translation": "Previous Output" + }, + { + "key": "stat.minecraft.enchant_item", + "english_translation": "Items Enchanted" + }, + { + "key": "block.minecraft.dark_oak_leaves", + "english_translation": "Dark Oak Leaves" + }, + { + "key": "key.keyboard.unknown", + "english_translation": "Not Bound" + }, + { + "key": "item.minecraft.rabbit_spawn_egg", + "english_translation": "Rabbit Spawn Egg" + }, + { + "key": "block.minecraft.green_stained_glass", + "english_translation": "Green Stained Glass" + }, + { + "key": "mirror.front_back", + "english_translation": "↑ ↓" + }, + { + "key": "block.minecraft.command_block", + "english_translation": "Command Block" + }, + { + "key": "block.minecraft.banner.stripe_center.blue", + "english_translation": "Blue Pale" + }, + { + "key": "advancements.nether.obtain_crying_obsidian.title", + "english_translation": "Who is Cutting Onions?" + }, + { + "key": "mco.minigame.world.slot.screen.title", + "english_translation": "Switching world..." + }, + { + "key": "disconnect.overflow", + "english_translation": "Buffer overflow" + }, + { + "key": "options.directionalAudio.on.tooltip", + "english_translation": "Uses HRTF-based directional audio to improve the simulation of 3D sound. Requires HRTF compatible audio hardware, and is best experienced with headphones." + }, + { + "key": "block.minecraft.bed.no_sleep", + "english_translation": "You can sleep only at night or during thunderstorms" + }, + { + "key": "commands.drop.success.multiple_with_table", + "english_translation": "Dropped %s items from loot table %s" + }, + { + "key": "commands.worldborder.set.failed.small", + "english_translation": "World border cannot be smaller than 1 block wide" + }, + { + "key": "item.minecraft.firework_star.lime", + "english_translation": "Lime" + }, + { + "key": "telemetry.event.game_load_times.description", + "english_translation": "This event can help us figure out where startup performance improvements are needed by measuring the execution times of the startup phases." + }, + { + "key": "subtitles.block.enchantment_table.use", + "english_translation": "Enchanting Table used" + }, + { + "key": "subtitles.block.sculk.charge", + "english_translation": "Sculk bubbles" + }, + { + "key": "subtitles.entity.glow_item_frame.add_item", + "english_translation": "Glow Item Frame fills" + }, + { + "key": "block.minecraft.raw_iron_block", + "english_translation": "Block of Raw Iron" + }, + { + "key": "enchantment.minecraft.multishot", + "english_translation": "Multishot" + }, + { + "key": "painting.minecraft.donkey_kong.title", + "english_translation": "Kong" + }, + { + "key": "gui.abuseReport.send.service_unavailable", + "english_translation": "Unable to reach the Abuse Reporting service. Please make sure you are connected to the internet and try again." + }, + { + "key": "gamerule.reducedDebugInfo", + "english_translation": "Reduce debug info" + }, + { + "key": "key.keyboard.menu", + "english_translation": "Menu" + }, + { + "key": "advMode.notAllowed", + "english_translation": "Must be an opped player in creative mode" + }, + { + "key": "symlink_warning.title", + "english_translation": "World folder contains symbolic links" + }, + { + "key": "options.graphics.warning.message", + "english_translation": "Your graphics device is detected as unsupported for the %s graphics option.\n\nYou may ignore this and continue, however support will not be provided for your device if you choose to use %s graphics." + }, + { + "key": "options.renderClouds", + "english_translation": "Clouds" + }, + { + "key": "subtitles.entity.panda.cant_breed", + "english_translation": "Panda bleats" + }, + { + "key": "item.minecraft.chainmail_boots", + "english_translation": "Chainmail Boots" + }, + { + "key": "advancements.husbandry.obtain_sniffer_egg.title", + "english_translation": "Smells Interesting" + }, + { + "key": "createWorld.customize.custom.heightScale", + "english_translation": "Height Scale" + }, + { + "key": "structure_block.invalid_structure_name", + "english_translation": "Invalid structure name '%s'" + }, + { + "key": "block.minecraft.blue_glazed_terracotta", + "english_translation": "Blue Glazed Terracotta" + }, + { + "key": "death.attack.lightningBolt", + "english_translation": "%1$s was struck by lightning" + }, + { + "key": "item.minecraft.snort_pottery_shard", + "english_translation": "Snort Pottery Shard" + }, + { + "key": "telemetry.property.seconds_since_load.title", + "english_translation": "Time Since Load (Seconds)" + }, + { + "key": "block.minecraft.cyan_stained_glass_pane", + "english_translation": "Cyan Stained Glass Pane" + }, + { + "key": "multiplayer.texturePrompt.line1", + "english_translation": "This server recommends the use of a custom resource pack." + }, + { + "key": "multiplayer.texturePrompt.line2", + "english_translation": "Would you like to download and install it automagically?" + }, + { + "key": "addServer.hideAddress", + "english_translation": "Hide Address" + }, + { + "key": "block.minecraft.banner.cross.yellow", + "english_translation": "Yellow Saltire" + }, + { + "key": "block.minecraft.banner.triangle_bottom.gray", + "english_translation": "Gray Chevron" + }, + { + "key": "biome.minecraft.windswept_savanna", + "english_translation": "Windswept Savanna" + }, + { + "key": "block.minecraft.banner.stripe_center.light_gray", + "english_translation": "Light Gray Pale" + }, + { + "key": "subtitles.entity.puffer_fish.sting", + "english_translation": "Pufferfish stings" + }, + { + "key": "createWorld.customize.custom.maxHeight", + "english_translation": "Max. Height" + }, + { + "key": "item.minecraft.splash_potion.effect.leaping", + "english_translation": "Splash Potion of Leaping" + }, + { + "key": "mco.minigame.world.restore", + "english_translation": "Ending minigame..." + }, + { + "key": "advancements.story.shiny_gear.title", + "english_translation": "Cover Me with Diamonds" + }, + { + "key": "structure_block.size.z", + "english_translation": "structure size z" + }, + { + "key": "structure_block.size.x", + "english_translation": "structure size x" + }, + { + "key": "structure_block.size.y", + "english_translation": "structure size y" + }, + { + "key": "entity.minecraft.glow_item_frame", + "english_translation": "Glow Item Frame" + }, + { + "key": "biome.minecraft.end_highlands", + "english_translation": "End Highlands" + }, + { + "key": "gamerule.doMobLoot.description", + "english_translation": "Controls resource drops from mobs, including experience orbs." + }, + { + "key": "mco.reset.world.title", + "english_translation": "Reset world" + }, + { + "key": "telemetry.event.world_load_times.description", + "english_translation": "It’s important for us to understand how long it takes to join a world, and how that changes over time. For example, when we add new features or do larger technical changes, we need to see what impact that had on load times." + }, + { + "key": "block.minecraft.banner.half_horizontal.red", + "english_translation": "Red Per Fess" + }, + { + "key": "key.keyboard.scroll.lock", + "english_translation": "Scroll Lock" + }, + { + "key": "block.minecraft.bamboo_fence_gate", + "english_translation": "Bamboo Fence Gate" + }, + { + "key": "entity.minecraft.wandering_trader", + "english_translation": "Wandering Trader" + }, + { + "key": "argument.entity.options.mode.invalid", + "english_translation": "Invalid or unknown game mode '%s'" + }, + { + "key": "advancements.adventure.kill_all_mobs.description", + "english_translation": "Kill one of every hostile monster" + }, + { + "key": "effect.minecraft.fire_resistance", + "english_translation": "Fire Resistance" + }, + { + "key": "block.minecraft.ominous_banner", + "english_translation": "Ominous Banner" + }, + { + "key": "block.minecraft.white_concrete_powder", + "english_translation": "White Concrete Powder" + }, + { + "key": "block.minecraft.banner.cross.pink", + "english_translation": "Pink Saltire" + }, + { + "key": "narration.edit_box", + "english_translation": "Edit box: %s" + }, + { + "key": "block.minecraft.crimson_slab", + "english_translation": "Crimson Slab" + }, + { + "key": "commands.bossbar.get.value", + "english_translation": "Custom bossbar %s has a value of %s" + }, + { + "key": "commands.tag.list.multiple.success", + "english_translation": "The %s entities have %s total tags: %s" + }, + { + "key": "selectWorld.recreate", + "english_translation": "Re-Create" + }, + { + "key": "item.minecraft.stone_pickaxe", + "english_translation": "Stone Pickaxe" + }, + { + "key": "subtitles.entity.fox.screech", + "english_translation": "Fox screeches" + }, + { + "key": "options.biomeBlendRadius.9", + "english_translation": "9x9 (Very High)" + }, + { + "key": "options.biomeBlendRadius.7", + "english_translation": "7x7 (High)" + }, + { + "key": "options.biomeBlendRadius.5", + "english_translation": "5x5 (Normal)" + }, + { + "key": "options.biomeBlendRadius.3", + "english_translation": "3x3 (Fast)" + }, + { + "key": "commands.advancement.grant.one.to.one.failure", + "english_translation": "Couldn't grant advancement %s to %s as they already have it" + }, + { + "key": "options.biomeBlendRadius.1", + "english_translation": "OFF (Fastest)" + }, + { + "key": "block.minecraft.cherry_wood", + "english_translation": "Cherry Wood" + }, + { + "key": "multiplayer.player.joined.renamed", + "english_translation": "%s (formerly known as %s) joined the game" + }, + { + "key": "effect.minecraft.slowness", + "english_translation": "Slowness" + }, + { + "key": "block.minecraft.potted_red_mushroom", + "english_translation": "Potted Red Mushroom" + }, + { + "key": "trim_material.minecraft.iron", + "english_translation": "Iron Material" + }, + { + "key": "block.minecraft.banner.border.yellow", + "english_translation": "Yellow Bordure" + }, + { + "key": "subtitles.entity.warden.listening", + "english_translation": "Warden takes notice" + }, + { + "key": "block.minecraft.banner.stripe_downright.black", + "english_translation": "Black Bend" + }, + { + "key": "block.minecraft.banner.stripe_downright.white", + "english_translation": "White Bend" + }, + { + "key": "block.minecraft.banner.gradient.green", + "english_translation": "Green Gradient" + }, + { + "key": "gamerule.commandBlockOutput", + "english_translation": "Broadcast command block output" + }, + { + "key": "selectServer.defaultName", + "english_translation": "Minecraft Server" + }, + { + "key": "gui.abuseReport.send.http_error", + "english_translation": "An unexpected HTTP error occurred while sending your report." + }, + { + "key": "block.minecraft.banner.diagonal_up_right.light_gray", + "english_translation": "Light Gray Per Bend Sinister Inverted" + }, + { + "key": "advancements.husbandry.tame_an_animal.title", + "english_translation": "Best Friends Forever" + }, + { + "key": "telemetry.event.world_loaded.description", + "english_translation": "Knowing how players play Minecraft (such as Game Mode, client or server modded, and game version) allows us to focus game updates to improve the areas that players care about most.\nThe World Loaded event is paired with the World Unloaded event to calculate how long the play session has lasted." + }, + { + "key": "options.prioritizeChunkUpdates.byPlayer", + "english_translation": "Semi Blocking" + }, + { + "key": "item.minecraft.nether_wart", + "english_translation": "Nether Wart" + }, + { + "key": "block.minecraft.banner.triangle_top.light_blue", + "english_translation": "Light Blue Inverted Chevron" + }, + { + "key": "gui.socialInteractions.tooltip.report.disabled", + "english_translation": "The reporting service is unavailable" + }, + { + "key": "block.minecraft.banner.stripe_middle.black", + "english_translation": "Black Fess" + }, + { + "key": "item.minecraft.spruce_chest_boat", + "english_translation": "Spruce Boat with Chest" + }, + { + "key": "options.biomeBlendRadius", + "english_translation": "Biome Blend" + }, + { + "key": "commands.give.failed.toomanyitems", + "english_translation": "Can't give more than %s of %s" + }, + { + "key": "subtitles.entity.parrot.imitate.ravager", + "english_translation": "Parrot grunts" + }, + { + "key": "block.minecraft.powder_snow", + "english_translation": "Powder Snow" + }, + { + "key": "options.guiScale", + "english_translation": "GUI Scale" + }, + { + "key": "compliance.playtime.greaterThan24Hours", + "english_translation": "You've been playing for greater than 24 hours" + }, + { + "key": "entity.minecraft.snowball", + "english_translation": "Snowball" + }, + { + "key": "menu.savingLevel", + "english_translation": "Saving world" + }, + { + "key": "biome.minecraft.deep_cold_ocean", + "english_translation": "Deep Cold Ocean" + }, + { + "key": "death.attack.genericKill.player", + "english_translation": "%1$s was killed whilst fighting %2$s" + }, + { + "key": "block.minecraft.orange_bed", + "english_translation": "Orange Bed" + }, + { + "key": "telemetry.event.performance_metrics.title", + "english_translation": "Performance Metrics" + }, + { + "key": "block.minecraft.jungle_stairs", + "english_translation": "Jungle Stairs" + }, + { + "key": "enchantment.minecraft.smite", + "english_translation": "Smite" + }, + { + "key": "entity.minecraft.hopper_minecart", + "english_translation": "Minecart with Hopper" + }, + { + "key": "block.minecraft.bamboo_sign", + "english_translation": "Bamboo Sign" + }, + { + "key": "block.minecraft.iron_block", + "english_translation": "Block of Iron" + }, + { + "key": "advancements.adventure.root.description", + "english_translation": "Adventure, exploration and combat" + }, + { + "key": "gui.chatReport.draft.quittotitle.title", + "english_translation": "You have a draft chat report that will be lost if you quit" + }, + { + "key": "block.minecraft.banner.cross.brown", + "english_translation": "Brown Saltire" + }, + { + "key": "instrument.minecraft.call_goat_horn", + "english_translation": "Call" + }, + { + "key": "subtitles.entity.drowned.ambient", + "english_translation": "Drowned gurgles" + }, + { + "key": "trim_pattern.minecraft.raiser", + "english_translation": "Raiser Armor Trim" + }, + { + "key": "block.minecraft.purple_concrete", + "english_translation": "Purple Concrete" + }, + { + "key": "subtitles.entity.item_frame.rotate_item", + "english_translation": "Item Frame clicks" + }, + { + "key": "item.minecraft.shield.pink", + "english_translation": "Pink Shield" + }, + { + "key": "gui.abuseReport.reason.terrorism_or_violent_extremism.description", + "english_translation": "Someone is talking about, promoting, or threatening to commit acts of terrorism or violent extremism for political, religious, ideological, or other reasons." + }, + { + "key": "subtitles.block.furnace.fire_crackle", + "english_translation": "Furnace crackles" + }, + { + "key": "stat.minecraft.interact_with_furnace", + "english_translation": "Interactions with Furnace" + }, + { + "key": "advancements.adventure.sniper_duel.description", + "english_translation": "Kill a Skeleton from at least 50 meters away" + }, + { + "key": "biome.minecraft.mushroom_fields", + "english_translation": "Mushroom Fields" + }, + { + "key": "block.minecraft.red_carpet", + "english_translation": "Red Carpet" + }, + { + "key": "key.keyboard.f8", + "english_translation": "F8" + }, + { + "key": "key.keyboard.f9", + "english_translation": "F9" + }, + { + "key": "key.keyboard.f6", + "english_translation": "F6" + }, + { + "key": "key.keyboard.f7", + "english_translation": "F7" + }, + { + "key": "subtitles.entity.wandering_trader.disappeared", + "english_translation": "Wandering Trader disappears" + }, + { + "key": "debug.inspect.help", + "english_translation": "F3 + I = Copy entity or block data to clipboard" + }, + { + "key": "key.keyboard.f1", + "english_translation": "F1" + }, + { + "key": "options.fovEffectScale.tooltip", + "english_translation": "Controls how much the field of view can change with gameplay effects." + }, + { + "key": "key.keyboard.f4", + "english_translation": "F4" + }, + { + "key": "key.keyboard.f5", + "english_translation": "F5" + }, + { + "key": "multiplayer.disconnect.invalid_vehicle_movement", + "english_translation": "Invalid move vehicle packet received" + }, + { + "key": "key.keyboard.f2", + "english_translation": "F2" + }, + { + "key": "key.keyboard.f3", + "english_translation": "F3" + }, + { + "key": "mco.template.select.none.linkTitle", + "english_translation": "consider submitting something yourself" + }, + { + "key": "block.minecraft.banner.curly_border.light_blue", + "english_translation": "Light Blue Bordure Indented" + }, + { + "key": "advancements.story.smelt_iron.description", + "english_translation": "Smelt an Iron Ingot" + }, + { + "key": "chat_screen.message", + "english_translation": "Message to send: %s" + }, + { + "key": "subtitles.block.redstone_torch.burnout", + "english_translation": "Torch fizzes" + }, + { + "key": "entity.minecraft.villager.nitwit", + "english_translation": "Nitwit" + }, + { + "key": "command.expected.separator", + "english_translation": "Expected whitespace to end one argument, but found trailing data" + }, + { + "key": "block.minecraft.oak_fence_gate", + "english_translation": "Oak Fence Gate" + }, + { + "key": "subtitles.entity.horse.gallop", + "english_translation": "Horse gallops" + }, + { + "key": "gamerule.category.misc", + "english_translation": "Miscellaneous" + }, + { + "key": "commands.locate.biome.success", + "english_translation": "The nearest %s is at %s (%s blocks away)" + }, + { + "key": "block.minecraft.banner.creeper.gray", + "english_translation": "Gray Creeper Charge" + }, + { + "key": "subtitles.item.book.page_turn", + "english_translation": "Page rustles" + }, + { + "key": "painting.minecraft.wanderer.author", + "english_translation": "Kristoffer Zetterstrand" + }, + { + "key": "block.minecraft.cyan_bed", + "english_translation": "Cyan Bed" + }, + { + "key": "subtitles.item.bone_meal.use", + "english_translation": "Bone Meal crinkles" + }, + { + "key": "item.minecraft.golden_chestplate", + "english_translation": "Golden Chestplate" + }, + { + "key": "item.minecraft.rabbit_foot", + "english_translation": "Rabbit's Foot" + }, + { + "key": "entity.minecraft.villager.cleric", + "english_translation": "Cleric" + }, + { + "key": "gamerule.doPatrolSpawning", + "english_translation": "Spawn pillager patrols" + }, + { + "key": "block.minecraft.banner.stripe_middle.light_blue", + "english_translation": "Light Blue Fess" + }, + { + "key": "jigsaw_block.target", + "english_translation": "Target Name:" + }, + { + "key": "block.minecraft.banner.stripe_downright.green", + "english_translation": "Green Bend" + }, + { + "key": "subtitles.entity.horse.hurt", + "english_translation": "Horse hurts" + }, + { + "key": "stat.minecraft.interact_with_grindstone", + "english_translation": "Interactions with Grindstone" + }, + { + "key": "biome.minecraft.old_growth_birch_forest", + "english_translation": "Old Growth Birch Forest" + }, + { + "key": "block.minecraft.player_wall_head", + "english_translation": "Player Wall Head" + }, + { + "key": "optimizeWorld.info.converted", + "english_translation": "Upgraded chunks: %s" + }, + { + "key": "argument.enum.invalid", + "english_translation": "Invalid value \"%s\"" + }, + { + "key": "item.minecraft.miner_pottery_sherd", + "english_translation": "Miner Pottery Sherd" + }, + { + "key": "block.minecraft.brown_glazed_terracotta", + "english_translation": "Brown Glazed Terracotta" + }, + { + "key": "options.modelPart.left_pants_leg", + "english_translation": "Left Pants Leg" + }, + { + "key": "mco.reset.world.template", + "english_translation": "World templates" + }, + { + "key": "effect.minecraft.resistance", + "english_translation": "Resistance" + }, + { + "key": "arguments.function.unknown", + "english_translation": "Unknown function %s" + }, + { + "key": "subtitles.entity.zombie_villager.hurt", + "english_translation": "Zombie Villager hurts" + }, + { + "key": "block.minecraft.cave_vines", + "english_translation": "Cave Vines" + }, + { + "key": "container.enchant", + "english_translation": "Enchant" + }, + { + "key": "item.minecraft.frog_spawn_egg", + "english_translation": "Frog Spawn Egg" + }, + { + "key": "commands.bossbar.set.visible.success.hidden", + "english_translation": "Custom bossbar %s is now hidden" + }, + { + "key": "stat.minecraft.interact_with_smoker", + "english_translation": "Interactions with Smoker" + }, + { + "key": "createWorld.customize.flat.title", + "english_translation": "Superflat Customization" + }, + { + "key": "telemetry.property.load_time_bootstrap_ms.title", + "english_translation": "Bootstrap Time (Milliseconds)" + }, + { + "key": "item.minecraft.lingering_potion.effect.awkward", + "english_translation": "Awkward Lingering Potion" + }, + { + "key": "block.minecraft.waxed_weathered_copper", + "english_translation": "Waxed Weathered Copper" + }, + { + "key": "argument.player.unknown", + "english_translation": "That player does not exist" + }, + { + "key": "block.minecraft.mangrove_trapdoor", + "english_translation": "Mangrove Trapdoor" + }, + { + "key": "mco.minigame.world.selected", + "english_translation": "Selected minigame:" + }, + { + "key": "item.minecraft.sniffer_spawn_egg", + "english_translation": "Sniffer Spawn Egg" + }, + { + "key": "block.minecraft.banner.half_horizontal_bottom.purple", + "english_translation": "Purple Per Fess Inverted" + }, + { + "key": "block.minecraft.fletching_table", + "english_translation": "Fletching Table" + }, + { + "key": "block.minecraft.banner.stripe_downleft.gray", + "english_translation": "Gray Bend Sinister" + }, + { + "key": "argument.range.swapped", + "english_translation": "Min cannot be bigger than max" + }, + { + "key": "commands.setblock.success", + "english_translation": "Changed the block at %s, %s, %s" + }, + { + "key": "item.minecraft.leather_chestplate", + "english_translation": "Leather Tunic" + }, + { + "key": "item.minecraft.chicken_spawn_egg", + "english_translation": "Chicken Spawn Egg" + }, + { + "key": "item.minecraft.porkchop", + "english_translation": "Raw Porkchop" + }, + { + "key": "attribute.modifier.take.1", + "english_translation": "-%s%% %s" + }, + { + "key": "attribute.modifier.take.0", + "english_translation": "-%s %s" + }, + { + "key": "selectWorld.gameMode.survival.info", + "english_translation": "Explore a mysterious world where you build, collect, craft, and fight monsters." + }, + { + "key": "item.minecraft.flower_banner_pattern.desc", + "english_translation": "Flower Charge" + }, + { + "key": "block.minecraft.granite_slab", + "english_translation": "Granite Slab" + }, + { + "key": "argument.entity.options.x.description", + "english_translation": "x position" + }, + { + "key": "subtitles.entity.skeleton.shoot", + "english_translation": "Skeleton shoots" + }, + { + "key": "chat.coordinates.tooltip", + "english_translation": "Click to teleport" + }, + { + "key": "argument.pos2d.incomplete", + "english_translation": "Incomplete (expected 2 coordinates)" + }, + { + "key": "block.minecraft.banner.triangles_bottom.red", + "english_translation": "Red Base Indented" + }, + { + "key": "item.minecraft.beef", + "english_translation": "Raw Beef" + }, + { + "key": "attribute.modifier.take.2", + "english_translation": "-%s%% %s" + }, + { + "key": "block.minecraft.fern", + "english_translation": "Fern" + }, + { + "key": "item.minecraft.rotten_flesh", + "english_translation": "Rotten Flesh" + }, + { + "key": "stat.minecraft.sleep_in_bed", + "english_translation": "Times Slept in a Bed" + }, + { + "key": "block.minecraft.banner.border.cyan", + "english_translation": "Cyan Bordure" + }, + { + "key": "credits_and_attribution.screen.title", + "english_translation": "Credits and Attribution" + }, + { + "key": "item.minecraft.brewing_stand", + "english_translation": "Brewing Stand" + }, + { + "key": "subtitles.entity.fox.ambient", + "english_translation": "Fox squeaks" + }, + { + "key": "subtitles.entity.generic.drink", + "english_translation": "Sipping" + }, + { + "key": "subtitles.entity.tadpole.hurt", + "english_translation": "Tadpole hurts" + }, + { + "key": "commands.advancement.revoke.many.to.one.success", + "english_translation": "Revoked %s advancements from %s" + }, + { + "key": "item.minecraft.potion", + "english_translation": "Potion" + }, + { + "key": "mco.info", + "english_translation": "Info!" + }, + { + "key": "gamerule.category.player", + "english_translation": "Player" + }, + { + "key": "block.minecraft.blue_wool", + "english_translation": "Blue Wool" + }, + { + "key": "block.minecraft.fire_coral", + "english_translation": "Fire Coral" + }, + { + "key": "advancements.husbandry.ride_a_boat_with_a_goat.description", + "english_translation": "Get in a Boat and float with a Goat" + }, + { + "key": "entity.minecraft.wolf", + "english_translation": "Wolf" + } +] \ No newline at end of file diff --git a/vendor/valence/crates/valence_lang/src/lib.rs b/vendor/valence/crates/valence_lang/src/lib.rs new file mode 100644 index 00000000..0f8f3b93 --- /dev/null +++ b/vendor/valence/crates/valence_lang/src/lib.rs @@ -0,0 +1,8 @@ +#![doc = include_str!("../README.md")] + +/// Contains Rust constants for all of Minecraft's standard translation keys. +/// +/// Use these with `Text::translate`. +pub mod keys { + include!(concat!(env!("OUT_DIR"), "/translation_keys.rs")); +} diff --git a/vendor/valence/crates/valence_math/Cargo.toml b/vendor/valence/crates/valence_math/Cargo.toml new file mode 100644 index 00000000..08badf18 --- /dev/null +++ b/vendor/valence/crates/valence_math/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "valence_math" +description = "Math for Valence" +readme = "README.md" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[dependencies] +glam.workspace = true diff --git a/vendor/valence/crates/valence_math/README.md b/vendor/valence/crates/valence_math/README.md new file mode 100644 index 00000000..d7f7f918 --- /dev/null +++ b/vendor/valence/crates/valence_math/README.md @@ -0,0 +1,6 @@ +# valence_math + +Common math utilities for Valence. + +This crate re-exports the contents of [`glam`](https://docs.rs/glam/latest/glam/) along with our own types such as [`Aabb`]. +For more information, please see `glam`'s documentation. diff --git a/vendor/valence/crates/valence_math/src/aabb.rs b/vendor/valence/crates/valence_math/src/aabb.rs new file mode 100644 index 00000000..48b02e2f --- /dev/null +++ b/vendor/valence/crates/valence_math/src/aabb.rs @@ -0,0 +1,214 @@ +use std::ops::{Add, Sub}; + +use glam::DVec3; + +/// A three-dimensional axis-aligned bounding box, or "AABB". +/// +/// The AABB is defined by two points—`min` and `max`. `min` is less than or +/// equal to `max` componentwise. +#[derive(Copy, Clone, PartialEq, Default, Debug)] +pub struct Aabb { + min: DVec3, + max: DVec3, +} + +impl Aabb { + pub const ZERO: Self = Self { + min: DVec3::ZERO, + max: DVec3::ZERO, + }; + + /// Constructs a new AABB from `min` and `max` points. + /// + /// # Panics + /// + /// Panics if `debug_assertions` are enabled and `min` is not less than or + /// equal to `max` componentwise. + #[cfg_attr(debug_assertions, track_caller)] + pub fn new(min: DVec3, max: DVec3) -> Self { + debug_assert!( + min.x <= max.x && min.y <= max.y && min.z <= max.z, + "`min` must be less than or equal to `max` componentwise (min = {min}, max = {max})" + ); + + Self { min, max } + } + + // TODO: remove when the assertion in `new` can be done in a `const` context. + #[doc(hidden)] + pub const fn new_unchecked(min: DVec3, max: DVec3) -> Self { + Self { min, max } + } + + /// Returns a new AABB containing a single point `p`. + pub fn new_point(p: DVec3) -> Self { + Self::new(p, p) + } + + pub fn from_bottom_size(bottom: DVec3, size: DVec3) -> Self { + Self::new( + DVec3 { + x: bottom.x - size.x / 2.0, + y: bottom.y, + z: bottom.z - size.z / 2.0, + }, + DVec3 { + x: bottom.x + size.x / 2.0, + y: bottom.y + size.y, + z: bottom.z + size.z / 2.0, + }, + ) + } + + pub const fn min(self) -> DVec3 { + self.min + } + + pub const fn max(self) -> DVec3 { + self.max + } + + pub fn union(self, other: Self) -> Self { + Self::new(self.min.min(other.min), self.max.max(other.max)) + } + + pub fn intersects(self, other: Self) -> bool { + self.max.x >= other.min.x + && other.max.x >= self.min.x + && self.max.y >= other.min.y + && other.max.y >= self.min.y + && self.max.z >= other.min.z + && other.max.z >= self.min.z + } + + /// Does this bounding box contain the given point? + pub fn contains_point(self, p: DVec3) -> bool { + self.min.x <= p.x + && self.min.y <= p.y + && self.min.z <= p.z + && self.max.x >= p.x + && self.max.y >= p.y + && self.max.z >= p.z + } + + /// Returns the closest point in the AABB to the given point. + pub fn projected_point(self, p: DVec3) -> DVec3 { + p.clamp(self.min, self.max) + } + + /// Returns the smallest distance from the AABB to the point. + pub fn distance_to_point(self, p: DVec3) -> f64 { + self.projected_point(p).distance(p) + } + + /// Calculates the intersection between this AABB and a ray + /// defined by its `origin` point and `direction` vector. + /// + /// If an intersection occurs, `Some([near, far])` is returned. `near` and + /// `far` are the values of `t` in the equation `origin + t * direction = + /// point` where `point` is the nearest or furthest intersection point to + /// the `origin`. If no intersection occurs, then `None` is returned. + /// + /// In other words, if `direction` is normalized, then `near` and `far` are + /// the distances to the nearest and furthest intersection points. + pub fn ray_intersection(self, origin: DVec3, direction: DVec3) -> Option<[f64; 2]> { + let mut near: f64 = 0.0; + let mut far = f64::INFINITY; + + for i in 0..3 { + // Rust's definition of `min` and `max` properly handle the NaNs these + // computations may produce. + let t0 = (self.min[i] - origin[i]) / direction[i]; + let t1 = (self.max[i] - origin[i]) / direction[i]; + + near = near.max(t0.min(t1)); + far = far.min(t0.max(t1)); + } + + if near <= far { + Some([near, far]) + } else { + None + } + } +} + +impl Add for Aabb { + type Output = Aabb; + + fn add(self, rhs: DVec3) -> Self::Output { + Self::new(self.min + rhs, self.max + rhs) + } +} + +impl Add for DVec3 { + type Output = Aabb; + + fn add(self, rhs: Aabb) -> Self::Output { + rhs + self + } +} + +impl Sub for Aabb { + type Output = Aabb; + + fn sub(self, rhs: DVec3) -> Self::Output { + Self::new(self.min - rhs, self.max - rhs) + } +} + +impl Sub for DVec3 { + type Output = Aabb; + + fn sub(self, rhs: Aabb) -> Self::Output { + rhs - self + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn ray_intersect_edge_cases() { + let bb = Aabb::new([0.0, 0.0, 0.0].into(), [1.0, 1.0, 1.0].into()); + + let ros = [ + // On a corner + DVec3::new(0.0, 0.0, 0.0), + // Outside + DVec3::new(-0.5, 0.5, -0.5), + // In the center + DVec3::new(0.5, 0.5, 0.5), + // On an edge + DVec3::new(0.0, 0.5, 0.0), + // On a face + DVec3::new(0.0, 0.5, 0.5), + // Outside slabs + DVec3::new(-2.0, -2.0, -2.0), + ]; + + let rds = [ + DVec3::new(1.0, 0.0, 0.0), + DVec3::new(-1.0, 0.0, 0.0), + DVec3::new(0.0, 1.0, 0.0), + DVec3::new(0.0, -1.0, 0.0), + DVec3::new(0.0, 0.0, 1.0), + DVec3::new(0.0, 0.0, -1.0), + ]; + + assert!(rds.iter().all(|d| d.is_normalized())); + + for ro in ros { + for rd in rds { + if let Some([near, far]) = bb.ray_intersection(ro, rd) { + assert!(near.is_finite()); + assert!(far.is_finite()); + assert!(near <= far); + assert!(near >= 0.0); + assert!(far >= 0.0); + } + } + } + } +} diff --git a/vendor/valence/crates/valence_math/src/lib.rs b/vendor/valence/crates/valence_math/src/lib.rs new file mode 100644 index 00000000..bf3db2c0 --- /dev/null +++ b/vendor/valence/crates/valence_math/src/lib.rs @@ -0,0 +1,6 @@ +#![doc = include_str!("../README.md")] + +mod aabb; + +pub use aabb::Aabb; +pub use glam::*; diff --git a/vendor/valence/crates/valence_nbt/Cargo.toml b/vendor/valence/crates/valence_nbt/Cargo.toml new file mode 100644 index 00000000..3c60fd03 --- /dev/null +++ b/vendor/valence/crates/valence_nbt/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "valence_nbt" +description = "Minecraft's Named Binary Tag (NBT) format." +readme = "README.md" +documentation = "https://docs.rs/valence_nbt/" +license.workspace = true +keywords = ["nbt", "minecraft", "serialization"] +version = "0.8.0" +edition.workspace = true +repository.workspace = true + +[features] +binary = ["dep:byteorder", "dep:cesu8"] +java_string = ["dep:java_string"] +snbt = [] +# When enabled, the order of fields in compounds are preserved. +preserve_order = ["dep:indexmap"] +serde = ["dep:serde", "dep:thiserror", "indexmap?/serde"] + +[dependencies] +byteorder = { workspace = true, optional = true } +cesu8 = { workspace = true, optional = true } +indexmap = { workspace = true, optional = true } +java_string = { workspace = true, optional = true } +serde = { workspace = true, features = ["derive"], optional = true } +thiserror = { workspace = true, optional = true } +uuid = { workspace = true, optional = true } +valence_ident = { workspace = true, optional = true } + +[dev-dependencies] +pretty_assertions.workspace = true +serde_json.workspace = true diff --git a/vendor/valence/crates/valence_nbt/README.md b/vendor/valence/crates/valence_nbt/README.md new file mode 100644 index 00000000..7d3e1f42 --- /dev/null +++ b/vendor/valence/crates/valence_nbt/README.md @@ -0,0 +1,14 @@ +# valence_nbt + +A library for encoding and decoding Minecraft's [Named Binary Tag] (NBT) +format. + +[Named Binary Tag]: https://minecraft.wiki/w/NBT_format + +# Features +- `binary`: Adds support for serializing and deserializing in Java edition's binary format. +- `snbt`: Adds support for serializing and deserializing in "stringified" format. +- `preserve_order`: Causes the order of fields in [`Compound`]s to be +preserved during insertion and deletion at a slight cost to performance. +The iterators on `Compound` can then implement [`DoubleEndedIterator`]. +- `serde` Adds support for [`serde`](https://docs.rs/serde/latest/serde/) diff --git a/vendor/valence/crates/valence_nbt/src/binary.rs b/vendor/valence/crates/valence_nbt/src/binary.rs new file mode 100644 index 00000000..d17f95a3 --- /dev/null +++ b/vendor/valence/crates/valence_nbt/src/binary.rs @@ -0,0 +1,73 @@ +//! Support for serializing and deserializing compounds in Java edition's binary +//! format. +//! +//! # Examples +//! +//! ``` +//! use valence_nbt::{compound, to_binary, Compound, List}; +//! +//! let c = compound! { +//! "byte" => 5_i8, +//! "string" => "hello", +//! "list_of_float" => List::Float(vec![ +//! 3.1415, +//! 2.7182, +//! 1.4142 +//! ]), +//! }; +//! +//! let mut buf = vec![]; +//! +//! to_binary(&c, &mut buf, "").unwrap(); +//! ``` +//! +//! Decode NBT data from its binary form. +//! +//! ``` +//! use valence_nbt::{compound, from_binary, Compound}; +//! +//! let some_bytes = [10, 0, 0, 3, 0, 3, 105, 110, 116, 0, 0, 222, 173, 0]; +//! +//! let expected_value = compound! { +//! "int" => 0xdead +//! }; +//! +//! let (nbt, root_name) = from_binary(&mut some_bytes.as_slice()).unwrap(); +//! +//! assert_eq!(nbt, expected_value); +//! assert_eq!(root_name, ""); +//! ``` + +mod decode; +mod encode; +mod error; +mod modified_utf8; +#[cfg(test)] +mod tests; + +pub use decode::{from_binary, FromModifiedUtf8, FromModifiedUtf8Error}; +pub use encode::{to_binary, written_size, ToModifiedUtf8}; +pub use error::*; + +use crate::Tag; + +impl Tag { + /// Returns the name of this tag for error reporting purposes. + const fn name(self) -> &'static str { + match self { + Tag::End => "end", + Tag::Byte => "byte", + Tag::Short => "short", + Tag::Int => "int", + Tag::Long => "long", + Tag::Float => "float", + Tag::Double => "double", + Tag::ByteArray => "byte array", + Tag::String => "string", + Tag::List => "list", + Tag::Compound => "compound", + Tag::IntArray => "int array", + Tag::LongArray => "long array", + } + } +} diff --git a/vendor/valence/crates/valence_nbt/src/binary/decode.rs b/vendor/valence/crates/valence_nbt/src/binary/decode.rs new file mode 100644 index 00000000..60713208 --- /dev/null +++ b/vendor/valence/crates/valence_nbt/src/binary/decode.rs @@ -0,0 +1,373 @@ +use std::borrow::Cow; +use std::hash::Hash; +use std::{fmt, mem}; + +use byteorder::{BigEndian, ReadBytesExt}; + +use super::{Error, Result}; +use crate::tag::Tag; +use crate::{Compound, List, Value}; + +/// Decodes uncompressed NBT binary data from the provided slice. +/// +/// The string returned in the tuple is the name of the root compound +/// (typically the empty string). +pub fn from_binary<'de, S>(slice: &mut &'de [u8]) -> Result<(Compound, S)> +where + S: FromModifiedUtf8<'de> + Hash + Ord, +{ + let mut state = DecodeState { slice, depth: 0 }; + + let root_tag = state.read_tag()?; + + if root_tag != Tag::Compound { + return Err(Error::new_owned(format!( + "expected root tag for compound (got {})", + root_tag.name(), + ))); + } + + let root_name = state.read_string::()?; + let root = state.read_compound()?; + + debug_assert_eq!(state.depth, 0); + + Ok((root, root_name)) +} + +/// Maximum recursion depth to prevent overflowing the call stack. +const MAX_DEPTH: usize = 512; + +struct DecodeState<'a, 'de> { + slice: &'a mut &'de [u8], + /// Current recursion depth. + depth: usize, +} + +impl<'de> DecodeState<'_, 'de> { + #[inline] + fn check_depth(&mut self, f: impl FnOnce(&mut Self) -> Result) -> Result { + if self.depth >= MAX_DEPTH { + return Err(Error::new_static("reached maximum recursion depth")); + } + + self.depth += 1; + let res = f(self); + self.depth -= 1; + res + } + + fn read_tag(&mut self) -> Result { + match self.slice.read_u8()? { + 0 => Ok(Tag::End), + 1 => Ok(Tag::Byte), + 2 => Ok(Tag::Short), + 3 => Ok(Tag::Int), + 4 => Ok(Tag::Long), + 5 => Ok(Tag::Float), + 6 => Ok(Tag::Double), + 7 => Ok(Tag::ByteArray), + 8 => Ok(Tag::String), + 9 => Ok(Tag::List), + 10 => Ok(Tag::Compound), + 11 => Ok(Tag::IntArray), + 12 => Ok(Tag::LongArray), + byte => Err(Error::new_owned(format!("invalid tag byte of {byte:#x}"))), + } + } + + fn read_value(&mut self, tag: Tag) -> Result> + where + S: FromModifiedUtf8<'de> + Hash + Ord, + { + match tag { + Tag::End => unreachable!("illegal TAG_End argument"), + Tag::Byte => Ok(self.read_byte()?.into()), + Tag::Short => Ok(self.read_short()?.into()), + Tag::Int => Ok(self.read_int()?.into()), + Tag::Long => Ok(self.read_long()?.into()), + Tag::Float => Ok(self.read_float()?.into()), + Tag::Double => Ok(self.read_double()?.into()), + Tag::ByteArray => Ok(self.read_byte_array()?.into()), + Tag::String => Ok(Value::String(self.read_string::()?)), + Tag::List => self.check_depth(|st| Ok(st.read_any_list::()?.into())), + Tag::Compound => self.check_depth(|st| Ok(st.read_compound::()?.into())), + Tag::IntArray => Ok(self.read_int_array()?.into()), + Tag::LongArray => Ok(self.read_long_array()?.into()), + } + } + + fn read_byte(&mut self) -> Result { + Ok(self.slice.read_i8()?) + } + + fn read_short(&mut self) -> Result { + Ok(self.slice.read_i16::()?) + } + + fn read_int(&mut self) -> Result { + Ok(self.slice.read_i32::()?) + } + + fn read_long(&mut self) -> Result { + Ok(self.slice.read_i64::()?) + } + + fn read_float(&mut self) -> Result { + Ok(self.slice.read_f32::()?) + } + + fn read_double(&mut self) -> Result { + Ok(self.slice.read_f64::()?) + } + + fn read_byte_array(&mut self) -> Result> { + let len = self.slice.read_i32::()?; + + if len.is_negative() { + return Err(Error::new_owned(format!( + "negative byte array length of {len}" + ))); + } + + if len as usize > self.slice.len() { + return Err(Error::new_owned(format!( + "byte array length of {len} exceeds remainder of input" + ))); + } + + let (left, right) = self.slice.split_at(len as usize); + + let array = left.iter().map(|b| *b as i8).collect(); + *self.slice = right; + + Ok(array) + } + + fn read_string(&mut self) -> Result + where + S: FromModifiedUtf8<'de>, + { + let len = self.slice.read_u16::()?.into(); + + if len > self.slice.len() { + return Err(Error::new_owned(format!( + "string of length {len} exceeds remainder of input" + ))); + } + + let (left, right) = self.slice.split_at(len); + + match S::from_modified_utf8(left) { + Ok(str) => { + *self.slice = right; + Ok(str) + } + Err(_) => Err(Error::new_static("could not decode modified UTF-8 data")), + } + } + + fn read_any_list(&mut self) -> Result> + where + S: FromModifiedUtf8<'de> + Hash + Ord, + { + match self.read_tag()? { + Tag::End => match self.read_int()? { + 0 => Ok(List::End), + len => Err(Error::new_owned(format!( + "TAG_End list with nonzero length of {len}" + ))), + }, + Tag::Byte => Ok(self.read_list(Tag::Byte, 1, |st| st.read_byte())?.into()), + Tag::Short => Ok(self.read_list(Tag::Short, 2, |st| st.read_short())?.into()), + Tag::Int => Ok(self.read_list(Tag::Int, 4, |st| st.read_int())?.into()), + Tag::Long => Ok(self.read_list(Tag::Long, 8, |st| st.read_long())?.into()), + Tag::Float => Ok(self.read_list(Tag::Float, 4, |st| st.read_float())?.into()), + Tag::Double => Ok(self + .read_list(Tag::Double, 8, |st| st.read_double())? + .into()), + Tag::ByteArray => Ok(self + .read_list(Tag::ByteArray, 0, |st| st.read_byte_array())? + .into()), + Tag::String => Ok(List::String( + self.read_list(Tag::String, 0, |st| st.read_string::())?, + )), + Tag::List => self.check_depth(|st| { + Ok(st + .read_list(Tag::List, 0, |st| st.read_any_list::())? + .into()) + }), + Tag::Compound => self.check_depth(|st| { + Ok(st + .read_list(Tag::Compound, 0, |st| st.read_compound::())? + .into()) + }), + Tag::IntArray => Ok(self + .read_list(Tag::IntArray, 0, |st| st.read_int_array())? + .into()), + Tag::LongArray => Ok(self + .read_list(Tag::LongArray, 0, |st| st.read_long_array())? + .into()), + } + } + + /// Assumes the element tag has already been read. + /// + /// `min_elem_size` is the minimum size of the list element when encoded. + #[inline] + fn read_list( + &mut self, + elem_type: Tag, + elem_size: usize, + mut read_elem: F, + ) -> Result> + where + F: FnMut(&mut Self) -> Result, + { + let len = self.read_int()?; + + if len.is_negative() { + return Err(Error::new_owned(format!( + "negative {} list length of {len}", + elem_type.name() + ))); + } + + // Ensure we don't reserve more than the maximum amount of memory required given + // the size of the remaining input. + if len as u64 * elem_size as u64 > self.slice.len() as u64 { + return Err(Error::new_owned(format!( + "{} list of length {len} exceeds remainder of input", + elem_type.name() + ))); + } + + let mut list = Vec::with_capacity(if elem_size == 0 { 0 } else { len as usize }); + + for _ in 0..len { + list.push(read_elem(self)?); + } + + Ok(list) + } + + fn read_compound(&mut self) -> Result> + where + S: FromModifiedUtf8<'de> + Hash + Ord, + { + let mut compound = Compound::new(); + + loop { + let tag = self.read_tag()?; + if tag == Tag::End { + return Ok(compound); + } + + compound.insert(self.read_string::()?, self.read_value::(tag)?); + } + } + + fn read_int_array(&mut self) -> Result> { + let len = self.read_int()?; + + if len.is_negative() { + return Err(Error::new_owned(format!( + "negative int array length of {len}", + ))); + } + + if len as u64 * mem::size_of::() as u64 > self.slice.len() as u64 { + return Err(Error::new_owned(format!( + "int array of length {len} exceeds remainder of input" + ))); + } + + let mut array = Vec::with_capacity(len as usize); + for _ in 0..len { + array.push(self.read_int()?); + } + + Ok(array) + } + + fn read_long_array(&mut self) -> Result> { + let len = self.read_int()?; + + if len.is_negative() { + return Err(Error::new_owned(format!( + "negative long array length of {len}", + ))); + } + + if len as u64 * mem::size_of::() as u64 > self.slice.len() as u64 { + return Err(Error::new_owned(format!( + "long array of length {len} exceeds remainder of input" + ))); + } + + let mut array = Vec::with_capacity(len as usize); + for _ in 0..len { + array.push(self.read_long()?); + } + + Ok(array) + } +} + +#[derive(Copy, Clone, Debug)] +pub struct FromModifiedUtf8Error; + +impl fmt::Display for FromModifiedUtf8Error { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.write_str("could not decode modified UTF-8 data") + } +} + +impl std::error::Error for FromModifiedUtf8Error {} + +/// A string type which can be decoded from Java's [modified UTF-8](https://docs.oracle.com/javase/8/docs/api/java/io/DataInput.html#modified-utf-8). +pub trait FromModifiedUtf8<'de>: Sized { + fn from_modified_utf8( + modified_utf8: &'de [u8], + ) -> std::result::Result; +} + +impl<'de> FromModifiedUtf8<'de> for Cow<'de, str> { + fn from_modified_utf8( + modified_utf8: &'de [u8], + ) -> std::result::Result { + cesu8::from_java_cesu8(modified_utf8).map_err(move |_| FromModifiedUtf8Error) + } +} + +impl<'de> FromModifiedUtf8<'de> for String { + fn from_modified_utf8( + modified_utf8: &'de [u8], + ) -> std::result::Result { + match cesu8::from_java_cesu8(modified_utf8) { + Ok(str) => Ok(str.into_owned()), + Err(_) => Err(FromModifiedUtf8Error), + } + } +} + +#[cfg(feature = "java_string")] +impl<'de> FromModifiedUtf8<'de> for Cow<'de, java_string::JavaStr> { + fn from_modified_utf8( + modified_utf8: &'de [u8], + ) -> std::result::Result { + java_string::JavaStr::from_modified_utf8(modified_utf8).map_err(|_| FromModifiedUtf8Error) + } +} + +#[cfg(feature = "java_string")] +impl<'de> FromModifiedUtf8<'de> for java_string::JavaString { + fn from_modified_utf8( + modified_utf8: &'de [u8], + ) -> std::result::Result { + match java_string::JavaStr::from_modified_utf8(modified_utf8) { + Ok(str) => Ok(str.into_owned()), + Err(_) => Err(FromModifiedUtf8Error), + } + } +} diff --git a/vendor/valence/crates/valence_nbt/src/binary/encode.rs b/vendor/valence/crates/valence_nbt/src/binary/encode.rs new file mode 100644 index 00000000..8cc50b81 --- /dev/null +++ b/vendor/valence/crates/valence_nbt/src/binary/encode.rs @@ -0,0 +1,391 @@ +use std::borrow::Cow; +use std::hash::Hash; +use std::io::Write; + +use byteorder::{BigEndian, WriteBytesExt}; + +use super::{modified_utf8, Error, Result}; +use crate::conv::i8_slice_as_u8_slice; +use crate::tag::Tag; +use crate::{Compound, List, Value}; + +/// Encodes uncompressed NBT binary data to the provided writer. +/// +/// Only compounds are permitted at the top level. This is why the function +/// accepts a [`Compound`] reference rather than a [`Value`]. +/// +/// Additionally, the root compound can be given a name. Typically the empty +/// string `""` is used. +pub fn to_binary(comp: &Compound, writer: W, root_name: &R) -> Result<()> +where + W: Write, + S: ToModifiedUtf8 + Hash + Ord, + R: ToModifiedUtf8 + ?Sized, +{ + let mut state = EncodeState { writer }; + + state.write_tag(Tag::Compound)?; + state.write_string(root_name)?; + state.write_compound(comp)?; + + Ok(()) +} + +/// Returns the number of bytes that will be written when +/// [`to_binary`] is called with this compound and root name. +/// +/// If `to_binary` results in `Ok`, the exact number of bytes +/// reported by this function will have been written. If the result is +/// `Err`, then the reported count will be greater than or equal to the +/// number of bytes that have actually been written. +pub fn written_size(comp: &Compound, root_name: &R) -> usize +where + S: ToModifiedUtf8 + Hash + Ord, + R: ToModifiedUtf8 + ?Sized, +{ + fn value_size(val: &Value) -> usize + where + S: ToModifiedUtf8 + Hash + Ord, + { + match val { + Value::Byte(_) => 1, + Value::Short(_) => 2, + Value::Int(_) => 4, + Value::Long(_) => 8, + Value::Float(_) => 4, + Value::Double(_) => 8, + Value::ByteArray(v) => 4 + v.len(), + Value::String(v) => string_size(v), + Value::List(v) => list_size(v), + Value::Compound(v) => compound_size(v), + Value::IntArray(v) => 4 + v.len() * 4, + Value::LongArray(v) => 4 + v.len() * 8, + } + } + + fn list_size(l: &List) -> usize + where + S: ToModifiedUtf8 + Hash + Ord, + { + let elems_size = match l { + List::End => 0, + List::Byte(v) => v.len(), + List::Short(v) => v.len() * 2, + List::Int(v) => v.len() * 4, + List::Long(v) => v.len() * 8, + List::Float(v) => v.len() * 4, + List::Double(v) => v.len() * 8, + List::ByteArray(v) => v.iter().map(|b| 4 + b.len()).sum(), + List::String(v) => v.iter().map(|s| string_size(s)).sum(), + List::List(v) => v.iter().map(list_size).sum(), + List::Compound(v) => v.iter().map(compound_size).sum(), + List::IntArray(v) => v.iter().map(|i| 4 + i.len() * 4).sum(), + List::LongArray(v) => v.iter().map(|l| 4 + l.len() * 8).sum(), + }; + + 1 + 4 + elems_size + } + + fn string_size(s: &S) -> usize { + 2 + s.modified_uf8_len() + } + + fn compound_size(c: &Compound) -> usize + where + S: ToModifiedUtf8 + Hash + Ord, + { + c.iter() + .map(|(k, v)| 1 + string_size(k) + value_size(v)) + .sum::() + + 1 + } + + 1 + string_size(root_name) + compound_size(comp) +} + +struct EncodeState { + writer: W, +} + +impl EncodeState { + fn write_tag(&mut self, tag: Tag) -> Result<()> { + Ok(self.writer.write_u8(tag as u8)?) + } + + fn write_value(&mut self, v: &Value) -> Result<()> + where + S: ToModifiedUtf8 + Hash + Ord, + { + match v { + Value::Byte(v) => self.write_byte(*v), + Value::Short(v) => self.write_short(*v), + Value::Int(v) => self.write_int(*v), + Value::Long(v) => self.write_long(*v), + Value::Float(v) => self.write_float(*v), + Value::Double(v) => self.write_double(*v), + Value::ByteArray(v) => self.write_byte_array(v), + Value::String(v) => self.write_string(v), + Value::List(v) => self.write_any_list(v), + Value::Compound(v) => self.write_compound(v), + Value::IntArray(v) => self.write_int_array(v), + Value::LongArray(v) => self.write_long_array(v), + } + } + + fn write_byte(&mut self, byte: i8) -> Result<()> { + Ok(self.writer.write_i8(byte)?) + } + + fn write_short(&mut self, short: i16) -> Result<()> { + Ok(self.writer.write_i16::(short)?) + } + + fn write_int(&mut self, int: i32) -> Result<()> { + Ok(self.writer.write_i32::(int)?) + } + + fn write_long(&mut self, long: i64) -> Result<()> { + Ok(self.writer.write_i64::(long)?) + } + + fn write_float(&mut self, float: f32) -> Result<()> { + Ok(self.writer.write_f32::(float)?) + } + + fn write_double(&mut self, double: f64) -> Result<()> { + Ok(self.writer.write_f64::(double)?) + } + + fn write_byte_array(&mut self, bytes: &[i8]) -> Result<()> { + match bytes.len().try_into() { + Ok(len) => self.write_int(len)?, + Err(_) => { + return Err(Error::new_owned(format!( + "byte array of length {} exceeds maximum of i32::MAX", + bytes.len(), + ))) + } + } + + Ok(self.writer.write_all(i8_slice_as_u8_slice(bytes))?) + } + + fn write_string(&mut self, s: &S) -> Result<()> { + let len = s.modified_uf8_len(); + + match len.try_into() { + Ok(n) => self.writer.write_u16::(n)?, + Err(_) => { + return Err(Error::new_owned(format!( + "string of length {len} exceeds maximum of u16::MAX" + ))) + } + } + + s.to_modified_utf8(len, &mut self.writer)?; + + Ok(()) + } + + fn write_any_list(&mut self, list: &List) -> Result<()> + where + S: ToModifiedUtf8 + Hash + Ord, + { + match list { + List::End => { + self.write_tag(Tag::End)?; + // Length + self.writer.write_i32::(0)?; + Ok(()) + } + List::Byte(v) => { + self.write_tag(Tag::Byte)?; + + match v.len().try_into() { + Ok(len) => self.write_int(len)?, + Err(_) => { + return Err(Error::new_owned(format!( + "byte list of length {} exceeds maximum of i32::MAX", + v.len(), + ))) + } + } + + Ok(self.writer.write_all(i8_slice_as_u8_slice(v))?) + } + List::Short(sl) => self.write_list(sl, Tag::Short, |st, v| st.write_short(*v)), + List::Int(il) => self.write_list(il, Tag::Int, |st, v| st.write_int(*v)), + List::Long(ll) => self.write_list(ll, Tag::Long, |st, v| st.write_long(*v)), + List::Float(fl) => self.write_list(fl, Tag::Float, |st, v| st.write_float(*v)), + List::Double(dl) => self.write_list(dl, Tag::Double, |st, v| st.write_double(*v)), + List::ByteArray(v) => { + self.write_list(v, Tag::ByteArray, |st, v| st.write_byte_array(v)) + } + List::String(v) => self.write_list(v, Tag::String, |st, v| st.write_string(v)), + List::List(v) => self.write_list(v, Tag::List, |st, v| st.write_any_list(v)), + List::Compound(v) => self.write_list(v, Tag::Compound, |st, v| st.write_compound(v)), + List::IntArray(v) => self.write_list(v, Tag::IntArray, |st, v| st.write_int_array(v)), + List::LongArray(v) => { + self.write_list(v, Tag::LongArray, |st, v| st.write_long_array(v)) + } + } + } + + fn write_list(&mut self, list: &[T], elem_type: Tag, mut write_elem: F) -> Result<()> + where + F: FnMut(&mut Self, &T) -> Result<()>, + { + self.write_tag(elem_type)?; + + match list.len().try_into() { + Ok(len) => self.writer.write_i32::(len)?, + Err(_) => { + return Err(Error::new_owned(format!( + "{} list of length {} exceeds maximum of i32::MAX", + list.len(), + elem_type.name() + ))) + } + } + + for elem in list { + write_elem(self, elem)?; + } + + Ok(()) + } + + fn write_compound(&mut self, c: &Compound) -> Result<()> + where + S: ToModifiedUtf8 + Hash + Ord, + { + for (k, v) in c.iter() { + self.write_tag(v.tag())?; + self.write_string(k)?; + self.write_value(v)?; + } + self.write_tag(Tag::End)?; + + Ok(()) + } + + fn write_int_array(&mut self, ia: &[i32]) -> Result<()> { + match ia.len().try_into() { + Ok(len) => self.write_int(len)?, + Err(_) => { + return Err(Error::new_owned(format!( + "int array of length {} exceeds maximum of i32::MAX", + ia.len(), + ))) + } + } + + for i in ia { + self.write_int(*i)?; + } + + Ok(()) + } + + fn write_long_array(&mut self, la: &[i64]) -> Result<()> { + match la.len().try_into() { + Ok(len) => self.write_int(len)?, + Err(_) => { + return Err(Error::new_owned(format!( + "long array of length {} exceeds maximum of i32::MAX", + la.len(), + ))) + } + } + + for l in la { + self.write_long(*l)?; + } + + Ok(()) + } +} + +/// A string type which can be encoded into Java's [modified UTF-8](https://docs.oracle.com/javase/8/docs/api/java/io/DataInput.html#modified-utf-8). +pub trait ToModifiedUtf8 { + fn modified_uf8_len(&self) -> usize; + fn to_modified_utf8(&self, encoded_len: usize, writer: W) -> std::io::Result<()>; +} + +impl ToModifiedUtf8 for str { + fn modified_uf8_len(&self) -> usize { + modified_utf8::encoded_len(self.as_bytes()) + } + + fn to_modified_utf8(&self, encoded_len: usize, mut writer: W) -> std::io::Result<()> { + // Conversion to modified UTF-8 always increases the size of the string. + // If the new len is equal to the original len, we know it doesn't need + // to be re-encoded. + if self.len() == encoded_len { + writer.write_all(self.as_bytes()) + } else { + modified_utf8::write_modified_utf8(writer, self) + } + } +} + +impl ToModifiedUtf8 for Cow<'_, str> { + #[inline] + fn modified_uf8_len(&self) -> usize { + str::modified_uf8_len(self) + } + + fn to_modified_utf8(&self, encoded_len: usize, writer: W) -> std::io::Result<()> { + str::to_modified_utf8(self, encoded_len, writer) + } +} + +impl ToModifiedUtf8 for String { + #[inline] + fn modified_uf8_len(&self) -> usize { + str::modified_uf8_len(self) + } + + fn to_modified_utf8(&self, encoded_len: usize, writer: W) -> std::io::Result<()> { + str::to_modified_utf8(self, encoded_len, writer) + } +} + +#[cfg(feature = "java_string")] +impl ToModifiedUtf8 for java_string::JavaStr { + fn modified_uf8_len(&self) -> usize { + modified_utf8::encoded_len(self.as_bytes()) + } + + fn to_modified_utf8( + &self, + _encoded_len: usize, + mut writer: W, + ) -> std::io::Result<()> { + writer.write_all(&self.to_modified_utf8()) + } +} + +#[cfg(feature = "java_string")] +impl ToModifiedUtf8 for Cow<'_, java_string::JavaStr> { + #[inline] + fn modified_uf8_len(&self) -> usize { + java_string::JavaStr::modified_uf8_len(self) + } + + fn to_modified_utf8(&self, encoded_len: usize, writer: W) -> std::io::Result<()> { + ::to_modified_utf8(self, encoded_len, writer) + } +} + +#[cfg(feature = "java_string")] +impl ToModifiedUtf8 for java_string::JavaString { + #[inline] + fn modified_uf8_len(&self) -> usize { + java_string::JavaStr::modified_uf8_len(self) + } + + fn to_modified_utf8(&self, encoded_len: usize, writer: W) -> std::io::Result<()> { + ::to_modified_utf8(self, encoded_len, writer) + } +} diff --git a/vendor/valence/crates/valence_nbt/src/binary/error.rs b/vendor/valence/crates/valence_nbt/src/binary/error.rs new file mode 100644 index 00000000..8c5c4efa --- /dev/null +++ b/vendor/valence/crates/valence_nbt/src/binary/error.rs @@ -0,0 +1,61 @@ +use std::error::Error as StdError; +use std::fmt::{Display, Formatter}; +use std::io; + +pub type Result = std::result::Result; + +/// Errors that can occur when encoding or decoding binary NBT. +#[derive(Debug)] +pub struct Error { + /// Box this to keep the size of `Result` small. + cause: Box, +} + +#[derive(Debug)] +enum Cause { + Io(io::Error), + Owned(Box), + Static(&'static str), +} + +impl Error { + pub(crate) fn new_owned(msg: impl Into>) -> Self { + Self { + cause: Box::new(Cause::Owned(msg.into())), + } + } + + pub(crate) fn new_static(msg: &'static str) -> Self { + Self { + cause: Box::new(Cause::Static(msg)), + } + } +} + +impl Display for Error { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + match &*self.cause { + Cause::Io(e) => e.fmt(f), + Cause::Owned(msg) => write!(f, "{msg}"), + Cause::Static(msg) => write!(f, "{msg}"), + } + } +} + +impl StdError for Error { + fn source(&self) -> Option<&(dyn StdError + 'static)> { + match &*self.cause { + Cause::Io(e) => Some(e), + Cause::Owned(_) => None, + Cause::Static(_) => None, + } + } +} + +impl From for Error { + fn from(e: io::Error) -> Self { + Self { + cause: Box::new(Cause::Io(e)), + } + } +} diff --git a/vendor/valence/crates/valence_nbt/src/binary/modified_utf8.rs b/vendor/valence/crates/valence_nbt/src/binary/modified_utf8.rs new file mode 100644 index 00000000..491745de --- /dev/null +++ b/vendor/valence/crates/valence_nbt/src/binary/modified_utf8.rs @@ -0,0 +1,127 @@ +//! Utilities for working with Java's "Modified UTF-8" character encoding. +//! +//! For more information, refer to [Wikipedia]. +//! +//! [Wikipedia]: https://en.wikipedia.org/wiki/UTF-8#Modified_UTF-8 + +use std::io; +use std::io::Write; +use std::str::from_utf8_unchecked; + +use byteorder::{BigEndian, WriteBytesExt}; + +pub(crate) fn write_modified_utf8(mut writer: impl Write, text: &str) -> io::Result<()> { + let bytes = text.as_bytes(); + let mut i = 0; + + while i < bytes.len() { + match bytes[i] { + 0 => { + writer.write_u16::(0xc080)?; + i += 1; + } + b @ 1..=127 => { + writer.write_u8(b)?; + i += 1; + } + b => { + let w = utf8_char_width(b); + debug_assert!(w <= 4); + debug_assert!(i + w <= bytes.len()); + + if w != 4 { + writer.write_all(&bytes[i..i + w])?; + } else { + let s = unsafe { from_utf8_unchecked(&bytes[i..i + w]) }; + let c = s.chars().next().unwrap() as u32 - 0x10000; + + let s0 = ((c >> 10) as u16) | 0xd800; + let s1 = ((c & 0x3ff) as u16) | 0xdc00; + + writer.write_all(encode_surrogate(s0).as_slice())?; + writer.write_all(encode_surrogate(s1).as_slice())?; + } + i += w; + } + } + } + + Ok(()) +} + +const fn utf8_char_width(first_byte: u8) -> usize { + const UTF8_CHAR_WIDTH: [u8; 256] = [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + ]; + + UTF8_CHAR_WIDTH[first_byte as usize] as _ +} + +fn encode_surrogate(surrogate: u16) -> [u8; 3] { + debug_assert!((0xd800..=0xdfff).contains(&surrogate)); + + const TAG_CONT_U8: u8 = 0b1000_0000u8; + [ + 0b11100000 | ((surrogate & 0b11110000_00000000) >> 12) as u8, + TAG_CONT_U8 | ((surrogate & 0b00001111_11000000) >> 6) as u8, + TAG_CONT_U8 | (surrogate & 0b00000000_00111111) as u8, + ] +} + +pub(crate) fn encoded_len(bytes: &[u8]) -> usize { + let mut n = 0; + let mut i = 0; + + while i < bytes.len() { + match bytes[i] { + // Fast path for ASCII here makes a huge difference in benchmarks. + 1..=127 => { + n += 1; + i += 1; + } + 0 => { + n += 2; + i += 1; + } + b => { + let w = utf8_char_width(b); + + if w == 4 { + n += 6; + } else { + n += w; + } + + i += w; + } + } + } + + n +} + +#[cfg(test)] +#[test] +fn equivalence() { + fn check(s: &str) { + let mut ours = vec![]; + + let theirs = cesu8::to_java_cesu8(s); + write_modified_utf8(&mut ours, s).unwrap(); + + assert_eq!(theirs, ours); + assert_eq!(theirs.len(), encoded_len(s.as_bytes())); + } + + check("Mary had a little lamb\0"); + check("šŸ¤”šŸ’©šŸ‘»šŸ’€ā˜ šŸ‘½šŸ‘¾šŸ¤–šŸŽƒšŸ˜ŗšŸ˜øšŸ˜¹šŸ˜»šŸ˜¼šŸ˜½šŸ™€šŸ˜æšŸ˜¾"); + check("Ć…Ć†Ć‡ĆˆĆ˜ĆµĆ·Ā£Ā„Ć½"); +} diff --git a/vendor/valence/crates/valence_nbt/src/binary/tests.rs b/vendor/valence/crates/valence_nbt/src/binary/tests.rs new file mode 100644 index 00000000..837487ef --- /dev/null +++ b/vendor/valence/crates/valence_nbt/src/binary/tests.rs @@ -0,0 +1,131 @@ +use crate::binary::written_size; +use crate::tag::Tag; +use crate::{compound, from_binary, to_binary, Compound, List, Value}; + +const ROOT_NAME: &str = "The root name‽"; + +#[test] +fn round_trip() { + let mut buf = vec![]; + + let compound = example_compound(); + + to_binary(&compound, &mut buf, ROOT_NAME).unwrap(); + + println!("{buf:?}"); + + let (decoded, root_name) = crate::from_binary(&mut buf.as_slice()).unwrap(); + + assert_eq!(root_name, ROOT_NAME); + assert_eq!(compound, decoded); +} + +#[test] +fn check_min_sizes() { + fn check(min_val: Value, expected_size: usize) { + /// TAG_Compound + root name + field tag + field name + TAG_End + const COMPOUND_OVERHEAD: usize = 1 + 2 + 1 + 2 + 1; + + let dbg = format!("{min_val:?}"); + let mut buf = vec![]; + + to_binary(&compound!("" => min_val), &mut buf, "").unwrap(); + + assert_eq!( + expected_size, + buf.len() - COMPOUND_OVERHEAD, + "size mismatch for {dbg}" + ); + } + + check(Value::Byte(0), 1); + check(Value::Short(0), 2); + check(Value::Int(0), 4); + check(Value::Long(0), 8); + check(Value::Float(0.0), 4); + check(Value::Double(0.0), 8); + check(Value::ByteArray([].into()), 4); + check(Value::String("".into()), 2); + check(Value::List(Vec::::new().into()), 5); + check(Value::Compound(compound!()), 1); + check(Value::IntArray([].into()), 4); + check(Value::LongArray([].into()), 4); +} + +#[test] +fn deeply_nested_compound_decode() { + let mut buf = vec![Tag::Compound as u8, 0, 0]; // Root compound + let n = 10_000; + + for _ in 0..n { + buf.extend([Tag::Compound as u8, 0, 0]); + } + + buf.extend((0..n).map(|_| Tag::End as u8)); + + buf.push(Tag::End as u8); // End root compound + + // Should not overflow the stack + let _ = from_binary::(&mut buf.as_slice()); +} + +#[test] +fn deeply_nested_list_decode() { + // Root compound with one field. + let mut buf = vec![Tag::Compound as u8, 0, 0, Tag::List as u8, 0, 0]; + let n = 10_000; + + for _ in 0..n - 1 { + buf.extend([Tag::List as u8, 0, 0, 0, 1]); // List of list + } + + // Last list is an empty list of bytes. + buf.extend([Tag::Byte as u8, 0, 0, 0, 0]); + + buf.push(Tag::End as u8); // End root compound + + // Should not overflow the stack + let _ = from_binary::(&mut buf.as_slice()); +} + +#[test] +fn correct_length() { + let c = example_compound(); + + let mut buf = vec![]; + to_binary(&c, &mut buf, "abc").unwrap(); + + assert_eq!(written_size(&c, "abc"), buf.len()); +} + +fn example_compound() -> Compound { + fn inner() -> Compound { + compound! { + "int" => i32::MIN, + "long" => i64::MAX, + "float" => 1e10_f32, + "double" => f64::INFINITY, + } + } + + compound! { + "byte" => 123_i8, + "list_of_int" => List::Int(vec![3, -7, 5]), + "list_of_string" => List::String(vec![ + "foo".to_owned(), + "bar".to_owned(), + "baz".to_owned() + ]), + "list_of_end" => List::End, + "string" => "aƩꗄ", + "compound" => inner(), + "list_of_compound" => List::Compound(vec![ + inner(), + inner(), + inner(), + ]), + "int_array" => vec![5, -9, i32::MIN, 0, i32::MAX], + "byte_array" => vec![0_i8, 2, 3], + "long_array" => vec![123_i64, 456, 789], + } +} diff --git a/vendor/valence/crates/valence_nbt/src/compound.rs b/vendor/valence/crates/valence_nbt/src/compound.rs new file mode 100644 index 00000000..636bb219 --- /dev/null +++ b/vendor/valence/crates/valence_nbt/src/compound.rs @@ -0,0 +1,688 @@ +use std::borrow::{Borrow, Cow}; +use std::fmt; +use std::hash::Hash; +use std::iter::FusedIterator; +use std::ops::{Index, IndexMut}; + +use crate::Value; + +/// A map type with [`String`] keys and [`Value`] values. +#[derive(Clone, Default)] +pub struct Compound { + map: Map, +} + +#[cfg(not(feature = "preserve_order"))] +type Map = std::collections::BTreeMap>; + +#[cfg(feature = "preserve_order")] +type Map = indexmap::IndexMap>; + +impl fmt::Debug for Compound { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.map.fmt(f) + } +} + +impl PartialEq for Compound +where + S: Ord + Hash, +{ + fn eq(&self, other: &Self) -> bool { + self.map == other.map + } +} + +#[cfg(feature = "serde")] +impl serde::Serialize for Compound +where + Str: Ord + Hash + serde::Serialize, +{ + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + self.map.serialize(serializer) + } +} + +#[cfg(feature = "serde")] +impl<'de, S> serde::Deserialize<'de> for Compound +where + S: Ord + Hash + serde::Deserialize<'de>, +{ + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + Map::::deserialize(deserializer).map(|map| Self { map }) + } + + fn deserialize_in_place(deserializer: D, place: &mut Self) -> Result<(), D::Error> + where + D: serde::Deserializer<'de>, + { + Map::::deserialize_in_place(deserializer, &mut place.map) + } +} + +impl Compound { + pub fn new() -> Self { + Self { map: Map::new() } + } + + pub fn with_capacity(cap: usize) -> Self { + Self { + #[cfg(not(feature = "preserve_order"))] + map: { + // BTreeMap does not have with_capacity. + let _ = cap; + Map::new() + }, + #[cfg(feature = "preserve_order")] + map: Map::with_capacity(cap), + } + } + + pub fn clear(&mut self) { + self.map.clear(); + } +} + +impl Compound +where + S: Ord + Hash, +{ + pub fn get(&self, k: &Q) -> Option<&Value> + where + Q: ?Sized + AsBorrowed, + >::Borrowed: Hash + Ord, + S: Borrow<>::Borrowed>, + { + self.map.get(k.as_borrowed()) + } + + pub fn contains_key(&self, k: &Q) -> bool + where + Q: ?Sized + AsBorrowed, + >::Borrowed: Hash + Ord, + S: Borrow<>::Borrowed>, + { + self.map.contains_key(k.as_borrowed()) + } + + pub fn get_mut(&mut self, k: &Q) -> Option<&mut Value> + where + Q: ?Sized + AsBorrowed, + >::Borrowed: Hash + Ord, + S: Borrow<>::Borrowed>, + { + self.map.get_mut(k.as_borrowed()) + } + + pub fn get_key_value(&self, k: &Q) -> Option<(&S, &Value)> + where + Q: ?Sized + AsBorrowed, + >::Borrowed: Hash + Ord, + S: Borrow<>::Borrowed>, + { + self.map.get_key_value(k.as_borrowed()) + } + + pub fn insert(&mut self, k: K, v: V) -> Option> + where + K: Into, + V: Into>, + { + self.map.insert(k.into(), v.into()) + } + + pub fn remove(&mut self, k: &Q) -> Option> + where + Q: ?Sized + AsBorrowed, + >::Borrowed: Hash + Ord, + S: Borrow<>::Borrowed>, + { + #[cfg(feature = "preserve_order")] + return self.swap_remove(k); + #[cfg(not(feature = "preserve_order"))] + return self.map.remove(k.as_borrowed()); + } + + #[cfg(feature = "preserve_order")] + pub fn swap_remove(&mut self, k: &Q) -> Option> + where + Q: ?Sized + AsBorrowed, + >::Borrowed: Hash + Ord, + S: Borrow<>::Borrowed>, + { + self.map.swap_remove(k.as_borrowed()) + } + + #[cfg(feature = "preserve_order")] + pub fn shift_remove(&mut self, k: &Q) -> Option> + where + Q: ?Sized + AsBorrowed, + >::Borrowed: Hash + Ord, + S: Borrow<>::Borrowed>, + { + self.map.shift_remove(k.as_borrowed()) + } + + pub fn remove_entry(&mut self, k: &Q) -> Option<(S, Value)> + where + S: Borrow, + Q: ?Sized + Ord + Hash, + { + #[cfg(feature = "preserve_order")] + return self.swap_remove_entry(k); + #[cfg(not(feature = "preserve_order"))] + return self.map.remove_entry(k); + } + + #[cfg(feature = "preserve_order")] + pub fn swap_remove_entry(&mut self, k: &Q) -> Option<(S, Value)> + where + S: Borrow, + Q: ?Sized + Ord + Hash, + { + self.map.swap_remove_entry(k) + } + + #[cfg(feature = "preserve_order")] + pub fn shift_remove_entry(&mut self, k: &Q) -> Option<(S, Value)> + where + S: Borrow, + Q: ?Sized + Ord + Hash, + { + self.map.shift_remove_entry(k) + } + + pub fn append(&mut self, other: &mut Self) { + #[cfg(not(feature = "preserve_order"))] + self.map.append(&mut other.map); + + #[cfg(feature = "preserve_order")] + for (k, v) in std::mem::take(&mut other.map) { + self.map.insert(k, v); + } + } + + pub fn entry(&mut self, k: K) -> Entry + where + K: Into, + { + #[cfg(not(feature = "preserve_order"))] + use std::collections::btree_map::Entry as EntryImpl; + + #[cfg(feature = "preserve_order")] + use indexmap::map::Entry as EntryImpl; + + match self.map.entry(k.into()) { + EntryImpl::Vacant(ve) => Entry::Vacant(VacantEntry { ve }), + EntryImpl::Occupied(oe) => Entry::Occupied(OccupiedEntry { oe }), + } + } + + pub fn len(&self) -> usize { + self.map.len() + } + + pub fn is_empty(&self) -> bool { + self.map.is_empty() + } + + pub fn iter(&self) -> Iter { + Iter { + iter: self.map.iter(), + } + } + + pub fn iter_mut(&mut self) -> IterMut { + IterMut { + iter: self.map.iter_mut(), + } + } + + pub fn keys(&self) -> Keys { + Keys { + iter: self.map.keys(), + } + } + + pub fn values(&self) -> Values { + Values { + iter: self.map.values(), + } + } + + pub fn values_mut(&mut self) -> ValuesMut { + ValuesMut { + iter: self.map.values_mut(), + } + } + + pub fn retain(&mut self, f: F) + where + F: FnMut(&S, &mut Value) -> bool, + { + self.map.retain(f) + } + + /// Inserts all items from `other` into `self` recursively. + /// + /// # Example + /// + /// ``` + /// use valence_nbt::compound; + /// + /// let mut this = compound! { + /// "foo" => 10, + /// "bar" => compound! { + /// "baz" => 20, + /// } + /// }; + /// + /// let other = compound! { + /// "foo" => 15, + /// "bar" => compound! { + /// "quux" => "hello", + /// } + /// }; + /// + /// this.merge(other); + /// + /// assert_eq!( + /// this, + /// compound! { + /// "foo" => 15, + /// "bar" => compound! { + /// "baz" => 20, + /// "quux" => "hello", + /// } + /// } + /// ); + /// ``` + pub fn merge(&mut self, other: Compound) { + for (k, v) in other { + match (self.entry(k), v) { + (Entry::Occupied(mut oe), Value::Compound(other)) => { + if let Value::Compound(this) = oe.get_mut() { + // Insert compound recursively. + this.merge(other); + } + } + (Entry::Occupied(mut oe), value) => { + oe.insert(value); + } + (Entry::Vacant(ve), value) => { + ve.insert(value); + } + } + } + } +} + +/// Trait that can be used as a key to query a compound. Basically something +/// that can be converted to a type `B` such that `S: Borrow`. +pub trait AsBorrowed { + type Borrowed: ?Sized; + + fn as_borrowed(&self) -> &Self::Borrowed; +} + +impl AsBorrowed for Q +where + String: Borrow, +{ + type Borrowed = Q; + + #[inline] + fn as_borrowed(&self) -> &Q { + self + } +} + +impl<'a, Q: ?Sized> AsBorrowed> for Q +where + Cow<'a, str>: Borrow, +{ + type Borrowed = Q; + + #[inline] + fn as_borrowed(&self) -> &Q { + self + } +} + +#[cfg(feature = "java_string")] +impl AsBorrowed for Q +where + for<'a> &'a Q: Into<&'a java_string::JavaStr>, +{ + type Borrowed = java_string::JavaStr; + + fn as_borrowed(&self) -> &Self::Borrowed { + self.into() + } +} + +#[cfg(feature = "java_string")] +impl AsBorrowed> for Q +where + for<'a> &'a Q: Into<&'a java_string::JavaStr>, +{ + type Borrowed = java_string::JavaStr; + + fn as_borrowed(&self) -> &Self::Borrowed { + self.into() + } +} + +impl Extend<(S, Value)> for Compound +where + S: Ord + Hash, +{ + fn extend(&mut self, iter: T) + where + T: IntoIterator)>, + { + self.map.extend(iter) + } +} + +impl FromIterator<(S, Value)> for Compound +where + S: Ord + Hash, +{ + fn from_iter(iter: T) -> Self + where + T: IntoIterator)>, + { + Self { + map: Map::from_iter(iter), + } + } +} + +pub enum Entry<'a, S = String> { + Vacant(VacantEntry<'a, S>), + Occupied(OccupiedEntry<'a, S>), +} + +impl<'a, S> Entry<'a, S> +where + S: Hash + Ord, +{ + pub fn key(&self) -> &S { + match self { + Entry::Vacant(ve) => ve.key(), + Entry::Occupied(oe) => oe.key(), + } + } + + pub fn or_insert(self, default: impl Into>) -> &'a mut Value { + match self { + Entry::Vacant(ve) => ve.insert(default), + Entry::Occupied(oe) => oe.into_mut(), + } + } + + pub fn or_insert_with(self, default: F) -> &'a mut Value + where + F: FnOnce() -> V, + V: Into>, + { + match self { + Entry::Vacant(ve) => ve.insert(default()), + Entry::Occupied(oe) => oe.into_mut(), + } + } + + pub fn and_modify(self, f: F) -> Self + where + F: FnOnce(&mut Value), + { + match self { + Entry::Vacant(ve) => Entry::Vacant(ve), + Entry::Occupied(mut oe) => { + f(oe.get_mut()); + Entry::Occupied(oe) + } + } + } +} + +pub struct VacantEntry<'a, S = String> { + #[cfg(not(feature = "preserve_order"))] + ve: std::collections::btree_map::VacantEntry<'a, S, Value>, + #[cfg(feature = "preserve_order")] + ve: indexmap::map::VacantEntry<'a, S, Value>, +} + +impl<'a, S> VacantEntry<'a, S> +where + S: Ord + Hash, +{ + pub fn key(&self) -> &S { + self.ve.key() + } + + pub fn insert(self, v: impl Into>) -> &'a mut Value { + self.ve.insert(v.into()) + } +} + +pub struct OccupiedEntry<'a, S = String> { + #[cfg(not(feature = "preserve_order"))] + oe: std::collections::btree_map::OccupiedEntry<'a, S, Value>, + #[cfg(feature = "preserve_order")] + oe: indexmap::map::OccupiedEntry<'a, S, Value>, +} + +impl<'a, S> OccupiedEntry<'a, S> +where + S: Hash + Ord, +{ + pub fn key(&self) -> &S { + self.oe.key() + } + + pub fn get(&self) -> &Value { + self.oe.get() + } + + pub fn get_mut(&mut self) -> &mut Value { + self.oe.get_mut() + } + + pub fn into_mut(self) -> &'a mut Value { + self.oe.into_mut() + } + + pub fn insert(&mut self, v: impl Into>) -> Value { + self.oe.insert(v.into()) + } + + pub fn remove(self) -> Value { + #[cfg(feature = "preserve_order")] + return self.swap_remove(); + #[cfg(not(feature = "preserve_order"))] + return self.oe.remove(); + } + + #[cfg(feature = "preserve_order")] + pub fn swap_remove(self) -> Value { + self.oe.swap_remove() + } + + #[cfg(feature = "preserve_order")] + pub fn shift_remove(self) -> Value { + self.oe.shift_remove() + } +} + +impl Index<&'_ Q> for Compound +where + S: Borrow + Ord + Hash, + Q: ?Sized + Ord + Hash, +{ + type Output = Value; + + fn index(&self, index: &Q) -> &Self::Output { + self.map.index(index) + } +} + +impl IndexMut<&'_ Q> for Compound +where + S: Borrow + Hash + Ord, + Q: ?Sized + Ord + Hash, +{ + fn index_mut(&mut self, index: &Q) -> &mut Self::Output { + self.map.get_mut(index).expect("no entry found for key") + } +} + +macro_rules! impl_iterator_traits { + (($name:ident $($generics:tt)*) => $item:ty) => { + impl $($generics)* Iterator for $name $($generics)* { + type Item = $item; + #[inline] + fn next(&mut self) -> Option { + self.iter.next() + } + #[inline] + fn size_hint(&self) -> (usize, Option) { + self.iter.size_hint() + } + } + + #[cfg(feature = "preserve_order")] + impl $($generics)* DoubleEndedIterator for $name $($generics)* { + #[inline] + fn next_back(&mut self) -> Option { + self.iter.next_back() + } + } + + impl $($generics)* ExactSizeIterator for $name $($generics)* { + #[inline] + fn len(&self) -> usize { + self.iter.len() + } + } + + impl $($generics)* FusedIterator for $name $($generics)* {} + } +} + +impl<'a, S> IntoIterator for &'a Compound { + type Item = (&'a S, &'a Value); + type IntoIter = Iter<'a, S>; + + fn into_iter(self) -> Self::IntoIter { + Iter { + iter: self.map.iter(), + } + } +} + +#[derive(Clone)] +pub struct Iter<'a, S = String> { + #[cfg(not(feature = "preserve_order"))] + iter: std::collections::btree_map::Iter<'a, S, Value>, + #[cfg(feature = "preserve_order")] + iter: indexmap::map::Iter<'a, S, Value>, +} + +impl_iterator_traits!((Iter<'a, S>) => (&'a S, &'a Value)); + +impl<'a, S> IntoIterator for &'a mut Compound { + type Item = (&'a S, &'a mut Value); + type IntoIter = IterMut<'a, S>; + + fn into_iter(self) -> Self::IntoIter { + IterMut { + iter: self.map.iter_mut(), + } + } +} + +pub struct IterMut<'a, S = String> { + #[cfg(not(feature = "preserve_order"))] + iter: std::collections::btree_map::IterMut<'a, S, Value>, + #[cfg(feature = "preserve_order")] + iter: indexmap::map::IterMut<'a, S, Value>, +} + +impl_iterator_traits!((IterMut<'a, S>) => (&'a S, &'a mut Value)); + +impl IntoIterator for Compound { + type Item = (S, Value); + type IntoIter = IntoIter; + + fn into_iter(self) -> Self::IntoIter { + IntoIter { + iter: self.map.into_iter(), + } + } +} + +pub struct IntoIter { + #[cfg(not(feature = "preserve_order"))] + iter: std::collections::btree_map::IntoIter>, + #[cfg(feature = "preserve_order")] + iter: indexmap::map::IntoIter>, +} + +impl_iterator_traits!((IntoIter) => (S, Value)); + +#[derive(Clone)] +pub struct Keys<'a, S = String> { + #[cfg(not(feature = "preserve_order"))] + iter: std::collections::btree_map::Keys<'a, S, Value>, + #[cfg(feature = "preserve_order")] + iter: indexmap::map::Keys<'a, S, Value>, +} + +impl_iterator_traits!((Keys<'a, S>) => &'a S); + +#[derive(Clone)] +pub struct Values<'a, S = String> { + #[cfg(not(feature = "preserve_order"))] + iter: std::collections::btree_map::Values<'a, S, Value>, + #[cfg(feature = "preserve_order")] + iter: indexmap::map::Values<'a, S, Value>, +} + +impl_iterator_traits!((Values<'a, S>) => &'a Value); + +pub struct ValuesMut<'a, S = String> { + #[cfg(not(feature = "preserve_order"))] + iter: std::collections::btree_map::ValuesMut<'a, S, Value>, + #[cfg(feature = "preserve_order")] + iter: indexmap::map::ValuesMut<'a, S, Value>, +} + +impl_iterator_traits!((ValuesMut<'a, S>) => &'a mut Value); + +#[cfg(test)] +mod tests { + #[cfg(feature = "preserve_order")] + #[test] + fn compound_preserves_order() { + use super::*; + + let letters = ["g", "b", "d", "e", "h", "z", "m", "a", "q"]; + + let mut c = Compound::::new(); + for l in letters { + c.insert(l, 0_i8); + } + + for (k, l) in c.keys().zip(letters) { + assert_eq!(k, l); + } + } +} diff --git a/vendor/valence/crates/valence_nbt/src/conv.rs b/vendor/valence/crates/valence_nbt/src/conv.rs new file mode 100644 index 00000000..9ff0bb4a --- /dev/null +++ b/vendor/valence/crates/valence_nbt/src/conv.rs @@ -0,0 +1,52 @@ +//! Zero-cost conversion functions for `valence_nbt`. +//! +//! While working with [`Value`], it is often necessary to convert between +//! collections of signed and unsigned integer types due to API +//! differences. For instance, you may be given a `&[i8]` from +//! [`Value::ByteArray`], but functions like [`Write::write_all`] expect to +//! receive a `&[u8]`. +//! +//! This module provides functions to perform conversions between these types +//! with zero-cost and no `unsafe` code on your part. +//! +//! [`Value`]: crate::Value +//! [`Value::ByteArray`]: crate::Value::ByteArray +//! [`Write::write_all`]: std::io::Write::write_all + +use std::mem::ManuallyDrop; + +/// Converts a `Vec` into a `Vec` without cloning. +#[inline] +pub fn u8_vec_into_i8_vec(vec: Vec) -> Vec { + // SAFETY: Layouts of u8 and i8 are the same and we're being careful not to drop + // the original vec after calling Vec::from_raw_parts. + unsafe { + let mut vec = ManuallyDrop::new(vec); + Vec::from_raw_parts(vec.as_mut_ptr() as *mut i8, vec.len(), vec.capacity()) + } +} + +/// Converts a `Vec` into a `Vec` without cloning. +#[inline] +pub fn i8_vec_into_u8_vec(vec: Vec) -> Vec { + // SAFETY: Layouts of u8 and i8 are the same and we're being careful not to drop + // the original vec after calling Vec::from_raw_parts. + unsafe { + let mut vec = ManuallyDrop::new(vec); + Vec::from_raw_parts(vec.as_mut_ptr() as *mut u8, vec.len(), vec.capacity()) + } +} + +/// Converts a `&[u8]` into a `&[i8]`. +#[inline] +pub fn u8_slice_as_i8_slice(slice: &[u8]) -> &[i8] { + // SAFETY: i8 has the same layout as u8. + unsafe { std::slice::from_raw_parts(slice.as_ptr() as *const i8, slice.len()) } +} + +/// Converts a `&[i8]` into a `&[u8]`. +#[inline] +pub fn i8_slice_as_u8_slice(slice: &[i8]) -> &[u8] { + // SAFETY: i8 has the same layout as u8. + unsafe { std::slice::from_raw_parts(slice.as_ptr() as *const u8, slice.len()) } +} diff --git a/vendor/valence/crates/valence_nbt/src/lib.rs b/vendor/valence/crates/valence_nbt/src/lib.rs new file mode 100644 index 00000000..f422dc9d --- /dev/null +++ b/vendor/valence/crates/valence_nbt/src/lib.rs @@ -0,0 +1,110 @@ +#![doc = include_str!("../README.md")] +#![deny( + rustdoc::broken_intra_doc_links, + rustdoc::private_intra_doc_links, + rustdoc::missing_crate_level_docs, + rustdoc::invalid_codeblock_attributes, + rustdoc::invalid_rust_codeblocks, + rustdoc::bare_urls, + rustdoc::invalid_html_tags +)] +#![warn( + trivial_casts, + trivial_numeric_casts, + unused_lifetimes, + unused_import_braces, + unreachable_pub, + clippy::dbg_macro +)] + +#[cfg(feature = "binary")] +pub use binary::{from_binary, to_binary}; +pub use compound::Compound; +pub use list::List; +pub use tag::Tag; +pub use value::Value; + +#[cfg(feature = "binary")] +pub mod binary; +pub mod compound; +pub mod conv; +pub mod list; +#[cfg(feature = "serde")] +pub mod serde; +#[cfg(feature = "snbt")] +pub mod snbt; +mod tag; +pub mod value; + +/// A convenience macro for constructing [`Compound`]s. +/// +/// Key expressions must implement `Into` while value expressions must +/// implement `Into`. +/// +/// # Examples +/// +/// ``` +/// use valence_nbt::{compound, List}; +/// +/// let c = compound! { +/// "byte" => 123_i8, +/// "list_of_int" => List::Int(vec![3, -7, 5]), +/// "list_of_string" => List::String(vec![ +/// "foo".to_owned(), +/// "bar".to_owned(), +/// "baz".to_owned() +/// ]), +/// "string" => "aƩꗄ", +/// "compound" => compound! { +/// "foo" => 1, +/// "bar" => 2, +/// "baz" => 3, +/// }, +/// "int_array" => vec![5, -9, i32::MIN, 0, i32::MAX], +/// "byte_array" => vec![0_i8, 2, 3], +/// "long_array" => vec![123_i64, 456, 789], +/// }; +/// +/// println!("{c:?}"); +/// ``` +/// +/// It is also possible to specify a custom string type like this: +/// ``` +/// # use std::borrow::Cow; +/// +/// use valence_nbt::compound; +/// +/// let c = compound! { > +/// "foo" => 123_i8, +/// }; +/// +/// println!("{c:?}"); +/// ``` +#[macro_export] +macro_rules! compound { + (<$string_type:ty> $($key:expr => $value:expr),* $(,)?) => { + <$crate::Compound<$string_type> as ::std::iter::FromIterator<($string_type, $crate::Value<$string_type>)>>::from_iter([ + $( + ( + ::std::convert::Into::<$string_type>::into($key), + ::std::convert::Into::<$crate::Value<$string_type>>::into($value) + ), + )* + ]) + }; + + ($($key:expr => $value:expr),* $(,)?) => { + compound!(<::std::string::String> $($key => $value),*) + }; +} + +/// A convenience macro for constructing [`Compound`]`<`[`JavaString`]`>`s +/// +/// [`JavaString`]: java_string::JavaString +#[cfg(feature = "java_string")] +#[macro_export] +macro_rules! jcompound { + ($($key:expr => $value:expr),* $(,)?) => { + compound!(<::java_string::JavaString> $($key => $value),*) + } +} diff --git a/vendor/valence/crates/valence_nbt/src/list.rs b/vendor/valence/crates/valence_nbt/src/list.rs new file mode 100644 index 00000000..8068d9d7 --- /dev/null +++ b/vendor/valence/crates/valence_nbt/src/list.rs @@ -0,0 +1,975 @@ +use std::borrow::Cow; +use std::hash::Hash; +use std::iter::FusedIterator; + +use crate::value::{ValueMut, ValueRef}; +use crate::{Compound, Tag, Value}; + +/// An NBT list value. +/// +/// NBT lists are homogeneous, meaning each list element must be of the same +/// type. This is opposed to a format like JSON where lists can be +/// heterogeneous. Here is a JSON list that would be illegal in NBT: +/// +/// ```json +/// [42, "hello", {}] +/// ``` +/// +/// Every possible element type has its own variant in this enum. As a result, +/// heterogeneous lists are unrepresentable. +#[derive(Clone, Default, Debug)] +pub enum List { + /// The list with the element type of `TAG_End` and length of zero. + #[default] + End, + Byte(Vec), + Short(Vec), + Int(Vec), + Long(Vec), + Float(Vec), + Double(Vec), + ByteArray(Vec>), + String(Vec), + List(Vec>), + Compound(Vec>), + IntArray(Vec>), + LongArray(Vec>), +} + +impl PartialEq for List +where + S: Ord + Hash, +{ + fn eq(&self, other: &Self) -> bool { + match self { + List::End => matches!(other, List::End), + List::Byte(list) => matches!(other, List::Byte(other_list) if list == other_list), + List::Short(list) => matches!(other, List::Short(other_list) if list == other_list), + List::Int(list) => matches!(other, List::Int(other_list) if list == other_list), + List::Long(list) => matches!(other, List::Long(other_list) if list == other_list), + List::Float(list) => matches!(other, List::Float(other_list) if list == other_list), + List::Double(list) => matches!(other, List::Double(other_list) if list == other_list), + List::ByteArray(list) => { + matches!(other, List::ByteArray(other_list) if list == other_list) + } + List::String(list) => matches!(other, List::String(other_list) if list == other_list), + List::List(list) => matches!(other, List::List(other_list) if list == other_list), + List::Compound(list) => { + matches!(other, List::Compound(other_list) if list == other_list) + } + List::IntArray(list) => { + matches!(other, List::IntArray(other_list) if list == other_list) + } + List::LongArray(list) => { + matches!(other, List::LongArray(other_list) if list == other_list) + } + } + } +} + +impl List { + /// Constructs a new empty NBT list, with the element type of `TAG_End`. + pub fn new() -> Self { + Self::End + } + + /// Returns the length of this list. + pub fn len(&self) -> usize { + match self { + List::End => 0, + List::Byte(l) => l.len(), + List::Short(l) => l.len(), + List::Int(l) => l.len(), + List::Long(l) => l.len(), + List::Float(l) => l.len(), + List::Double(l) => l.len(), + List::ByteArray(l) => l.len(), + List::String(l) => l.len(), + List::List(l) => l.len(), + List::Compound(l) => l.len(), + List::IntArray(l) => l.len(), + List::LongArray(l) => l.len(), + } + } + + /// Returns `true` if this list has no elements. `false` otherwise. + pub fn is_empty(&self) -> bool { + self.len() == 0 + } + + /// Returns the element type of this list. + pub fn element_tag(&self) -> Tag { + match self { + List::End => Tag::End, + List::Byte(_) => Tag::Byte, + List::Short(_) => Tag::Short, + List::Int(_) => Tag::Int, + List::Long(_) => Tag::Long, + List::Float(_) => Tag::Float, + List::Double(_) => Tag::Double, + List::ByteArray(_) => Tag::ByteArray, + List::String(_) => Tag::String, + List::List(_) => Tag::List, + List::Compound(_) => Tag::Compound, + List::IntArray(_) => Tag::IntArray, + List::LongArray(_) => Tag::LongArray, + } + } + + /// Gets a reference to the value at the given index in this list, or `None` + /// if the index is out of bounds. + pub fn get(&self, index: usize) -> Option> { + match self { + List::End => None, + List::Byte(list) => list.get(index).map(ValueRef::Byte), + List::Short(list) => list.get(index).map(ValueRef::Short), + List::Int(list) => list.get(index).map(ValueRef::Int), + List::Long(list) => list.get(index).map(ValueRef::Long), + List::Float(list) => list.get(index).map(ValueRef::Float), + List::Double(list) => list.get(index).map(ValueRef::Double), + List::ByteArray(list) => list.get(index).map(|arr| ValueRef::ByteArray(&arr[..])), + List::String(list) => list.get(index).map(ValueRef::String), + List::List(list) => list.get(index).map(ValueRef::List), + List::Compound(list) => list.get(index).map(ValueRef::Compound), + List::IntArray(list) => list.get(index).map(|arr| ValueRef::IntArray(&arr[..])), + List::LongArray(list) => list.get(index).map(|arr| ValueRef::LongArray(&arr[..])), + } + } + + /// Gets a mutable reference to the value at the given index in this list, + /// or `None` if the index is out of bounds. + pub fn get_mut(&mut self, index: usize) -> Option> { + match self { + List::End => None, + List::Byte(list) => list.get_mut(index).map(ValueMut::Byte), + List::Short(list) => list.get_mut(index).map(ValueMut::Short), + List::Int(list) => list.get_mut(index).map(ValueMut::Int), + List::Long(list) => list.get_mut(index).map(ValueMut::Long), + List::Float(list) => list.get_mut(index).map(ValueMut::Float), + List::Double(list) => list.get_mut(index).map(ValueMut::Double), + List::ByteArray(list) => list.get_mut(index).map(ValueMut::ByteArray), + List::String(list) => list.get_mut(index).map(ValueMut::String), + List::List(list) => list.get_mut(index).map(ValueMut::List), + List::Compound(list) => list.get_mut(index).map(ValueMut::Compound), + List::IntArray(list) => list.get_mut(index).map(ValueMut::IntArray), + List::LongArray(list) => list.get_mut(index).map(ValueMut::LongArray), + } + } + + /// Attempts to add the given value to the end of this list, failing if + /// adding the value would result in the list not being heterogeneous (have + /// multiple types inside it). Returns `true` if the value was added, + /// `false` otherwise. + #[must_use] + pub fn try_push(&mut self, value: impl Into>) -> bool { + let value = value.into(); + match self { + List::End => { + *self = List::from(value); + true + } + List::Byte(list) => { + if let Value::Byte(value) = value { + list.push(value); + true + } else { + false + } + } + List::Short(list) => { + if let Value::Short(value) = value { + list.push(value); + true + } else { + false + } + } + List::Int(list) => { + if let Value::Int(value) = value { + list.push(value); + true + } else { + false + } + } + List::Long(list) => { + if let Value::Long(value) = value { + list.push(value); + true + } else { + false + } + } + List::Float(list) => { + if let Value::Float(value) = value { + list.push(value); + true + } else { + false + } + } + List::Double(list) => { + if let Value::Double(value) = value { + list.push(value); + true + } else { + false + } + } + List::ByteArray(list) => { + if let Value::ByteArray(value) = value { + list.push(value); + true + } else { + false + } + } + List::String(list) => { + if let Value::String(value) = value { + list.push(value); + true + } else { + false + } + } + List::List(list) => { + if let Value::List(value) = value { + list.push(value); + true + } else { + false + } + } + List::Compound(list) => { + if let Value::Compound(value) = value { + list.push(value); + true + } else { + false + } + } + List::IntArray(list) => { + if let Value::IntArray(value) = value { + list.push(value); + true + } else { + false + } + } + List::LongArray(list) => { + if let Value::LongArray(value) = value { + list.push(value); + true + } else { + false + } + } + } + } + + /// Attempts to insert the given value at the given index in this list, + /// failing if adding the value would result in the list not being + /// heterogeneous (have multiple types inside it). Returns `true` if the + /// value was added, `false` otherwise. + /// + /// # Panics + /// + /// Panics if the index is greater than the length of the list. + #[must_use] + pub fn try_insert(&mut self, index: usize, value: impl Into>) -> bool { + let value = value.into(); + + #[cold] + #[inline(never)] + fn assert_failed(index: usize, len: usize) -> ! { + panic!("insertion index (is {index}) should be <= len (is {len})"); + } + + match self { + List::End => { + if index > 0 { + assert_failed(index, 0); + } + *self = List::from(value); + true + } + List::Byte(list) => { + if let Value::Byte(value) = value { + list.insert(index, value); + true + } else { + false + } + } + List::Short(list) => { + if let Value::Short(value) = value { + list.insert(index, value); + true + } else { + false + } + } + List::Int(list) => { + if let Value::Int(value) = value { + list.insert(index, value); + true + } else { + false + } + } + List::Long(list) => { + if let Value::Long(value) = value { + list.insert(index, value); + true + } else { + false + } + } + List::Float(list) => { + if let Value::Float(value) = value { + list.insert(index, value); + true + } else { + false + } + } + List::Double(list) => { + if let Value::Double(value) = value { + list.insert(index, value); + true + } else { + false + } + } + List::ByteArray(list) => { + if let Value::ByteArray(value) = value { + list.insert(index, value); + true + } else { + false + } + } + List::String(list) => { + if let Value::String(value) = value { + list.insert(index, value); + true + } else { + false + } + } + List::List(list) => { + if let Value::List(value) = value { + list.insert(index, value); + true + } else { + false + } + } + List::Compound(list) => { + if let Value::Compound(value) = value { + list.insert(index, value); + true + } else { + false + } + } + List::IntArray(list) => { + if let Value::IntArray(value) = value { + list.insert(index, value); + true + } else { + false + } + } + List::LongArray(list) => { + if let Value::LongArray(value) = value { + list.insert(index, value); + true + } else { + false + } + } + } + } + + /// Removes the element at the given index in the list, and returns the + /// value removed. + /// + /// # Panics + /// + /// Panics if `index` is out of bounds. + #[track_caller] + pub fn remove(&mut self, index: usize) -> Value { + #[cold] + #[inline(never)] + #[track_caller] + fn assert_failed(index: usize, len: usize) -> ! { + panic!("removal index (is {index}) should be < len (is {len})"); + } + + let removed = match self { + List::End => assert_failed(index, 0), + List::Byte(list) => Value::Byte(list.remove(index)), + List::Short(list) => Value::Short(list.remove(index)), + List::Int(list) => Value::Int(list.remove(index)), + List::Long(list) => Value::Long(list.remove(index)), + List::Float(list) => Value::Float(list.remove(index)), + List::Double(list) => Value::Double(list.remove(index)), + List::ByteArray(list) => Value::ByteArray(list.remove(index)), + List::String(list) => Value::String(list.remove(index)), + List::List(list) => Value::List(list.remove(index)), + List::Compound(list) => Value::Compound(list.remove(index)), + List::IntArray(list) => Value::IntArray(list.remove(index)), + List::LongArray(list) => Value::LongArray(list.remove(index)), + }; + + if self.is_empty() { + *self = List::End; + } + + removed + } + + /// Returns only the elements specified by the predicate, passing a mutable + /// reference to it. + /// + /// In other words, removes all elements `e` such that `f(ValueMut(&mut e))` + /// returns `false`. This method operates in place, visiting each element + /// exactly once in the original order, and preserves the order of the + /// retained elements. + pub fn retain(&mut self, mut f: F) + where + F: FnMut(ValueMut) -> bool, + { + match self { + List::End => {} + List::Byte(list) => list.retain_mut(|v| f(ValueMut::Byte(v))), + List::Short(list) => list.retain_mut(|v| f(ValueMut::Short(v))), + List::Int(list) => list.retain_mut(|v| f(ValueMut::Int(v))), + List::Long(list) => list.retain_mut(|v| f(ValueMut::Long(v))), + List::Float(list) => list.retain_mut(|v| f(ValueMut::Float(v))), + List::Double(list) => list.retain_mut(|v| f(ValueMut::Double(v))), + List::ByteArray(list) => list.retain_mut(|v| f(ValueMut::ByteArray(v))), + List::String(list) => list.retain_mut(|v| f(ValueMut::String(v))), + List::List(list) => list.retain_mut(|v| f(ValueMut::List(v))), + List::Compound(list) => list.retain_mut(|v| f(ValueMut::Compound(v))), + List::IntArray(list) => list.retain_mut(|v| f(ValueMut::IntArray(v))), + List::LongArray(list) => list.retain_mut(|v| f(ValueMut::LongArray(v))), + } + + if self.is_empty() { + *self = List::End; + } + } + + /// Returns an iterator over this list. This iterator yields [`ValueRef`]s. + pub fn iter(&self) -> Iter { + Iter { + inner: match self { + List::End => IterInner::End, + List::Byte(list) => IterInner::Byte(list.iter()), + List::Short(list) => IterInner::Short(list.iter()), + List::Int(list) => IterInner::Int(list.iter()), + List::Long(list) => IterInner::Long(list.iter()), + List::Float(list) => IterInner::Float(list.iter()), + List::Double(list) => IterInner::Double(list.iter()), + List::ByteArray(list) => IterInner::ByteArray(list.iter()), + List::String(list) => IterInner::String(list.iter()), + List::List(list) => IterInner::List(list.iter()), + List::Compound(list) => IterInner::Compound(list.iter()), + List::IntArray(list) => IterInner::IntArray(list.iter()), + List::LongArray(list) => IterInner::LongArray(list.iter()), + }, + } + } + + /// Returns a mutable iterator over this list. This iterator yields + /// [`ValueMut`]s. + pub fn iter_mut(&mut self) -> IterMut { + IterMut { + inner: match self { + List::End => IterMutInner::End, + List::Byte(list) => IterMutInner::Byte(list.iter_mut()), + List::Short(list) => IterMutInner::Short(list.iter_mut()), + List::Int(list) => IterMutInner::Int(list.iter_mut()), + List::Long(list) => IterMutInner::Long(list.iter_mut()), + List::Float(list) => IterMutInner::Float(list.iter_mut()), + List::Double(list) => IterMutInner::Double(list.iter_mut()), + List::ByteArray(list) => IterMutInner::ByteArray(list.iter_mut()), + List::String(list) => IterMutInner::String(list.iter_mut()), + List::List(list) => IterMutInner::List(list.iter_mut()), + List::Compound(list) => IterMutInner::Compound(list.iter_mut()), + List::IntArray(list) => IterMutInner::IntArray(list.iter_mut()), + List::LongArray(list) => IterMutInner::LongArray(list.iter_mut()), + }, + } + } +} + +impl From> for List { + fn from(v: Vec) -> Self { + List::Byte(v) + } +} + +impl From> for List { + fn from(v: Vec) -> Self { + List::Short(v) + } +} + +impl From> for List { + fn from(v: Vec) -> Self { + List::Int(v) + } +} + +impl From> for List { + fn from(v: Vec) -> Self { + List::Long(v) + } +} + +impl From> for List { + fn from(v: Vec) -> Self { + List::Float(v) + } +} + +impl From> for List { + fn from(v: Vec) -> Self { + List::Double(v) + } +} + +impl From>> for List { + fn from(v: Vec>) -> Self { + List::ByteArray(v) + } +} + +impl From> for List { + fn from(v: Vec) -> Self { + List::String(v) + } +} + +impl<'a> From>> for List> { + fn from(v: Vec>) -> Self { + List::String(v) + } +} + +#[cfg(feature = "java_string")] +impl From> for List { + fn from(v: Vec) -> Self { + List::String(v) + } +} + +#[cfg(feature = "java_string")] +impl<'a> From>> for List> { + fn from(v: Vec>) -> Self { + List::String(v) + } +} + +impl From>> for List { + fn from(v: Vec>) -> Self { + List::List(v) + } +} + +impl From>> for List { + fn from(v: Vec>) -> Self { + List::Compound(v) + } +} + +impl From>> for List { + fn from(v: Vec>) -> Self { + List::IntArray(v) + } +} + +impl From>> for List { + fn from(v: Vec>) -> Self { + List::LongArray(v) + } +} + +/// Converts a value to a singleton list. +impl From> for List { + fn from(value: Value) -> Self { + match value { + Value::Byte(v) => List::Byte(vec![v]), + Value::Short(v) => List::Short(vec![v]), + Value::Int(v) => List::Int(vec![v]), + Value::Long(v) => List::Long(vec![v]), + Value::Float(v) => List::Float(vec![v]), + Value::Double(v) => List::Double(vec![v]), + Value::ByteArray(v) => List::ByteArray(vec![v]), + Value::String(v) => List::String(vec![v]), + Value::List(v) => List::List(vec![v]), + Value::Compound(v) => List::Compound(vec![v]), + Value::IntArray(v) => List::IntArray(vec![v]), + Value::LongArray(v) => List::LongArray(vec![v]), + } + } +} + +impl IntoIterator for List { + type Item = Value; + type IntoIter = IntoIter; + + fn into_iter(self) -> Self::IntoIter { + IntoIter { + inner: match self { + List::End => IntoIterInner::End, + List::Byte(list) => IntoIterInner::Byte(list.into_iter()), + List::Short(list) => IntoIterInner::Short(list.into_iter()), + List::Int(list) => IntoIterInner::Int(list.into_iter()), + List::Long(list) => IntoIterInner::Long(list.into_iter()), + List::Float(list) => IntoIterInner::Float(list.into_iter()), + List::Double(list) => IntoIterInner::Double(list.into_iter()), + List::ByteArray(list) => IntoIterInner::ByteArray(list.into_iter()), + List::String(list) => IntoIterInner::String(list.into_iter()), + List::List(list) => IntoIterInner::List(list.into_iter()), + List::Compound(list) => IntoIterInner::Compound(list.into_iter()), + List::IntArray(list) => IntoIterInner::IntArray(list.into_iter()), + List::LongArray(list) => IntoIterInner::LongArray(list.into_iter()), + }, + } + } +} + +impl<'a, S> IntoIterator for &'a List { + type Item = ValueRef<'a, S>; + type IntoIter = Iter<'a, S>; + + fn into_iter(self) -> Self::IntoIter { + self.iter() + } +} + +impl<'a, S> IntoIterator for &'a mut List { + type Item = ValueMut<'a, S>; + type IntoIter = IterMut<'a, S>; + + fn into_iter(self) -> Self::IntoIter { + self.iter_mut() + } +} + +/// The owned iterator type for [`List`]. +pub struct IntoIter { + inner: IntoIterInner, +} + +enum IntoIterInner { + End, + Byte(std::vec::IntoIter), + Short(std::vec::IntoIter), + Int(std::vec::IntoIter), + Long(std::vec::IntoIter), + Float(std::vec::IntoIter), + Double(std::vec::IntoIter), + ByteArray(std::vec::IntoIter>), + String(std::vec::IntoIter), + List(std::vec::IntoIter>), + Compound(std::vec::IntoIter>), + IntArray(std::vec::IntoIter>), + LongArray(std::vec::IntoIter>), +} + +impl Iterator for IntoIter { + type Item = Value; + + fn next(&mut self) -> Option { + match self.inner { + IntoIterInner::End => None, + IntoIterInner::Byte(ref mut i) => i.next().map(Value::Byte), + IntoIterInner::Short(ref mut i) => i.next().map(Value::Short), + IntoIterInner::Int(ref mut i) => i.next().map(Value::Int), + IntoIterInner::Long(ref mut i) => i.next().map(Value::Long), + IntoIterInner::Float(ref mut i) => i.next().map(Value::Float), + IntoIterInner::Double(ref mut i) => i.next().map(Value::Double), + IntoIterInner::ByteArray(ref mut i) => i.next().map(Value::ByteArray), + IntoIterInner::String(ref mut i) => i.next().map(Value::String), + IntoIterInner::List(ref mut i) => i.next().map(Value::List), + IntoIterInner::Compound(ref mut i) => i.next().map(Value::Compound), + IntoIterInner::IntArray(ref mut i) => i.next().map(Value::IntArray), + IntoIterInner::LongArray(ref mut i) => i.next().map(Value::LongArray), + } + } + + fn size_hint(&self) -> (usize, Option) { + match self.inner { + IntoIterInner::End => (0, Some(0)), + IntoIterInner::Byte(ref i) => i.size_hint(), + IntoIterInner::Short(ref i) => i.size_hint(), + IntoIterInner::Int(ref i) => i.size_hint(), + IntoIterInner::Long(ref i) => i.size_hint(), + IntoIterInner::Float(ref i) => i.size_hint(), + IntoIterInner::Double(ref i) => i.size_hint(), + IntoIterInner::ByteArray(ref i) => i.size_hint(), + IntoIterInner::String(ref i) => i.size_hint(), + IntoIterInner::List(ref i) => i.size_hint(), + IntoIterInner::Compound(ref i) => i.size_hint(), + IntoIterInner::IntArray(ref i) => i.size_hint(), + IntoIterInner::LongArray(ref i) => i.size_hint(), + } + } +} + +impl DoubleEndedIterator for IntoIter { + fn next_back(&mut self) -> Option { + match self.inner { + IntoIterInner::End => None, + IntoIterInner::Byte(ref mut i) => i.next_back().map(Value::Byte), + IntoIterInner::Short(ref mut i) => i.next_back().map(Value::Short), + IntoIterInner::Int(ref mut i) => i.next_back().map(Value::Int), + IntoIterInner::Long(ref mut i) => i.next_back().map(Value::Long), + IntoIterInner::Float(ref mut i) => i.next_back().map(Value::Float), + IntoIterInner::Double(ref mut i) => i.next_back().map(Value::Double), + IntoIterInner::ByteArray(ref mut i) => i.next_back().map(Value::ByteArray), + IntoIterInner::String(ref mut i) => i.next_back().map(Value::String), + IntoIterInner::List(ref mut i) => i.next_back().map(Value::List), + IntoIterInner::Compound(ref mut i) => i.next_back().map(Value::Compound), + IntoIterInner::IntArray(ref mut i) => i.next_back().map(Value::IntArray), + IntoIterInner::LongArray(ref mut i) => i.next_back().map(Value::LongArray), + } + } +} + +impl ExactSizeIterator for IntoIter { + fn len(&self) -> usize { + match self.inner { + IntoIterInner::End => 0, + IntoIterInner::Byte(ref i) => i.len(), + IntoIterInner::Short(ref i) => i.len(), + IntoIterInner::Int(ref i) => i.len(), + IntoIterInner::Long(ref i) => i.len(), + IntoIterInner::Float(ref i) => i.len(), + IntoIterInner::Double(ref i) => i.len(), + IntoIterInner::ByteArray(ref i) => i.len(), + IntoIterInner::String(ref i) => i.len(), + IntoIterInner::List(ref i) => i.len(), + IntoIterInner::Compound(ref i) => i.len(), + IntoIterInner::IntArray(ref i) => i.len(), + IntoIterInner::LongArray(ref i) => i.len(), + } + } +} + +impl FusedIterator for IntoIter {} + +/// The borrowing iterator type for [`List`]. +pub struct Iter<'a, S = String> { + inner: IterInner<'a, S>, +} + +enum IterInner<'a, S> { + End, + Byte(std::slice::Iter<'a, i8>), + Short(std::slice::Iter<'a, i16>), + Int(std::slice::Iter<'a, i32>), + Long(std::slice::Iter<'a, i64>), + Float(std::slice::Iter<'a, f32>), + Double(std::slice::Iter<'a, f64>), + ByteArray(std::slice::Iter<'a, Vec>), + String(std::slice::Iter<'a, S>), + List(std::slice::Iter<'a, List>), + Compound(std::slice::Iter<'a, Compound>), + IntArray(std::slice::Iter<'a, Vec>), + LongArray(std::slice::Iter<'a, Vec>), +} + +impl<'a, S> Iterator for Iter<'a, S> { + type Item = ValueRef<'a, S>; + + fn next(&mut self) -> Option { + match self.inner { + IterInner::End => None, + IterInner::Byte(ref mut i) => i.next().map(ValueRef::Byte), + IterInner::Short(ref mut i) => i.next().map(ValueRef::Short), + IterInner::Int(ref mut i) => i.next().map(ValueRef::Int), + IterInner::Long(ref mut i) => i.next().map(ValueRef::Long), + IterInner::Float(ref mut i) => i.next().map(ValueRef::Float), + IterInner::Double(ref mut i) => i.next().map(ValueRef::Double), + IterInner::ByteArray(ref mut i) => i.next().map(|arr| ValueRef::ByteArray(&arr[..])), + IterInner::String(ref mut i) => i.next().map(ValueRef::String), + IterInner::List(ref mut i) => i.next().map(ValueRef::List), + IterInner::Compound(ref mut i) => i.next().map(ValueRef::Compound), + IterInner::IntArray(ref mut i) => i.next().map(|arr| ValueRef::IntArray(&arr[..])), + IterInner::LongArray(ref mut i) => i.next().map(|arr| ValueRef::LongArray(&arr[..])), + } + } + + fn size_hint(&self) -> (usize, Option) { + match self.inner { + IterInner::End => (0, Some(0)), + IterInner::Byte(ref i) => i.size_hint(), + IterInner::Short(ref i) => i.size_hint(), + IterInner::Int(ref i) => i.size_hint(), + IterInner::Long(ref i) => i.size_hint(), + IterInner::Float(ref i) => i.size_hint(), + IterInner::Double(ref i) => i.size_hint(), + IterInner::ByteArray(ref i) => i.size_hint(), + IterInner::String(ref i) => i.size_hint(), + IterInner::List(ref i) => i.size_hint(), + IterInner::Compound(ref i) => i.size_hint(), + IterInner::IntArray(ref i) => i.size_hint(), + IterInner::LongArray(ref i) => i.size_hint(), + } + } +} + +impl DoubleEndedIterator for Iter<'_, S> { + fn next_back(&mut self) -> Option { + match self.inner { + IterInner::End => None, + IterInner::Byte(ref mut i) => i.next_back().map(ValueRef::Byte), + IterInner::Short(ref mut i) => i.next_back().map(ValueRef::Short), + IterInner::Int(ref mut i) => i.next_back().map(ValueRef::Int), + IterInner::Long(ref mut i) => i.next_back().map(ValueRef::Long), + IterInner::Float(ref mut i) => i.next_back().map(ValueRef::Float), + IterInner::Double(ref mut i) => i.next_back().map(ValueRef::Double), + IterInner::ByteArray(ref mut i) => { + i.next_back().map(|arr| ValueRef::ByteArray(&arr[..])) + } + IterInner::String(ref mut i) => i.next_back().map(ValueRef::String), + IterInner::List(ref mut i) => i.next_back().map(ValueRef::List), + IterInner::Compound(ref mut i) => i.next_back().map(ValueRef::Compound), + IterInner::IntArray(ref mut i) => i.next_back().map(|arr| ValueRef::IntArray(&arr[..])), + IterInner::LongArray(ref mut i) => { + i.next_back().map(|arr| ValueRef::LongArray(&arr[..])) + } + } + } +} + +impl ExactSizeIterator for Iter<'_, S> { + fn len(&self) -> usize { + match self.inner { + IterInner::End => 0, + IterInner::Byte(ref i) => i.len(), + IterInner::Short(ref i) => i.len(), + IterInner::Int(ref i) => i.len(), + IterInner::Long(ref i) => i.len(), + IterInner::Float(ref i) => i.len(), + IterInner::Double(ref i) => i.len(), + IterInner::ByteArray(ref i) => i.len(), + IterInner::String(ref i) => i.len(), + IterInner::List(ref i) => i.len(), + IterInner::Compound(ref i) => i.len(), + IterInner::IntArray(ref i) => i.len(), + IterInner::LongArray(ref i) => i.len(), + } + } +} + +impl FusedIterator for Iter<'_, S> {} + +/// The mutable borrowing iterator type for [`List`]. +pub struct IterMut<'a, S = String> { + inner: IterMutInner<'a, S>, +} + +enum IterMutInner<'a, S> { + End, + Byte(std::slice::IterMut<'a, i8>), + Short(std::slice::IterMut<'a, i16>), + Int(std::slice::IterMut<'a, i32>), + Long(std::slice::IterMut<'a, i64>), + Float(std::slice::IterMut<'a, f32>), + Double(std::slice::IterMut<'a, f64>), + ByteArray(std::slice::IterMut<'a, Vec>), + String(std::slice::IterMut<'a, S>), + List(std::slice::IterMut<'a, List>), + Compound(std::slice::IterMut<'a, Compound>), + IntArray(std::slice::IterMut<'a, Vec>), + LongArray(std::slice::IterMut<'a, Vec>), +} + +impl<'a, S> Iterator for IterMut<'a, S> { + type Item = ValueMut<'a, S>; + + fn next(&mut self) -> Option { + match self.inner { + IterMutInner::End => None, + IterMutInner::Byte(ref mut i) => i.next().map(ValueMut::Byte), + IterMutInner::Short(ref mut i) => i.next().map(ValueMut::Short), + IterMutInner::Int(ref mut i) => i.next().map(ValueMut::Int), + IterMutInner::Long(ref mut i) => i.next().map(ValueMut::Long), + IterMutInner::Float(ref mut i) => i.next().map(ValueMut::Float), + IterMutInner::Double(ref mut i) => i.next().map(ValueMut::Double), + IterMutInner::ByteArray(ref mut i) => i.next().map(ValueMut::ByteArray), + IterMutInner::String(ref mut i) => i.next().map(ValueMut::String), + IterMutInner::List(ref mut i) => i.next().map(ValueMut::List), + IterMutInner::Compound(ref mut i) => i.next().map(ValueMut::Compound), + IterMutInner::IntArray(ref mut i) => i.next().map(ValueMut::IntArray), + IterMutInner::LongArray(ref mut i) => i.next().map(ValueMut::LongArray), + } + } + + fn size_hint(&self) -> (usize, Option) { + match self.inner { + IterMutInner::End => (0, Some(0)), + IterMutInner::Byte(ref i) => i.size_hint(), + IterMutInner::Short(ref i) => i.size_hint(), + IterMutInner::Int(ref i) => i.size_hint(), + IterMutInner::Long(ref i) => i.size_hint(), + IterMutInner::Float(ref i) => i.size_hint(), + IterMutInner::Double(ref i) => i.size_hint(), + IterMutInner::ByteArray(ref i) => i.size_hint(), + IterMutInner::String(ref i) => i.size_hint(), + IterMutInner::List(ref i) => i.size_hint(), + IterMutInner::Compound(ref i) => i.size_hint(), + IterMutInner::IntArray(ref i) => i.size_hint(), + IterMutInner::LongArray(ref i) => i.size_hint(), + } + } +} + +impl DoubleEndedIterator for IterMut<'_, S> { + fn next_back(&mut self) -> Option { + match self.inner { + IterMutInner::End => None, + IterMutInner::Byte(ref mut i) => i.next_back().map(ValueMut::Byte), + IterMutInner::Short(ref mut i) => i.next_back().map(ValueMut::Short), + IterMutInner::Int(ref mut i) => i.next_back().map(ValueMut::Int), + IterMutInner::Long(ref mut i) => i.next_back().map(ValueMut::Long), + IterMutInner::Float(ref mut i) => i.next_back().map(ValueMut::Float), + IterMutInner::Double(ref mut i) => i.next_back().map(ValueMut::Double), + IterMutInner::ByteArray(ref mut i) => i.next_back().map(ValueMut::ByteArray), + IterMutInner::String(ref mut i) => i.next_back().map(ValueMut::String), + IterMutInner::List(ref mut i) => i.next_back().map(ValueMut::List), + IterMutInner::Compound(ref mut i) => i.next_back().map(ValueMut::Compound), + IterMutInner::IntArray(ref mut i) => i.next_back().map(ValueMut::IntArray), + IterMutInner::LongArray(ref mut i) => i.next_back().map(ValueMut::LongArray), + } + } +} + +impl ExactSizeIterator for IterMut<'_, S> { + fn len(&self) -> usize { + match self.inner { + IterMutInner::End => 0, + IterMutInner::Byte(ref i) => i.len(), + IterMutInner::Short(ref i) => i.len(), + IterMutInner::Int(ref i) => i.len(), + IterMutInner::Long(ref i) => i.len(), + IterMutInner::Float(ref i) => i.len(), + IterMutInner::Double(ref i) => i.len(), + IterMutInner::ByteArray(ref i) => i.len(), + IterMutInner::String(ref i) => i.len(), + IterMutInner::List(ref i) => i.len(), + IterMutInner::Compound(ref i) => i.len(), + IterMutInner::IntArray(ref i) => i.len(), + IterMutInner::LongArray(ref i) => i.len(), + } + } +} + +impl FusedIterator for IterMut<'_, S> {} diff --git a/vendor/valence/crates/valence_nbt/src/serde.rs b/vendor/valence/crates/valence_nbt/src/serde.rs new file mode 100644 index 00000000..8159f5d7 --- /dev/null +++ b/vendor/valence/crates/valence_nbt/src/serde.rs @@ -0,0 +1,39 @@ +use std::fmt; + +pub use ser::*; +use thiserror::Error; + +mod de; +mod ser; +#[cfg(test)] +mod tests; + +/// Errors that can occur while serializing or deserializing. +#[derive(Clone, Error, Debug)] +#[error("{0}")] + +pub struct Error(Box); + +impl Error { + fn new(s: impl Into>) -> Self { + Self(s.into()) + } +} + +impl serde::de::Error for Error { + fn custom(msg: T) -> Self + where + T: fmt::Display, + { + Self::new(format!("{msg}")) + } +} + +impl serde::ser::Error for Error { + fn custom(msg: T) -> Self + where + T: fmt::Display, + { + Self::new(format!("{msg}")) + } +} diff --git a/vendor/valence/crates/valence_nbt/src/serde/de.rs b/vendor/valence/crates/valence_nbt/src/serde/de.rs new file mode 100644 index 00000000..0c5b280f --- /dev/null +++ b/vendor/valence/crates/valence_nbt/src/serde/de.rs @@ -0,0 +1,393 @@ +use std::fmt; +use std::hash::Hash; +use std::marker::PhantomData; + +use serde::de::value::{ + MapAccessDeserializer, MapDeserializer, SeqAccessDeserializer, StrDeserializer, + StringDeserializer, +}; +use serde::de::{self, IntoDeserializer, SeqAccess, Visitor}; +use serde::{forward_to_deserialize_any, Deserialize, Deserializer}; + +use super::Error; +use crate::conv::{i8_vec_into_u8_vec, u8_slice_as_i8_slice, u8_vec_into_i8_vec}; +use crate::{Compound, List, Value}; + +impl<'de, S> Deserialize<'de> for Value +where + S: Deserialize<'de> + Ord + Hash, +{ + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + struct ValueVisitor(PhantomData); + + impl<'de, S> Visitor<'de> for ValueVisitor + where + S: Deserialize<'de> + Ord + Hash, + { + type Value = Value; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + write!(formatter, "a valid NBT type") + } + + fn visit_bool(self, v: bool) -> Result + where + E: de::Error, + { + Ok(Value::Byte(v as _)) + } + + fn visit_i8(self, v: i8) -> Result + where + E: de::Error, + { + Ok(Value::Byte(v)) + } + + fn visit_i16(self, v: i16) -> Result + where + E: de::Error, + { + Ok(Value::Short(v)) + } + + fn visit_i32(self, v: i32) -> Result + where + E: de::Error, + { + Ok(Value::Int(v)) + } + + fn visit_i64(self, v: i64) -> Result + where + E: de::Error, + { + Ok(Value::Long(v)) + } + + fn visit_u8(self, v: u8) -> Result + where + E: de::Error, + { + Ok(Value::Byte(v as _)) + } + + fn visit_u16(self, v: u16) -> Result + where + E: de::Error, + { + Ok(Value::Short(v as _)) + } + + fn visit_u32(self, v: u32) -> Result + where + E: de::Error, + { + Ok(Value::Int(v as _)) + } + + fn visit_u64(self, v: u64) -> Result + where + E: de::Error, + { + Ok(Value::Long(v as _)) + } + + fn visit_f32(self, v: f32) -> Result + where + E: de::Error, + { + Ok(Value::Float(v)) + } + + fn visit_f64(self, v: f64) -> Result + where + E: de::Error, + { + Ok(Value::Double(v)) + } + + fn visit_str(self, v: &str) -> Result + where + E: de::Error, + { + S::deserialize(StrDeserializer::new(v)).map(Value::String) + } + + fn visit_string(self, v: String) -> Result + where + E: de::Error, + { + S::deserialize(StringDeserializer::new(v)).map(Value::String) + } + + fn visit_bytes(self, v: &[u8]) -> Result + where + E: de::Error, + { + Ok(Value::ByteArray(u8_slice_as_i8_slice(v).into())) + } + + fn visit_byte_buf(self, v: Vec) -> Result + where + E: de::Error, + { + Ok(Value::ByteArray(u8_vec_into_i8_vec(v))) + } + + fn visit_seq(self, seq: A) -> Result + where + A: de::SeqAccess<'de>, + { + Ok(List::deserialize(SeqAccessDeserializer::new(seq))?.into()) + } + + fn visit_map(self, map: A) -> Result + where + A: de::MapAccess<'de>, + { + Ok(Compound::deserialize(MapAccessDeserializer::new(map))?.into()) + } + } + + deserializer.deserialize_any(ValueVisitor::(PhantomData)) + } +} + +impl<'de, S> Deserialize<'de> for List +where + S: Deserialize<'de> + Ord + Hash, +{ + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + struct ListVisitor(PhantomData); + + impl<'de, S> Visitor<'de> for ListVisitor + where + S: Deserialize<'de> + Ord + Hash, + { + type Value = List; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + write!(formatter, "a sequence or bytes") + } + + fn visit_seq(self, mut seq: A) -> Result + where + A: de::SeqAccess<'de>, + { + match seq.next_element::>()? { + Some(v) => match v { + Value::Byte(v) => deserialize_seq_remainder(v, seq, From::from), + Value::Short(v) => deserialize_seq_remainder(v, seq, From::from), + Value::Int(v) => deserialize_seq_remainder(v, seq, From::from), + Value::Long(v) => deserialize_seq_remainder(v, seq, From::from), + Value::Float(v) => deserialize_seq_remainder(v, seq, From::from), + Value::Double(v) => deserialize_seq_remainder(v, seq, From::from), + Value::ByteArray(v) => deserialize_seq_remainder(v, seq, From::from), + Value::String(v) => deserialize_seq_remainder(v, seq, List::String), + Value::List(v) => deserialize_seq_remainder(v, seq, From::from), + Value::Compound(v) => deserialize_seq_remainder(v, seq, From::from), + Value::IntArray(v) => deserialize_seq_remainder(v, seq, From::from), + Value::LongArray(v) => deserialize_seq_remainder(v, seq, From::from), + }, + None => Ok(List::End), + } + } + + fn visit_byte_buf(self, v: Vec) -> Result + where + E: de::Error, + { + Ok(List::Byte(u8_vec_into_i8_vec(v))) + } + + fn visit_bytes(self, v: &[u8]) -> Result + where + E: de::Error, + { + Ok(List::Byte(u8_slice_as_i8_slice(v).into())) + } + } + + deserializer.deserialize_seq(ListVisitor::(PhantomData)) + } +} + +/// Deserializes the remainder of a sequence after having +/// determined the type of the first element. +fn deserialize_seq_remainder<'de, T, A, S, C>( + first: T, + mut seq: A, + conv: C, +) -> Result, A::Error> +where + T: Deserialize<'de>, + A: de::SeqAccess<'de>, + C: FnOnce(Vec) -> List, +{ + let mut vec = match seq.size_hint() { + Some(n) => Vec::with_capacity(n + 1), + None => Vec::new(), + }; + + vec.push(first); + + while let Some(v) = seq.next_element()? { + vec.push(v); + } + + Ok(conv(vec)) +} + +impl<'de> Deserializer<'de> for Compound { + type Error = Error; + + fn deserialize_any(self, visitor: V) -> Result + where + V: Visitor<'de>, + { + visitor.visit_map(MapDeserializer::new(self.into_iter())) + } + + forward_to_deserialize_any! { + bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string + bytes byte_buf option unit unit_struct newtype_struct seq tuple + tuple_struct map struct enum identifier ignored_any + } +} + +impl<'de> IntoDeserializer<'de, Error> for Compound { + type Deserializer = Self; + + fn into_deserializer(self) -> Self::Deserializer { + self + } +} + +impl<'de> Deserializer<'de> for Value { + type Error = Error; + + fn deserialize_any(self, visitor: V) -> Result + where + V: Visitor<'de>, + { + match self { + Value::Byte(v) => visitor.visit_i8(v), + Value::Short(v) => visitor.visit_i16(v), + Value::Int(v) => visitor.visit_i32(v), + Value::Long(v) => visitor.visit_i64(v), + Value::Float(v) => visitor.visit_f32(v), + Value::Double(v) => visitor.visit_f64(v), + Value::ByteArray(v) => visitor.visit_byte_buf(i8_vec_into_u8_vec(v)), + Value::String(v) => visitor.visit_string(v), + Value::List(v) => v.deserialize_any(visitor), + Value::Compound(v) => v.into_deserializer().deserialize_any(visitor), + Value::IntArray(v) => v.into_deserializer().deserialize_any(visitor), + Value::LongArray(v) => v.into_deserializer().deserialize_any(visitor), + } + } + + fn deserialize_bool(self, visitor: V) -> Result + where + V: Visitor<'de>, + { + match self { + Value::Byte(b) => visitor.visit_bool(b != 0), + _ => self.deserialize_any(visitor), + } + } + + fn deserialize_option(self, visitor: V) -> Result + where + V: Visitor<'de>, + { + visitor.visit_some(self) + } + + fn deserialize_enum( + self, + _name: &'static str, + _variants: &'static [&'static str], + visitor: V, + ) -> Result + where + V: Visitor<'de>, + { + match self { + Value::String(s) => visitor.visit_enum(s.into_deserializer()), // Unit variant. + other => other.deserialize_any(visitor), + } + } + + forward_to_deserialize_any! { + i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string + bytes byte_buf unit unit_struct newtype_struct seq tuple + tuple_struct map struct identifier ignored_any + } +} + +impl<'de> IntoDeserializer<'de, Error> for Value { + type Deserializer = Self; + + fn into_deserializer(self) -> Self::Deserializer { + self + } +} + +impl<'de> Deserializer<'de> for List { + type Error = Error; + + fn deserialize_any(self, visitor: V) -> Result + where + V: Visitor<'de>, + { + struct EndSeqAccess; + + impl<'de> SeqAccess<'de> for EndSeqAccess { + type Error = Error; + + fn next_element_seed(&mut self, _seed: T) -> Result, Self::Error> + where + T: de::DeserializeSeed<'de>, + { + Ok(None) + } + } + + match self { + List::End => visitor.visit_seq(EndSeqAccess), + List::Byte(v) => visitor.visit_byte_buf(i8_vec_into_u8_vec(v)), + List::Short(v) => v.into_deserializer().deserialize_any(visitor), + List::Int(v) => v.into_deserializer().deserialize_any(visitor), + List::Long(v) => v.into_deserializer().deserialize_any(visitor), + List::Float(v) => v.into_deserializer().deserialize_any(visitor), + List::Double(v) => v.into_deserializer().deserialize_any(visitor), + List::ByteArray(v) => v.into_deserializer().deserialize_any(visitor), + List::String(v) => v.into_deserializer().deserialize_any(visitor), + List::List(v) => v.into_deserializer().deserialize_any(visitor), + List::Compound(v) => v.into_deserializer().deserialize_any(visitor), + List::IntArray(v) => v.into_deserializer().deserialize_any(visitor), + List::LongArray(v) => v.into_deserializer().deserialize_any(visitor), + } + } + + forward_to_deserialize_any! { + bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string + bytes byte_buf option unit unit_struct newtype_struct seq tuple + tuple_struct map struct enum identifier ignored_any + } +} + +impl<'de> IntoDeserializer<'de, Error> for List { + type Deserializer = Self; + + fn into_deserializer(self) -> Self::Deserializer { + self + } +} diff --git a/vendor/valence/crates/valence_nbt/src/serde/ser.rs b/vendor/valence/crates/valence_nbt/src/serde/ser.rs new file mode 100644 index 00000000..25bfca89 --- /dev/null +++ b/vendor/valence/crates/valence_nbt/src/serde/ser.rs @@ -0,0 +1,627 @@ +use std::hash::Hash; +use std::marker::PhantomData; + +use serde::ser::{Impossible, SerializeMap, SerializeSeq, SerializeStruct}; +use serde::{Serialize, Serializer}; + +use super::Error; +use crate::conv::{i8_slice_as_u8_slice, u8_vec_into_i8_vec}; +use crate::{Compound, List, Value}; + +impl Serialize for Value +where + Str: Serialize + Ord + Hash, +{ + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + match self { + Value::Byte(v) => serializer.serialize_i8(*v), + Value::Short(v) => serializer.serialize_i16(*v), + Value::Int(v) => serializer.serialize_i32(*v), + Value::Long(v) => serializer.serialize_i64(*v), + Value::Float(v) => serializer.serialize_f32(*v), + Value::Double(v) => serializer.serialize_f64(*v), + Value::ByteArray(v) => serializer.serialize_bytes(i8_slice_as_u8_slice(v)), + Value::String(v) => v.serialize(serializer), + Value::List(v) => v.serialize(serializer), + Value::Compound(v) => v.serialize(serializer), + Value::IntArray(v) => v.serialize(serializer), + Value::LongArray(v) => v.serialize(serializer), + } + } +} + +impl Serialize for List +where + Str: Serialize + Ord + Hash, +{ + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + match self { + List::End => serializer.serialize_seq(Some(0))?.end(), + List::Byte(v) => v.serialize(serializer), + List::Short(v) => v.serialize(serializer), + List::Int(v) => v.serialize(serializer), + List::Long(v) => v.serialize(serializer), + List::Float(v) => v.serialize(serializer), + List::Double(v) => v.serialize(serializer), + List::ByteArray(v) => v.serialize(serializer), + List::String(v) => v.serialize(serializer), + List::List(v) => v.serialize(serializer), + List::Compound(v) => v.serialize(serializer), + List::IntArray(v) => v.serialize(serializer), + List::LongArray(v) => v.serialize(serializer), + } + } +} + +macro_rules! unsupported { + ($lit:literal) => { + Err(Error::new(concat!("unsupported type: ", $lit))) + }; +} + +/// [`Serializer`] whose output is [`Compound`]. +pub struct CompoundSerializer; + +impl Serializer for CompoundSerializer { + type Ok = Compound; + + type Error = Error; + + type SerializeSeq = Impossible; + + type SerializeTuple = Impossible; + + type SerializeTupleStruct = Impossible; + + type SerializeTupleVariant = Impossible; + + type SerializeMap = GenericSerializeMap; + + type SerializeStruct = GenericSerializeStruct; + + type SerializeStructVariant = Impossible; + + fn serialize_bool(self, _v: bool) -> Result { + unsupported!("bool") + } + + fn serialize_i8(self, _v: i8) -> Result { + unsupported!("i8") + } + + fn serialize_i16(self, _v: i16) -> Result { + unsupported!("i16") + } + + fn serialize_i32(self, _v: i32) -> Result { + unsupported!("i32") + } + + fn serialize_i64(self, _v: i64) -> Result { + unsupported!("i64") + } + + fn serialize_u8(self, _v: u8) -> Result { + unsupported!("u8") + } + + fn serialize_u16(self, _v: u16) -> Result { + unsupported!("u16") + } + + fn serialize_u32(self, _v: u32) -> Result { + unsupported!("u32") + } + + fn serialize_u64(self, _v: u64) -> Result { + unsupported!("u64") + } + + fn serialize_f32(self, _v: f32) -> Result { + unsupported!("f32") + } + + fn serialize_f64(self, _v: f64) -> Result { + unsupported!("f64") + } + + fn serialize_char(self, _v: char) -> Result { + unsupported!("char") + } + + fn serialize_str(self, _v: &str) -> Result { + unsupported!("str") + } + + fn serialize_bytes(self, _v: &[u8]) -> Result { + unsupported!("bytes") + } + + fn serialize_none(self) -> Result { + unsupported!("none") + } + + fn serialize_some(self, _value: &T) -> Result + where + T: Serialize, + { + unsupported!("some") + } + + fn serialize_unit(self) -> Result { + unsupported!("unit") + } + + fn serialize_unit_struct(self, _name: &'static str) -> Result { + unsupported!("unit struct") + } + + fn serialize_unit_variant( + self, + _name: &'static str, + _variant_index: u32, + _variant: &'static str, + ) -> Result { + unsupported!("unit variant") + } + + fn serialize_newtype_struct( + self, + _name: &'static str, + _value: &T, + ) -> Result + where + T: Serialize, + { + unsupported!("newtype struct") + } + + fn serialize_newtype_variant( + self, + _name: &'static str, + _variant_index: u32, + _variant: &'static str, + _value: &T, + ) -> Result + where + T: Serialize, + { + unsupported!("newtype variant") + } + + fn serialize_seq(self, _len: Option) -> Result { + unsupported!("seq") + } + + fn serialize_tuple(self, _len: usize) -> Result { + unsupported!("tuple") + } + + fn serialize_tuple_struct( + self, + _name: &'static str, + _len: usize, + ) -> Result { + unsupported!("tuple struct") + } + + fn serialize_tuple_variant( + self, + _name: &'static str, + _variant_index: u32, + _variant: &'static str, + _len: usize, + ) -> Result { + unsupported!("tuple variant") + } + + fn serialize_map(self, len: Option) -> Result { + Ok(GenericSerializeMap::new(len)) + } + + fn serialize_struct( + self, + _name: &'static str, + len: usize, + ) -> Result { + Ok(GenericSerializeStruct::new(len)) + } + + fn serialize_struct_variant( + self, + _name: &'static str, + _variant_index: u32, + _variant: &'static str, + _len: usize, + ) -> Result { + unsupported!("struct variant") + } +} + +/// [`Serializer`] whose output is [`Value`]. +struct ValueSerializer; + +impl Serializer for ValueSerializer { + type Ok = Value; + + type Error = Error; + + type SerializeSeq = ValueSerializeSeq; + + type SerializeTuple = Impossible; + + type SerializeTupleStruct = Impossible; + + type SerializeTupleVariant = Impossible; + + type SerializeMap = GenericSerializeMap; + + type SerializeStruct = GenericSerializeStruct; + + type SerializeStructVariant = Impossible; + + fn serialize_bool(self, v: bool) -> Result { + Ok(Value::Byte(v as _)) + } + + fn serialize_i8(self, v: i8) -> Result { + Ok(Value::Byte(v)) + } + + fn serialize_i16(self, v: i16) -> Result { + Ok(Value::Short(v)) + } + + fn serialize_i32(self, v: i32) -> Result { + Ok(Value::Int(v)) + } + + fn serialize_i64(self, v: i64) -> Result { + Ok(Value::Long(v)) + } + + fn serialize_u8(self, v: u8) -> Result { + Ok(Value::Byte(v as _)) + } + + fn serialize_u16(self, v: u16) -> Result { + Ok(Value::Short(v as _)) + } + + fn serialize_u32(self, v: u32) -> Result { + Ok(Value::Int(v as _)) + } + + fn serialize_u64(self, v: u64) -> Result { + Ok(Value::Long(v as _)) + } + + fn serialize_f32(self, v: f32) -> Result { + Ok(Value::Float(v)) + } + + fn serialize_f64(self, v: f64) -> Result { + Ok(Value::Double(v)) + } + + fn serialize_char(self, v: char) -> Result { + Ok(Value::String(v.into())) + } + + fn serialize_str(self, v: &str) -> Result { + Ok(Value::String(v.into())) + } + + fn serialize_bytes(self, v: &[u8]) -> Result { + Ok(Value::ByteArray(u8_vec_into_i8_vec(v.into()))) + } + + fn serialize_none(self) -> Result { + unsupported!("none") + } + + fn serialize_some(self, value: &T) -> Result + where + T: Serialize, + { + value.serialize(self) + } + + fn serialize_unit(self) -> Result { + unsupported!("unit") + } + + fn serialize_unit_struct(self, _name: &'static str) -> Result { + self.serialize_unit() + } + + fn serialize_unit_variant( + self, + _name: &'static str, + _variant_index: u32, + variant: &'static str, + ) -> Result { + Ok(Value::String(variant.into())) + } + + fn serialize_newtype_struct( + self, + _name: &'static str, + value: &T, + ) -> Result + where + T: Serialize, + { + value.serialize(self) + } + + fn serialize_newtype_variant( + self, + _name: &'static str, + _variant_index: u32, + _variant: &'static str, + _value: &T, + ) -> Result + where + T: Serialize, + { + unsupported!("newtype variant") + } + + fn serialize_seq(self, len: Option) -> Result { + Ok(ValueSerializeSeq::End { + len: len.unwrap_or(0), + }) + } + + fn serialize_tuple(self, _len: usize) -> Result { + unsupported!("tuple") + } + + fn serialize_tuple_struct( + self, + _name: &'static str, + _len: usize, + ) -> Result { + unsupported!("tuple struct") + } + + fn serialize_tuple_variant( + self, + _name: &'static str, + _variant_index: u32, + _variant: &'static str, + _len: usize, + ) -> Result { + unsupported!("tuple variant") + } + + fn serialize_map(self, len: Option) -> Result { + Ok(GenericSerializeMap::new(len)) + } + + fn serialize_struct( + self, + _name: &'static str, + len: usize, + ) -> Result { + Ok(GenericSerializeStruct::new(len)) + } + + fn serialize_struct_variant( + self, + _name: &'static str, + _variant_index: u32, + _variant: &'static str, + _len: usize, + ) -> Result { + unsupported!("struct variant") + } +} + +enum ValueSerializeSeq { + End { len: usize }, + Byte(Vec), + Short(Vec), + Int(Vec), + Long(Vec), + Float(Vec), + Double(Vec), + ByteArray(Vec>), + String(Vec), + List(Vec), + Compound(Vec), + IntArray(Vec>), + LongArray(Vec>), +} + +impl SerializeSeq for ValueSerializeSeq { + type Ok = Value; + + type Error = Error; + + fn serialize_element(&mut self, value: &T) -> Result<(), Self::Error> + where + T: Serialize, + { + macro_rules! serialize_variant { + ($variant:ident, $vec:ident, $elem:ident) => {{ + match $elem.serialize(ValueSerializer)? { + Value::$variant(val) => { + $vec.push(val); + Ok(()) + } + _ => Err(Error::new(concat!( + "heterogeneous NBT list (expected `", + stringify!($variant), + "` element)" + ))), + } + }}; + } + + match self { + Self::End { len } => { + fn vec(elem: T, len: usize) -> Vec { + let mut vec = Vec::with_capacity(len); + vec.push(elem); + vec + } + + // Set the first element of the list. + *self = match value.serialize(ValueSerializer)? { + Value::Byte(v) => Self::Byte(vec(v, *len)), + Value::Short(v) => Self::Short(vec(v, *len)), + Value::Int(v) => Self::Int(vec(v, *len)), + Value::Long(v) => Self::Long(vec(v, *len)), + Value::Float(v) => Self::Float(vec(v, *len)), + Value::Double(v) => Self::Double(vec(v, *len)), + Value::ByteArray(v) => Self::ByteArray(vec(v, *len)), + Value::String(v) => Self::String(vec(v, *len)), + Value::List(v) => Self::List(vec(v, *len)), + Value::Compound(v) => Self::Compound(vec(v, *len)), + Value::IntArray(v) => Self::IntArray(vec(v, *len)), + Value::LongArray(v) => Self::LongArray(vec(v, *len)), + }; + Ok(()) + } + Self::Byte(v) => serialize_variant!(Byte, v, value), + Self::Short(v) => serialize_variant!(Short, v, value), + Self::Int(v) => serialize_variant!(Int, v, value), + Self::Long(v) => serialize_variant!(Long, v, value), + Self::Float(v) => serialize_variant!(Float, v, value), + Self::Double(v) => serialize_variant!(Double, v, value), + Self::ByteArray(v) => serialize_variant!(ByteArray, v, value), + Self::String(v) => serialize_variant!(String, v, value), + Self::List(v) => serialize_variant!(List, v, value), + Self::Compound(v) => serialize_variant!(Compound, v, value), + Self::IntArray(v) => serialize_variant!(IntArray, v, value), + Self::LongArray(v) => serialize_variant!(LongArray, v, value), + } + } + + fn end(self) -> Result { + Ok(match self { + Self::End { .. } => List::End.into(), + Self::Byte(v) => v.into(), + Self::Short(v) => List::Short(v).into(), + Self::Int(v) => v.into(), + Self::Long(v) => List::Long(v).into(), + Self::Float(v) => List::Float(v).into(), + Self::Double(v) => List::Double(v).into(), + Self::ByteArray(v) => List::ByteArray(v).into(), + Self::String(v) => List::String(v).into(), + Self::List(v) => List::List(v).into(), + Self::Compound(v) => List::Compound(v).into(), + Self::IntArray(v) => List::IntArray(v).into(), + Self::LongArray(v) => List::LongArray(v).into(), + }) + } +} + +#[doc(hidden)] +pub struct GenericSerializeMap { + /// Temp storage for `serialize_key`. + key: Option, + res: Compound, + _marker: PhantomData, +} + +impl GenericSerializeMap { + pub fn new(len: Option) -> Self { + Self { + key: None, + res: Compound::with_capacity(len.unwrap_or(0)), + _marker: PhantomData, + } + } +} + +impl SerializeMap for GenericSerializeMap +where + Compound: Into, +{ + type Ok = Ok; + + type Error = Error; + + fn serialize_key(&mut self, key: &T) -> Result<(), Self::Error> + where + T: Serialize, + { + debug_assert!( + self.key.is_none(), + "call to `serialize_key` must be followed by `serialize_value`" + ); + + match key.serialize(ValueSerializer)? { + Value::String(s) => { + self.key = Some(s); + Ok(()) + } + _ => Err(Error::new("invalid map key type (expected string)")), + } + } + + fn serialize_value(&mut self, value: &T) -> Result<(), Self::Error> + where + T: Serialize, + { + let key = self + .key + .take() + .expect("missing previous call to `serialize_key`"); + self.res.insert(key, value.serialize(ValueSerializer)?); + Ok(()) + } + + fn end(self) -> Result { + Ok(self.res.into()) + } +} + +#[doc(hidden)] +pub struct GenericSerializeStruct { + c: Compound, + _marker: PhantomData, +} + +impl GenericSerializeStruct { + fn new(len: usize) -> Self { + Self { + c: Compound::with_capacity(len), + _marker: PhantomData, + } + } +} + +impl SerializeStruct for GenericSerializeStruct +where + Compound: Into, +{ + type Ok = Ok; + + type Error = Error; + + fn serialize_field( + &mut self, + key: &'static str, + value: &T, + ) -> Result<(), Self::Error> + where + T: Serialize, + { + self.c.insert(key, value.serialize(ValueSerializer)?); + Ok(()) + } + + fn end(self) -> Result { + Ok(self.c.into()) + } +} diff --git a/vendor/valence/crates/valence_nbt/src/serde/tests.rs b/vendor/valence/crates/valence_nbt/src/serde/tests.rs new file mode 100644 index 00000000..ab4dd2d0 --- /dev/null +++ b/vendor/valence/crates/valence_nbt/src/serde/tests.rs @@ -0,0 +1,109 @@ +use pretty_assertions::assert_eq; +use serde::{Deserialize, Serialize}; +use serde_json::json; + +use super::*; +use crate::{compound, Compound, List}; + +#[derive(Serialize, Deserialize, PartialEq, Debug)] +struct Struct { + foo: i32, + bar: StructInner, + baz: String, + quux: Vec, + blah: EnumInner, +} + +#[derive(Serialize, Deserialize, PartialEq, Debug)] +struct StructInner { + a: bool, + b: i64, + c: Vec>, + d: Vec, +} + +#[derive(Serialize, Deserialize, PartialEq, Debug)] +enum EnumInner { + A, + B, + C, +} + +fn make_struct() -> Struct { + Struct { + foo: i32::MIN, + bar: StructInner { + a: true, + b: 123456789, + c: vec![vec![1, 2, 3], vec![4, 5, 6]], + d: vec![], + }, + baz: "🤨".into(), + quux: vec![std::f32::consts::PI, f32::MAX, f32::MIN], + blah: EnumInner::B, + } +} + +fn make_compound() -> Compound { + compound! { + "foo" => i32::MIN, + "bar" => compound! { + "a" => true, + "b" => 123456789_i64, + "c" => List::IntArray(vec![vec![1, 2, 3], vec![4, 5, 6]]), + "d" => List::End, + }, + "baz" => "🤨", + "quux" => List::Float(vec![ + std::f32::consts::PI, + f32::MAX, + f32::MIN, + ]), + "blah" => "B" + } +} + +fn make_json() -> serde_json::Value { + json!({ + "foo": i32::MIN, + "bar": { + "a": true, + "b": 123456789_i64, + "c": [[1, 2, 3], [4, 5, 6]], + "d": [] + }, + "baz": "🤨", + "quux": [ + std::f32::consts::PI, + f32::MAX, + f32::MIN, + ], + "blah": "B" + }) +} + +#[test] +fn struct_to_compound() { + let c = make_struct().serialize(CompoundSerializer).unwrap(); + + assert_eq!(c, make_compound()); +} + +#[test] +fn compound_to_struct() { + let s = Struct::deserialize(make_compound()).unwrap(); + + assert_eq!(s, make_struct()); +} + +#[test] +fn compound_to_json() { + let mut j = serde_json::to_value(make_compound()).unwrap(); + + // Bools map to bytes in NBT, but the result should be the same otherwise. + let p = j.pointer_mut("/bar/a").unwrap(); + assert_eq!(*p, serde_json::Value::from(1)); + *p = true.into(); + + assert_eq!(j, make_json()); +} diff --git a/vendor/valence/crates/valence_nbt/src/snbt.rs b/vendor/valence/crates/valence_nbt/src/snbt.rs new file mode 100644 index 00000000..e207da76 --- /dev/null +++ b/vendor/valence/crates/valence_nbt/src/snbt.rs @@ -0,0 +1,726 @@ +use std::error::Error; +use std::fmt::{Display, Formatter}; +use std::iter::Peekable; +use std::str::Chars; + +use crate::{Compound, List, Value}; + +const STRING_MAX_LEN: usize = 32767; +/// Maximum recursion depth to prevent overflowing the call stack. +const MAX_DEPTH: usize = 512; + +#[derive(Debug, Clone, PartialEq, Eq, Copy)] +pub enum SnbtErrorKind { + ReachEndOfStream, + InvalidEscapeSequence, + EmptyKeyInCompound, + ExpectColon, + ExpectValue, + ExpectComma, + WrongTypeInArray, + DifferentTypesInList, + LongString, + TrailingData, + DepthLimitExceeded, +} + +impl Display for SnbtErrorKind { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + use SnbtErrorKind::*; + match self { + ReachEndOfStream => write!(f, "reach end of stream"), + InvalidEscapeSequence => write!(f, "invalid escape sequence"), + EmptyKeyInCompound => write!(f, "empty key in compound"), + ExpectColon => write!(f, "expect colon"), + ExpectValue => write!(f, "expect value"), + ExpectComma => write!(f, "expect comma"), + WrongTypeInArray => write!(f, "wrong type in array"), + DifferentTypesInList => write!(f, "different types in list"), + LongString => write!(f, "long string"), + TrailingData => write!(f, "extra data after end"), + DepthLimitExceeded => write!(f, "depth limit exceeded"), + } + } +} + +#[derive(Debug, Clone, PartialEq, Eq, Copy)] +pub struct SnbtError { + pub error_type: SnbtErrorKind, + pub line: usize, + pub column: usize, +} + +impl SnbtError { + pub fn new(error_type: SnbtErrorKind, line: usize, column: usize) -> Self { + Self { + error_type, + line, + column, + } + } +} + +impl Display for SnbtError { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "@ {},{}: {}", self.line, self.column, self.error_type) + } +} + +impl Error for SnbtError {} + +type Result = std::result::Result; + +pub struct SnbtReader<'a> { + line: usize, + column: usize, + index: usize, + depth: usize, + iter: Peekable>, + pushed_back: Option, +} + +impl<'a> SnbtReader<'a> { + pub fn new(input: &'a str) -> Self { + Self { + line: 1, + column: 1, + index: 0, + depth: 0, + iter: input.chars().peekable(), + pushed_back: None, + } + } + + fn check_depth(&mut self, f: impl FnOnce(&mut Self) -> Result) -> Result { + if self.depth >= MAX_DEPTH { + Err(self.make_error(SnbtErrorKind::DepthLimitExceeded)) + } else { + self.depth += 1; + let res = f(self); + self.depth -= 1; + res + } + } + + fn make_error(&self, error_type: SnbtErrorKind) -> SnbtError { + SnbtError::new(error_type, self.line, self.column) + } + + fn peek(&mut self) -> Result { + if let Some(c) = self.pushed_back { + Ok(c) + } else { + self.iter + .peek() + .copied() + .ok_or_else(|| self.make_error(SnbtErrorKind::ReachEndOfStream)) + } + } + + fn next(&mut self) { + if self.pushed_back.is_some() { + self.pushed_back = None; + return; + } + + let result = self.iter.next(); + + if let Some(c) = result { + if c == '\n' { + self.line += 1; + self.column = 1; + } else { + self.column += 1; + } + self.index += c.len_utf8(); + } + } + + /// Push back a char, only one char can be pushed back + fn push_back(&mut self, c: char) { + if c == '\n' { + self.line -= 1; + self.column = 1; + } else { + self.column -= 1; + } + + self.index -= c.len_utf8(); + + match self.pushed_back { + Some(_) => panic!("Can't push back two chars"), + None => self.pushed_back = Some(c), + }; + } + + fn skip_whitespace(&mut self) { + loop { + match self.peek() { + Ok(c) if c.is_whitespace() => self.next(), + _ => break, + }; + } + } + + fn read_string(&mut self) -> Result { + let first = self.peek()?; + + let str = match first { + '\"' | '\'' => self.read_quoted_string(), + _ => self.read_unquoted_string(), + }?; + + if str.len() > STRING_MAX_LEN { + return Err(self.make_error(SnbtErrorKind::LongString)); + } + + Ok(str) + } + + fn read_unquoted_string(&mut self) -> Result { + let mut result = String::new(); + + loop { + let input = self.peek(); + match input { + Ok('a'..='z' | 'A'..='Z' | '0'..='9' | '_' | '-' | '+' | '.') => { + result.push(input?); + self.next(); + } + _ => break, + } + } + + Ok(result) + } + + fn read_quoted_string(&mut self) -> Result { + let quote = self.peek()?; + self.next(); + + let mut result = String::new(); + loop { + let input = self.peek(); + match input { + Ok(c) if c == quote => { + self.next(); + break; + } + Ok('\\') => { + self.next(); + + let escape = self.peek()?; + if escape == quote || escape == '\\' { + result.push(escape); + } else { + return Err(self.make_error(SnbtErrorKind::InvalidEscapeSequence)); + } + + self.next(); + } + Ok(c) => { + result.push(c); + self.next(); + } + Err(e) => return Err(e), + } + } + if result.len() > STRING_MAX_LEN { + return Err(self.make_error(SnbtErrorKind::LongString)); + } + Ok(result) + } + + fn parse_compound(&mut self) -> Result { + self.next(); + self.skip_whitespace(); + + let mut cpd = Compound::new(); + while self.peek()? != '}' { + let key = self.read_string()?; + + self.skip_whitespace(); + + if key.is_empty() { + return Err(self.make_error(SnbtErrorKind::EmptyKeyInCompound)); + } + + if self.peek()? != ':' { + return Err(self.make_error(SnbtErrorKind::ExpectColon)); + } + + self.next(); + self.skip_whitespace(); + + let value = self.parse_element()?; + + self.skip_whitespace(); + if self.peek()? == ',' { + self.next(); + self.skip_whitespace(); + } else if self.peek()? != '}' { + return Err(self.make_error(SnbtErrorKind::ExpectComma)); + } + + cpd.insert(key, value); + } + self.next(); + Ok(cpd) + } + + fn continue_parse_list(&mut self) -> Result { + self.skip_whitespace(); + + let mut list = List::End; + + while self.peek()? != ']' { + let value = self.parse_element()?; + self.skip_whitespace(); + + match (&mut list, value) { + (list @ List::End, value) => *list = value.into(), + (List::Byte(l), Value::Byte(v)) => l.push(v), + (List::Short(l), Value::Short(v)) => l.push(v), + (List::Int(l), Value::Int(v)) => l.push(v), + (List::Long(l), Value::Long(v)) => l.push(v), + (List::Float(l), Value::Float(v)) => l.push(v), + (List::Double(l), Value::Double(v)) => l.push(v), + (List::ByteArray(l), Value::ByteArray(v)) => l.push(v), + (List::String(l), Value::String(v)) => l.push(v), + (List::List(l), Value::List(v)) => l.push(v), + (List::Compound(l), Value::Compound(v)) => l.push(v), + (List::IntArray(l), Value::IntArray(v)) => l.push(v), + (List::LongArray(l), Value::LongArray(v)) => l.push(v), + _ => return Err(self.make_error(SnbtErrorKind::DifferentTypesInList)), + } + + if self.peek()? == ',' { + self.next(); + self.skip_whitespace(); + } else if self.peek()? != ']' { + return Err(self.make_error(SnbtErrorKind::ExpectComma)); + } + } + self.next(); + + Ok(list) + } + + fn parse_list_like(&mut self) -> Result { + self.next(); + + let type_char = self.peek()?; + + let mut values = match type_char { + 'B' => Value::ByteArray(vec![]), + 'I' => Value::IntArray(vec![]), + 'L' => Value::LongArray(vec![]), + _ => return self.check_depth(|v| Ok(v.continue_parse_list()?.into())), + }; + + self.next(); + + if self.peek()? != ';' { + self.push_back(type_char); + return self.check_depth(|v| Ok(v.continue_parse_list()?.into())); + } + + self.next(); + self.skip_whitespace(); + + while self.peek()? != ']' { + let value = self.parse_element()?; + + match (&mut values, value) { + (Value::ByteArray(l), Value::Byte(v)) => l.push(v), + (Value::IntArray(l), Value::Int(v)) => l.push(v), + (Value::LongArray(l), Value::Long(v)) => l.push(v), + _ => return Err(self.make_error(SnbtErrorKind::WrongTypeInArray)), + } + + self.skip_whitespace(); + if self.peek()? == ',' { + self.next(); + self.skip_whitespace(); + } else if self.peek()? != ']' { + return Err(self.make_error(SnbtErrorKind::ExpectComma)); + } + } + + self.next(); + + Ok(values) + } + + fn parse_primitive(&mut self) -> Result { + macro_rules! try_ret { + // Try possible solution until one works + ($v:expr) => {{ + match $v { + Ok(v) => return Ok(v.into()), + Err(_) => (), + } + }}; + } + + let target = self.read_unquoted_string()?; + + match target + .bytes() + .last() + .ok_or_else(|| self.make_error(SnbtErrorKind::ExpectValue))? + { + b'b' | b'B' => try_ret!(target[..target.len() - 1].parse::()), + b's' | b'S' => try_ret!(target[..target.len() - 1].parse::()), + b'l' | b'L' => try_ret!(target[..target.len() - 1].parse::()), + b'f' | b'F' => try_ret!(target[..target.len() - 1].parse::()), + b'd' | b'D' => try_ret!(target[..target.len() - 1].parse::()), + _ => (), + } + + match target.as_str() { + "true" => return Ok(Value::Byte(1)), + "false" => return Ok(Value::Byte(0)), + _ => { + try_ret!(target.parse::()); + try_ret!(target.parse::()); + } + }; + + if target.len() > STRING_MAX_LEN { + return Err(self.make_error(SnbtErrorKind::LongString)); + } + + Ok(Value::String(target)) + } + + /// Read the next element in the SNBT string. + /// [`SnbtErrorKind::TrailingData`] cannot be returned because it is not + /// considered to be an error. + pub fn parse_element(&mut self) -> Result { + self.skip_whitespace(); + + match self.peek()? { + '{' => self.check_depth(|v| Ok(v.parse_compound()?.into())), + '[' => self.parse_list_like(), + '"' | '\'' => self.read_quoted_string().map(|s| s.into()), + _ => self.parse_primitive(), + } + } + + pub fn read(&mut self) -> Result { + let value = self.parse_element()?; + + self.skip_whitespace(); + if self.peek().is_ok() { + return Err(self.make_error(SnbtErrorKind::TrailingData)); + } + + Ok(value) + } + + /// Get the number of bytes read. + /// It's useful when you want to read a SNBT string from an command argument + /// since there may be trailing data. + pub fn bytes_read(&self) -> usize { + self.index + } +} +/// Parse a string in SNBT format into a `Value`. +/// Assert that the string has no trailing data. +/// SNBT is quite similar to JSON, but with some differences. +/// See [the wiki](https://minecraft.wiki/w/NBT_format#SNBT_format) for more information. +/// +/// # Example +/// +/// ``` +/// use valence_nbt::snbt::from_snbt_str; +/// use valence_nbt::Value; +/// +/// let value = from_snbt_str("1f").unwrap(); +/// assert_eq!(value, Value::Float(1.0)); +/// ``` +pub fn from_snbt_str(snbt: &str) -> Result { + SnbtReader::new(snbt).read() +} + +pub struct SnbtWriter<'a> { + output: &'a mut String, +} + +impl<'a> SnbtWriter<'a> { + pub fn new(output: &'a mut String) -> Self { + Self { output } + } + + fn write_string(&mut self, s: &str) { + let mut need_quote = false; + for c in s.chars() { + if !matches!(c, 'a'..='z' | 'A'..='Z' | '0'..='9' | '_' | '-' | '+' | '.') { + need_quote = true; + break; + } + } + + if need_quote { + self.output.push('"'); + for c in s.chars() { + match c { + '"' => self.output.push_str("\\\""), + '\\' => self.output.push_str("\\\\"), + _ => self.output.push(c), + } + } + self.output.push('"'); + } else { + self.output.push_str(s); + } + } + + fn write_primitive_array<'b>( + &mut self, + prefix: &str, + iter: impl Iterator + 'b + Copy)>, + ) { + self.output.push('['); + self.output.push_str(prefix); + + let mut first = true; + + for v in iter { + if !first { + self.output.push(','); + } + first = false; + + self.write_element(&(*v).into()); + } + + self.output.push(']'); + } + + fn write_primitive(&mut self, postfix: &str, value: impl ToString) { + self.output.push_str(&value.to_string()); + self.output.push_str(postfix); + } + + fn write_list(&mut self, list: &List) { + macro_rules! variant_impl { + ($v:expr, $handle:expr) => {{ + self.output.push('['); + + let mut first = true; + for v in $v.iter() { + if !first { + self.output.push(','); + } + first = false; + $handle(v); + } + + self.output.push(']'); + }}; + } + #[allow(clippy::redundant_closure_call)] + match list { + List::Byte(v) => variant_impl!(v, |v| self.write_primitive("b", v)), + List::Short(v) => variant_impl!(v, |v| self.write_primitive("s", v)), + List::Int(v) => variant_impl!(v, |v| self.write_primitive("", v)), + List::Long(v) => variant_impl!(v, |v| self.write_primitive("l", v)), + List::Float(v) => variant_impl!(v, |v| self.write_primitive("f", v)), + List::Double(v) => variant_impl!(v, |v| self.write_primitive("d", v)), + List::ByteArray(v) => { + variant_impl!(v, |v: &Vec| self.write_primitive_array("B", v.iter())) + } + List::IntArray(v) => { + variant_impl!(v, |v: &Vec| self.write_primitive_array("", v.iter())) + } + List::LongArray(v) => { + variant_impl!(v, |v: &Vec| self.write_primitive_array("L", v.iter())) + } + List::String(v) => variant_impl!(v, |v| self.write_string(v)), + List::List(v) => variant_impl!(v, |v| self.write_list(v)), + List::Compound(v) => variant_impl!(v, |v| self.write_compound(v)), + List::End => self.output.push_str("[]"), + } + } + + fn write_compound(&mut self, compound: &Compound) { + self.output.push('{'); + + let mut first = true; + for (k, v) in compound.iter() { + if !first { + self.output.push(','); + } + + first = false; + + self.write_string(k); + self.output.push(':'); + self.write_element(v); + } + + self.output.push('}'); + } + + /// Write a value to the output. + pub fn write_element(&mut self, value: &Value) { + use Value::*; + match value { + Byte(v) => self.write_primitive("b", v), + Short(v) => self.write_primitive("s", v), + Int(v) => self.write_primitive("", v), + Long(v) => self.write_primitive("l", v), + Float(v) => self.write_primitive("f", v), + Double(v) => self.write_primitive("d", v), + ByteArray(v) => self.write_primitive_array("B;", v.iter()), + IntArray(v) => self.write_primitive_array("I;", v.iter()), + LongArray(v) => self.write_primitive_array("L;", v.iter()), + String(v) => self.write_string(v), + List(v) => self.write_list(v), + Compound(v) => self.write_compound(v), + } + } +} + +/// Convert a value to a string in SNBT format. +pub fn to_snbt_string(value: &Value) -> String { + let mut output = String::new(); + let mut writer = SnbtWriter::new(&mut output); + + writer.write_element(value); + + output +} + +impl Display for SnbtWriter<'_> { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.output) + } +} + +#[cfg(test)] +mod tests { + + use super::*; + + #[test] + fn test_parse() { + let str = r#" + { + foo: 1, + 'bar': 1.0, + "baz": 1.0f, + "hello'": "hello world", + "world": "hello\"world", + 1.5f: 1.5d, + 3b: 2f, + bool: false, + more: { + iarr: [I; 1, 2, 3], + larr: [L; 1L, 2L, 3L], + }, + empty: [Bibabo ], + } + "#; + + let value = from_snbt_str(str).unwrap(); + let Value::Compound(cpd) = &value else { + unreachable!() + }; + + assert_eq!(*cpd.get("foo").unwrap(), 1_i32.into()); + assert_eq!(*cpd.get("bar").unwrap(), 1_f64.into()); + assert_eq!(*cpd.get("baz").unwrap(), 1_f32.into()); + assert_eq!(*cpd.get("hello'").unwrap(), "hello world".into()); + assert_eq!(*cpd.get("world").unwrap(), "hello\"world".into()); + assert_eq!(*cpd.get("1.5f").unwrap(), 1.5_f64.into()); + assert_eq!(*cpd.get("3b").unwrap(), 2_f32.into()); + assert_eq!(*cpd.get("bool").unwrap(), 0_i8.into()); + + let Some(Value::Compound(more)) = cpd.get("more") else { + unreachable!() + }; + + assert_eq!(*more.get("iarr").unwrap(), vec![1, 2, 3].into()); + + assert_eq!(*more.get("larr").unwrap(), vec![1_i64, 2, 3].into()); + + let Value::List(List::String(list)) = cpd.get("empty").unwrap() else { + unreachable!() + }; + + assert_eq!(list[0], "Bibabo"); + + assert_eq!( + from_snbt_str("\"\\n\"").unwrap_err().error_type, + SnbtErrorKind::InvalidEscapeSequence + ); + + assert_eq!( + from_snbt_str("[L; 1]").unwrap_err().error_type, + SnbtErrorKind::WrongTypeInArray + ); + + assert_eq!( + from_snbt_str("[L; 1L, 2L, 3L").unwrap_err().error_type, + SnbtErrorKind::ReachEndOfStream + ); + + assert_eq!( + from_snbt_str("[L; 1L, 2L, 3L,]dewdwe") + .unwrap_err() + .error_type, + SnbtErrorKind::TrailingData + ); + + assert_eq!( + from_snbt_str("{ foo: }").unwrap_err().error_type, + SnbtErrorKind::ExpectValue + ); + + assert_eq!( + from_snbt_str("{ {}, }").unwrap_err().error_type, + SnbtErrorKind::EmptyKeyInCompound + ); + + assert_eq!( + from_snbt_str("{ foo 1 }").unwrap_err().error_type, + SnbtErrorKind::ExpectColon + ); + + assert_eq!( + from_snbt_str("{ foo: 1 bar: 2 }").unwrap_err().error_type, + SnbtErrorKind::ExpectComma + ); + + assert_eq!( + from_snbt_str("[{}, []]").unwrap_err().error_type, + SnbtErrorKind::DifferentTypesInList + ); + + assert_eq!( + from_snbt_str(&String::from_utf8(vec![b'e'; 32768]).unwrap()) + .unwrap_err() + .error_type, + SnbtErrorKind::LongString + ); + + assert_eq!( + from_snbt_str( + &String::from_utf8([[b'['; MAX_DEPTH + 1], [b']'; MAX_DEPTH + 1]].concat()) + .unwrap() + ) + .unwrap_err() + .error_type, + SnbtErrorKind::DepthLimitExceeded + ); + + #[cfg(feature = "preserve_order")] + assert_eq!( + to_snbt_string(&value), + r#"{foo:1,bar:1d,baz:1f,"hello'":"hello world",world:"hello\"world",1.5f:1.5d,3b:2f,bool:0b,more:{iarr:[I;1,2,3],larr:[L;1l,2l,3l]},empty:[Bibabo]}"# + ); + } +} diff --git a/vendor/valence/crates/valence_nbt/src/tag.rs b/vendor/valence/crates/valence_nbt/src/tag.rs new file mode 100644 index 00000000..4bc9e263 --- /dev/null +++ b/vendor/valence/crates/valence_nbt/src/tag.rs @@ -0,0 +1,18 @@ +/// One of the possible NBT data types. +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug)] +pub enum Tag { + // Variant order is significant! + End, + Byte, + Short, + Int, + Long, + Float, + Double, + ByteArray, + String, + List, + Compound, + IntArray, + LongArray, +} diff --git a/vendor/valence/crates/valence_nbt/src/value.rs b/vendor/valence/crates/valence_nbt/src/value.rs new file mode 100644 index 00000000..498cfc03 --- /dev/null +++ b/vendor/valence/crates/valence_nbt/src/value.rs @@ -0,0 +1,634 @@ +use std::borrow::Cow; +use std::hash::Hash; + +use crate::tag::Tag; +use crate::{Compound, List}; + +/// Represents an arbitrary NBT value. +#[derive(Clone, Debug)] +pub enum Value { + Byte(i8), + Short(i16), + Int(i32), + Long(i64), + Float(f32), + Double(f64), + ByteArray(Vec), + String(S), + List(List), + Compound(Compound), + IntArray(Vec), + LongArray(Vec), +} + +/// Represents a reference to an arbitrary NBT value, where the tag is not part +/// of the reference. +#[derive(Copy, Clone, Debug)] +pub enum ValueRef<'a, S = String> { + Byte(&'a i8), + Short(&'a i16), + Int(&'a i32), + Long(&'a i64), + Float(&'a f32), + Double(&'a f64), + ByteArray(&'a [i8]), + String(&'a S), + List(&'a List), + Compound(&'a Compound), + IntArray(&'a [i32]), + LongArray(&'a [i64]), +} + +/// Represents a mutable reference to an arbitrary NBT value, where the tag is +/// not part of the reference. +#[derive(Debug)] +pub enum ValueMut<'a, S = String> { + Byte(&'a mut i8), + Short(&'a mut i16), + Int(&'a mut i32), + Long(&'a mut i64), + Float(&'a mut f32), + Double(&'a mut f64), + ByteArray(&'a mut Vec), + String(&'a mut S), + List(&'a mut List), + Compound(&'a mut Compound), + IntArray(&'a mut Vec), + LongArray(&'a mut Vec), +} + +macro_rules! impl_value { + ($name:ident, $($lifetime:lifetime)?, ($($deref:tt)*), $($reference:tt)*) => { + macro_rules! as_number { + ($method_name:ident, $ty:ty, $($deref)*) => { + #[doc = concat!("If this value is a number, returns the `", stringify!($ty), "` representation of this value.")] + pub fn $method_name(&self) -> Option<$ty> { + #[allow(trivial_numeric_casts)] + match self { + Self::Byte(v) => Some($($deref)* v as $ty), + Self::Short(v) => Some($($deref)* v as $ty), + Self::Int(v) => Some($($deref)* v as $ty), + Self::Long(v) => Some($($deref)* v as $ty), + Self::Float(v) => Some(v.floor() as $ty), + Self::Double(v) => Some(v.floor() as $ty), + _ => None, + } + } + } + } + + macro_rules! as_number_float { + ($method_name:ident, $ty:ty, $($deref)*) => { + #[doc = concat!("If this value is a number, returns the `", stringify!($ty), "` representation of this value.")] + pub fn $method_name(&self) -> Option<$ty> { + #[allow(trivial_numeric_casts)] + match self { + Self::Byte(v) => Some($($deref)* v as $ty), + Self::Short(v) => Some($($deref)* v as $ty), + Self::Int(v) => Some($($deref)* v as $ty), + Self::Long(v) => Some($($deref)* v as $ty), + Self::Float(v) => Some($($deref)* v as $ty), + Self::Double(v) => Some($($deref)* v as $ty), + _ => None, + } + } + } + } + + impl <$($lifetime,)? S> $name<$($lifetime,)? S> { + /// Returns the type of this value. + pub fn tag(&self) -> Tag { + match self { + Self::Byte(_) => Tag::Byte, + Self::Short(_) => Tag::Short, + Self::Int(_) => Tag::Int, + Self::Long(_) => Tag::Long, + Self::Float(_) => Tag::Float, + Self::Double(_) => Tag::Double, + Self::ByteArray(_) => Tag::ByteArray, + Self::String(_) => Tag::String, + Self::List(_) => Tag::List, + Self::Compound(_) => Tag::Compound, + Self::IntArray(_) => Tag::IntArray, + Self::LongArray(_) => Tag::LongArray, + } + } + + /// Returns whether this value is a number, i.e. a byte, short, int, long, float or double. + pub fn is_number(&self) -> bool { + match self { + Self::Byte(_) | Self::Short(_) | Self::Int(_) | Self::Long(_) | Self::Float(_) | Self::Double(_) => true, + _ => false, + } + } + + as_number!(as_i8, i8, $($deref)*); + as_number!(as_i16, i16, $($deref)*); + as_number!(as_i32, i32, $($deref)*); + as_number!(as_i64, i64, $($deref)*); + as_number_float!(as_f32, f32, $($deref)*); + as_number_float!(as_f64, f64, $($deref)*); + + /// If this value is a number, returns the `bool` representation of this value. + pub fn as_bool(&self) -> Option { + self.as_i8().map(|v| v != 0) + } + } + + impl <$($lifetime,)? S> From<$($reference)* i8> for $name<$($lifetime,)? S> { + fn from(v: $($reference)* i8) -> Self { + Self::Byte(v) + } + } + + impl <$($lifetime,)? S> From<$($reference)* i16> for $name<$($lifetime,)? S> { + fn from(v: $($reference)* i16) -> Self { + Self::Short(v) + } + } + + impl <$($lifetime,)? S> From<$($reference)* i32> for $name<$($lifetime,)? S> { + fn from(v: $($reference)* i32) -> Self { + Self::Int(v) + } + } + + impl <$($lifetime,)? S> From<$($reference)* i64> for $name<$($lifetime,)? S> { + fn from(v: $($reference)* i64) -> Self { + Self::Long(v) + } + } + + impl <$($lifetime,)? S> From<$($reference)* f32> for $name<$($lifetime,)? S> { + fn from(v: $($reference)* f32) -> Self { + Self::Float(v) + } + } + + impl <$($lifetime,)? S> From<$($reference)* f64> for $name<$($lifetime,)? S> { + fn from(v: $($reference)* f64) -> Self { + Self::Double(v) + } + } + + impl <$($lifetime,)? S> From<$($reference)* List> for $name<$($lifetime,)? S> { + fn from(v: $($reference)* List) -> Self { + Self::List(v) + } + } + + impl <$($lifetime,)? S> From<$($reference)* Compound> for $name<$($lifetime,)? S> { + fn from(v: $($reference)* Compound) -> Self { + Self::Compound(v) + } + } + + impl <$($lifetime,)? S> PartialEq for $name<$($lifetime,)? S> where S: Ord + Hash { + fn eq(&self, other: &Self) -> bool { + match self { + Self::Byte(v) => matches!(other, Self::Byte(other_v) if v == other_v), + Self::Short(v) => matches!(other, Self::Short(other_v) if v == other_v), + Self::Int(v) => matches!(other, Self::Int(other_v) if v == other_v), + Self::Long(v) => matches!(other, Self::Long(other_v) if v == other_v), + Self::Float(v) => matches!(other, Self::Float(other_v) if v == other_v), + Self::Double(v) => matches!(other, Self::Double(other_v) if v == other_v), + Self::ByteArray(v) => matches!(other, Self::ByteArray(other_v) if v == other_v), + Self::String(v) => matches!(other, Self::String(other_v) if v == other_v), + Self::List(v) => matches!(other, Self::List(other_v) if v == other_v), + Self::Compound(v) => matches!(other, Self::Compound(other_v) if v == other_v), + Self::IntArray(v) => matches!(other, Self::IntArray(other_v) if v == other_v), + Self::LongArray(v) => matches!(other, Self::LongArray(other_v) if v == other_v), + } + } + } + } +} + +impl_value!(Value,,(*),); +impl_value!(ValueRef, 'a, (**), &'a); +impl_value!(ValueMut, 'a, (**), &'a mut); + +impl Value { + /// Converts a reference to a value to a [`ValueRef`]. + pub fn as_value_ref(&self) -> ValueRef { + match self { + Value::Byte(v) => ValueRef::Byte(v), + Value::Short(v) => ValueRef::Short(v), + Value::Int(v) => ValueRef::Int(v), + Value::Long(v) => ValueRef::Long(v), + Value::Float(v) => ValueRef::Float(v), + Value::Double(v) => ValueRef::Double(v), + Value::ByteArray(v) => ValueRef::ByteArray(&v[..]), + Value::String(v) => ValueRef::String(v), + Value::List(v) => ValueRef::List(v), + Value::Compound(v) => ValueRef::Compound(v), + Value::IntArray(v) => ValueRef::IntArray(&v[..]), + Value::LongArray(v) => ValueRef::LongArray(&v[..]), + } + } + + /// Converts a mutable reference to a value to a [`ValueMut`]. + pub fn as_value_mut(&mut self) -> ValueMut { + match self { + Value::Byte(v) => ValueMut::Byte(v), + Value::Short(v) => ValueMut::Short(v), + Value::Int(v) => ValueMut::Int(v), + Value::Long(v) => ValueMut::Long(v), + Value::Float(v) => ValueMut::Float(v), + Value::Double(v) => ValueMut::Double(v), + Value::ByteArray(v) => ValueMut::ByteArray(v), + Value::String(v) => ValueMut::String(v), + Value::List(v) => ValueMut::List(v), + Value::Compound(v) => ValueMut::Compound(v), + Value::IntArray(v) => ValueMut::IntArray(v), + Value::LongArray(v) => ValueMut::LongArray(v), + } + } +} + +impl ValueRef<'_, S> +where + S: Clone, +{ + /// Clones this value reference to a new owned [`Value`]. + pub fn to_value(&self) -> Value { + match *self { + ValueRef::Byte(v) => Value::Byte(*v), + ValueRef::Short(v) => Value::Short(*v), + ValueRef::Int(v) => Value::Int(*v), + ValueRef::Long(v) => Value::Long(*v), + ValueRef::Float(v) => Value::Float(*v), + ValueRef::Double(v) => Value::Double(*v), + ValueRef::ByteArray(v) => Value::ByteArray(v.to_vec()), + ValueRef::String(v) => Value::String(v.to_owned()), + ValueRef::List(v) => Value::List(v.clone()), + ValueRef::Compound(v) => Value::Compound(v.clone()), + ValueRef::IntArray(v) => Value::IntArray(v.to_vec()), + ValueRef::LongArray(v) => Value::LongArray(v.to_vec()), + } + } +} + +impl ValueMut<'_, S> +where + S: Clone, +{ + /// Clones this mutable value reference to a new owned [`Value`]. + pub fn to_value(&self) -> Value { + match self { + ValueMut::Byte(v) => Value::Byte(**v), + ValueMut::Short(v) => Value::Short(**v), + ValueMut::Int(v) => Value::Int(**v), + ValueMut::Long(v) => Value::Long(**v), + ValueMut::Float(v) => Value::Float(**v), + ValueMut::Double(v) => Value::Double(**v), + ValueMut::ByteArray(v) => Value::ByteArray((*v).clone()), + ValueMut::String(v) => Value::String((*v).clone()), + ValueMut::List(v) => Value::List((*v).clone()), + ValueMut::Compound(v) => Value::Compound((*v).clone()), + ValueMut::IntArray(v) => Value::IntArray((*v).clone()), + ValueMut::LongArray(v) => Value::LongArray((*v).clone()), + } + } +} + +impl<'a, S> ValueMut<'a, S> { + /// Downgrades this mutable value reference into an immutable [`ValueRef`]. + pub fn into_value_ref(self) -> ValueRef<'a, S> { + match self { + ValueMut::Byte(v) => ValueRef::Byte(v), + ValueMut::Short(v) => ValueRef::Short(v), + ValueMut::Int(v) => ValueRef::Int(v), + ValueMut::Long(v) => ValueRef::Long(v), + ValueMut::Float(v) => ValueRef::Float(v), + ValueMut::Double(v) => ValueRef::Double(v), + ValueMut::ByteArray(v) => ValueRef::ByteArray(&v[..]), + ValueMut::String(v) => ValueRef::String(v), + ValueMut::List(v) => ValueRef::List(v), + ValueMut::Compound(v) => ValueRef::Compound(v), + ValueMut::IntArray(v) => ValueRef::IntArray(&v[..]), + ValueMut::LongArray(v) => ValueRef::LongArray(&v[..]), + } + } +} + +/// Bools are usually represented as `0` or `1` bytes in NBT. +impl From for Value { + fn from(b: bool) -> Self { + Value::Byte(b as _) + } +} + +impl From> for Value { + fn from(v: Vec) -> Self { + Self::ByteArray(v) + } +} + +impl From for Value { + fn from(v: String) -> Self { + Self::String(v) + } +} + +impl From<&String> for Value { + fn from(value: &String) -> Self { + Self::String(value.clone()) + } +} + +impl<'a> From<&'a str> for Value { + fn from(v: &'a str) -> Self { + Self::String(v.to_owned()) + } +} + +impl<'a> From> for Value { + fn from(v: Cow<'a, str>) -> Self { + Self::String(v.into_owned()) + } +} + +impl From for Value> { + fn from(v: String) -> Self { + Self::String(Cow::Owned(v)) + } +} + +impl<'a> From<&'a String> for Value> { + fn from(v: &'a String) -> Self { + Self::String(Cow::Borrowed(v)) + } +} + +impl<'a> From<&'a str> for Value> { + fn from(v: &'a str) -> Self { + Self::String(Cow::Borrowed(v)) + } +} + +impl<'a> From> for Value> { + fn from(v: Cow<'a, str>) -> Self { + Self::String(v) + } +} + +#[cfg(feature = "java_string")] +impl From for Value { + fn from(v: java_string::JavaString) -> Self { + Self::String(v) + } +} + +#[cfg(feature = "java_string")] +impl From<&java_string::JavaString> for Value { + fn from(v: &java_string::JavaString) -> Self { + Self::String(v.clone()) + } +} + +#[cfg(feature = "java_string")] +impl<'a> From<&'a java_string::JavaStr> for Value { + fn from(v: &'a java_string::JavaStr) -> Self { + Self::String(v.to_owned()) + } +} + +#[cfg(feature = "java_string")] +impl<'a> From> for Value { + fn from(v: Cow<'a, java_string::JavaStr>) -> Self { + Self::String(v.into_owned()) + } +} + +#[cfg(feature = "java_string")] +impl From for Value { + fn from(v: String) -> Self { + Self::String(java_string::JavaString::from(v)) + } +} + +#[cfg(feature = "java_string")] +impl From<&String> for Value { + fn from(v: &String) -> Self { + Self::String(java_string::JavaString::from(v)) + } +} + +#[cfg(feature = "java_string")] +impl<'a> From<&'a str> for Value { + fn from(v: &'a str) -> Self { + Self::String(java_string::JavaString::from(v)) + } +} + +#[cfg(feature = "java_string")] +impl<'a> From> for Value { + fn from(v: Cow<'a, str>) -> Self { + Self::String(java_string::JavaString::from(v)) + } +} + +#[cfg(feature = "java_string")] +impl From for Value> { + fn from(v: java_string::JavaString) -> Self { + Self::String(Cow::Owned(v)) + } +} + +#[cfg(feature = "java_string")] +impl<'a> From<&'a java_string::JavaString> for Value> { + fn from(v: &'a java_string::JavaString) -> Self { + Self::String(Cow::Borrowed(v)) + } +} + +#[cfg(feature = "java_string")] +impl<'a> From<&'a java_string::JavaStr> for Value> { + fn from(v: &'a java_string::JavaStr) -> Self { + Self::String(Cow::Borrowed(v)) + } +} + +#[cfg(feature = "java_string")] +impl<'a> From> for Value> { + fn from(v: Cow<'a, java_string::JavaStr>) -> Self { + Self::String(v) + } +} + +#[cfg(feature = "java_string")] +impl From for Value> { + fn from(v: String) -> Self { + Self::String(Cow::Owned(java_string::JavaString::from(v))) + } +} + +#[cfg(feature = "java_string")] +impl<'a> From<&'a String> for Value> { + fn from(v: &'a String) -> Self { + Self::String(Cow::Borrowed(java_string::JavaStr::from_str(v))) + } +} + +#[cfg(feature = "java_string")] +impl<'a> From<&'a str> for Value> { + fn from(v: &'a str) -> Self { + Self::String(Cow::Borrowed(java_string::JavaStr::from_str(v))) + } +} + +#[cfg(feature = "java_string")] +impl<'a> From> for Value> { + fn from(v: Cow<'a, str>) -> Self { + Self::String(match v { + Cow::Borrowed(str) => Cow::Borrowed(java_string::JavaStr::from_str(str)), + Cow::Owned(str) => Cow::Owned(java_string::JavaString::from(str)), + }) + } +} + +impl From> for Value { + fn from(v: Vec) -> Self { + Self::IntArray(v) + } +} + +impl From> for Value { + fn from(v: Vec) -> Self { + Self::LongArray(v) + } +} + +impl From> for Value +where + S: Clone, +{ + fn from(v: ValueRef) -> Self { + v.to_value() + } +} + +impl From<&ValueRef<'_, S>> for Value +where + S: Clone, +{ + fn from(v: &ValueRef) -> Self { + v.to_value() + } +} + +impl From> for Value +where + S: Clone, +{ + fn from(v: ValueMut) -> Self { + v.to_value() + } +} + +impl From<&ValueMut<'_, S>> for Value +where + S: Clone, +{ + fn from(v: &ValueMut) -> Self { + v.to_value() + } +} + +#[cfg(feature = "uuid")] +impl From for Value { + fn from(value: uuid::Uuid) -> Self { + let (most, least) = value.as_u64_pair(); + + let first = (most >> 32) as i32; + let second = most as i32; + let third = (least >> 32) as i32; + let fourth = least as i32; + + Value::IntArray(vec![first, second, third, fourth]) + } +} + +#[cfg(feature = "valence_ident")] +impl From> for Value +where + I: Into>, +{ + fn from(value: valence_ident::Ident) -> Self { + value.into_inner().into() + } +} + +impl<'a> From<&'a [i8]> for ValueRef<'a> { + fn from(v: &'a [i8]) -> Self { + Self::ByteArray(v) + } +} + +impl<'a> From<&'a String> for ValueRef<'a, String> { + fn from(v: &'a String) -> ValueRef<'a> { + Self::String(v) + } +} + +impl<'a, S> From<&'a [i32]> for ValueRef<'a, S> { + fn from(v: &'a [i32]) -> Self { + Self::IntArray(v) + } +} + +impl<'a, S> From<&'a [i64]> for ValueRef<'a, S> { + fn from(v: &'a [i64]) -> Self { + Self::LongArray(v) + } +} + +impl<'a, S> From<&'a Value> for ValueRef<'a, S> { + fn from(v: &'a Value) -> Self { + v.as_value_ref() + } +} + +impl<'a, S> From> for ValueRef<'a, S> { + fn from(v: ValueMut<'a, S>) -> Self { + v.into_value_ref() + } +} + +#[cfg(feature = "valence_ident")] +impl<'a> From<&'a valence_ident::Ident> for ValueRef<'a, String> { + fn from(v: &'a valence_ident::Ident) -> Self { + Self::String(v.as_ref()) + } +} + +impl<'a, S> From<&'a mut Vec> for ValueMut<'a, S> { + fn from(v: &'a mut Vec) -> Self { + Self::ByteArray(v) + } +} + +impl<'a> From<&'a mut String> for ValueMut<'a, String> { + fn from(v: &'a mut String) -> Self { + Self::String(v) + } +} + +impl<'a, S> From<&'a mut Vec> for ValueMut<'a, S> { + fn from(v: &'a mut Vec) -> Self { + Self::IntArray(v) + } +} + +impl<'a, S> From<&'a mut Vec> for ValueMut<'a, S> { + fn from(v: &'a mut Vec) -> Self { + Self::LongArray(v) + } +} + +impl<'a, S> From<&'a mut Value> for ValueMut<'a, S> { + fn from(v: &'a mut Value) -> Self { + v.as_value_mut() + } +} diff --git a/vendor/valence/crates/valence_network/Cargo.toml b/vendor/valence/crates/valence_network/Cargo.toml new file mode 100644 index 00000000..2e26dec8 --- /dev/null +++ b/vendor/valence/crates/valence_network/Cargo.toml @@ -0,0 +1,45 @@ +[package] +name = "valence_network" +description = "Login and socket code for Valence" +readme = "README.md" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +# TODO: make encryption and compression optional features. + +[dependencies] +anyhow.workspace = true +async-trait.workspace = true +base64.workspace = true +bevy_app.workspace = true +bevy_ecs.workspace = true +bytes.workspace = true +flume.workspace = true +hmac.workspace = true +num-bigint.workspace = true +rand.workspace = true +rsa-der.workspace = true +rsa.workspace = true +serde = { workspace = true, features = ["derive"] } +serde_json.workspace = true +sha1.workspace = true +sha2.workspace = true +thiserror.workspace = true +tokio.workspace = true +tracing.workspace = true +uuid.workspace = true +valence_server.workspace = true +valence_lang.workspace = true +valence_protocol = { workspace = true, features = [ + "encryption", + "compression", +] } + +[dependencies.reqwest] +workspace = true +default-features = false +# Avoid OpenSSL dependency on Linux. +features = ["rustls-tls", "json"] diff --git a/vendor/valence/crates/valence_network/README.md b/vendor/valence/crates/valence_network/README.md new file mode 100644 index 00000000..d8f7ec04 --- /dev/null +++ b/vendor/valence/crates/valence_network/README.md @@ -0,0 +1,10 @@ +# valence_network + +The plugin responsible for accepting connections and spawning clients. + +This covers everything in the "handshaking", "status" and "login" stages of the protocol, before the main "play" stage begins. Support for proxies like [Velocity] and [BungeeCord] are implemented here. + +Valence users can choose not to include `valence_network` in their project. This could be useful for testing or using Valence as an integrated server in a client. + +[Velocity]: https://papermc.io/software/velocity +[BungeeCord]: https://github.com/SpigotMC/BungeeCord diff --git a/vendor/valence/crates/valence_network/src/byte_channel.rs b/vendor/valence/crates/valence_network/src/byte_channel.rs new file mode 100644 index 00000000..6fc0fcaa --- /dev/null +++ b/vendor/valence/crates/valence_network/src/byte_channel.rs @@ -0,0 +1,254 @@ +//! A channel specifically for sending/receiving batches of bytes. + +#![allow(dead_code)] + +use std::sync::{Arc, Mutex}; + +use bytes::BytesMut; +use thiserror::Error; +use tokio::sync::Notify; + +pub(crate) fn byte_channel(limit: usize) -> (ByteSender, ByteReceiver) { + let shared = Arc::new(Shared { + mtx: Mutex::new(Inner { + bytes: BytesMut::new(), + disconnected: false, + }), + notify: Notify::new(), + limit, + }); + + let sender = ByteSender { + shared: shared.clone(), + }; + + let receiver = ByteReceiver { shared }; + + (sender, receiver) +} + +pub(crate) struct ByteSender { + shared: Arc, +} + +pub(crate) struct ByteReceiver { + shared: Arc, +} + +struct Shared { + mtx: Mutex, + notify: Notify, + limit: usize, +} + +struct Inner { + bytes: BytesMut, + disconnected: bool, +} + +impl ByteSender { + pub(crate) fn take_capacity(&mut self, additional: usize) -> BytesMut { + let mut lck = self.shared.mtx.lock().unwrap(); + + lck.bytes.reserve(additional); + + let len = lck.bytes.len(); + lck.bytes.split_off(len) + } + + pub(crate) fn try_send(&mut self, mut bytes: BytesMut) -> Result<(), TrySendError> { + let mut lck = self.shared.mtx.lock().unwrap(); + + if lck.disconnected { + return Err(TrySendError::Disconnected(bytes)); + } + + if bytes.is_empty() { + return Ok(()); + } + + let available = self.shared.limit - lck.bytes.len(); + + if bytes.len() > available { + if available > 0 { + lck.bytes.unsplit(bytes.split_to(available)); + self.shared.notify.notify_waiters(); + } + + return Err(TrySendError::Full(bytes)); + } + + lck.bytes.unsplit(bytes); + self.shared.notify.notify_waiters(); + + Ok(()) + } + + pub(crate) async fn send_async(&mut self, mut bytes: BytesMut) -> Result<(), SendError> { + loop { + { + let mut lck = self.shared.mtx.lock().unwrap(); + + if lck.disconnected { + return Err(SendError(bytes)); + } + + if bytes.is_empty() { + return Ok(()); + } + + let available = self.shared.limit - lck.bytes.len(); + + if bytes.len() <= available { + lck.bytes.unsplit(bytes); + self.shared.notify.notify_waiters(); + return Ok(()); + } + + if available > 0 { + lck.bytes.unsplit(bytes.split_to(available)); + self.shared.notify.notify_waiters(); + } + } + + self.shared.notify.notified().await; + } + } + + pub(crate) fn is_disconnected(&self) -> bool { + self.shared.mtx.lock().unwrap().disconnected + } + + pub(crate) fn limit(&self) -> usize { + self.shared.limit + } +} + +/// Contains any excess bytes not sent. +#[derive(Clone, PartialEq, Eq, Debug, Error)] +pub(crate) enum TrySendError { + #[error("sender disconnected")] + Disconnected(BytesMut), + #[error("channel full (see `Config::outgoing_capacity`)")] + Full(BytesMut), +} + +#[derive(Clone, PartialEq, Eq, Debug, Error)] +#[error("sender disconnected")] +pub(crate) struct SendError(pub(crate) BytesMut); + +impl SendError { + pub(crate) fn into_inner(self) -> BytesMut { + self.0 + } +} + +impl ByteReceiver { + pub(crate) fn try_recv(&mut self) -> Result { + let mut lck = self.shared.mtx.lock().unwrap(); + + if !lck.bytes.is_empty() { + self.shared.notify.notify_waiters(); + return Ok(lck.bytes.split()); + } + + if lck.disconnected { + return Err(TryRecvError::Disconnected); + } + + Err(TryRecvError::Empty) + } + + pub(crate) async fn recv_async(&mut self) -> Result { + loop { + { + let mut lck = self.shared.mtx.lock().unwrap(); + + if !lck.bytes.is_empty() { + self.shared.notify.notify_waiters(); + return Ok(lck.bytes.split()); + } + + if lck.disconnected { + return Err(RecvError::Disconnected); + } + } + + self.shared.notify.notified().await; + } + } + + pub(crate) fn is_disconnected(&self) -> bool { + self.shared.mtx.lock().unwrap().disconnected + } + + pub(crate) fn limit(&self) -> usize { + self.shared.limit + } +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Error)] +pub(crate) enum TryRecvError { + #[error("empty channel")] + Empty, + #[error("receiver disconnected")] + Disconnected, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Error)] +pub(crate) enum RecvError { + #[error("receiver disconnected")] + Disconnected, +} + +impl Drop for ByteSender { + fn drop(&mut self) { + self.shared.mtx.lock().unwrap().disconnected = true; + } +} + +impl Drop for ByteReceiver { + fn drop(&mut self) { + self.shared.mtx.lock().unwrap().disconnected = true; + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn byte_channel_try() { + let (mut sender, mut receiver) = byte_channel(4); + + assert_eq!( + sender.try_send("hello".as_bytes().into()), + Err(TrySendError::Full("o".as_bytes().into())) + ); + + assert_eq!( + receiver.try_recv().unwrap(), + BytesMut::from("hell".as_bytes()) + ); + } + + #[tokio::test] + async fn byte_channel_async() { + let (mut sender, mut receiver) = byte_channel(4); + + let t = tokio::spawn(async move { + let bytes = receiver.recv_async().await.unwrap(); + assert_eq!(&bytes[..], b"hell"); + let bytes = receiver.recv_async().await.unwrap(); + assert_eq!(&bytes[..], b"o"); + + assert_eq!(receiver.try_recv(), Err(TryRecvError::Empty)); + }); + + sender.send_async("hello".as_bytes().into()).await.unwrap(); + + t.await.unwrap(); + + assert!(sender.is_disconnected()); + } +} diff --git a/vendor/valence/crates/valence_network/src/connect.rs b/vendor/valence/crates/valence_network/src/connect.rs new file mode 100644 index 00000000..027e1428 --- /dev/null +++ b/vendor/valence/crates/valence_network/src/connect.rs @@ -0,0 +1,568 @@ +//! Handles new connections to the server and the log-in process. + +use std::io; +use std::net::SocketAddr; +use std::time::Duration; + +use anyhow::{bail, ensure, Context}; +use base64::prelude::*; +use hmac::digest::Update; +use hmac::{Hmac, Mac}; +use num_bigint::BigInt; +use reqwest::StatusCode; +use rsa::Pkcs1v15Encrypt; +use serde::Deserialize; +use serde_json::{json, Value}; +use sha1::Sha1; +use sha2::{Digest, Sha256}; +use tokio::net::{TcpListener, TcpStream}; +use tracing::{error, info, trace, warn}; +use uuid::Uuid; +use valence_lang::keys; +use valence_protocol::profile::Property; +use valence_protocol::Decode; +use valence_server::client::Properties; +use valence_server::protocol::packets::handshaking::handshake_c2s::HandshakeNextState; +use valence_server::protocol::packets::handshaking::HandshakeC2s; +use valence_server::protocol::packets::login::{ + LoginCompressionS2c, LoginDisconnectS2c, LoginHelloC2s, LoginHelloS2c, LoginKeyC2s, + LoginQueryRequestS2c, LoginQueryResponseC2s, LoginSuccessS2c, +}; +use valence_server::protocol::packets::status::{ + QueryPingC2s, QueryPongS2c, QueryRequestC2s, QueryResponseS2c, +}; +use valence_server::protocol::{PacketDecoder, PacketEncoder, RawBytes, VarInt}; +use valence_server::text::{Color, IntoText}; +use valence_server::{ident, Text, MINECRAFT_VERSION, PROTOCOL_VERSION}; + +use crate::legacy_ping::try_handle_legacy_ping; +use crate::packet_io::PacketIo; +use crate::{CleanupOnDrop, ConnectionMode, NewClientInfo, ServerListPing, SharedNetworkState}; + +/// Accepts new connections to the server as they occur. +pub(super) async fn do_accept_loop(shared: SharedNetworkState) { + let listener = match TcpListener::bind(shared.0.address).await { + Ok(listener) => listener, + Err(e) => { + error!("failed to start TCP listener: {e}"); + return; + } + }; + + let timeout = Duration::from_secs(5); + + loop { + match shared.0.connection_sema.clone().acquire_owned().await { + Ok(permit) => match listener.accept().await { + Ok((stream, remote_addr)) => { + let shared = shared.clone(); + + tokio::spawn(async move { + if let Err(e) = tokio::time::timeout( + timeout, + handle_connection(shared, stream, remote_addr), + ) + .await + { + warn!("initial connection timed out: {e}"); + } + + drop(permit); + }); + } + Err(e) => { + error!("failed to accept incoming connection: {e}"); + } + }, + // Closed semaphore indicates server shutdown. + Err(_) => return, + } + } +} + +async fn handle_connection( + shared: SharedNetworkState, + mut stream: TcpStream, + remote_addr: SocketAddr, +) { + trace!("handling connection"); + + if let Err(e) = stream.set_nodelay(true) { + error!("failed to set TCP_NODELAY: {e}"); + } + + match try_handle_legacy_ping(&shared, &mut stream, remote_addr).await { + Ok(true) => return, // Legacy ping succeeded. + Ok(false) => {} // No legacy ping. + Err(e) if e.kind() == io::ErrorKind::UnexpectedEof => {} + Err(e) => { + warn!("legacy ping ended with error: {e:#}"); + } + } + + let io = PacketIo::new(stream, PacketEncoder::new(), PacketDecoder::new()); + + if let Err(e) = handle_handshake(shared, io, remote_addr).await { + // EOF can happen if the client disconnects while joining, which isn't + // very erroneous. + if let Some(e) = e.downcast_ref::() { + if e.kind() == io::ErrorKind::UnexpectedEof { + return; + } + } + warn!("connection ended with error: {e:#}"); + } +} + +/// Basic information about a client, provided at the beginning of the +/// connection +#[derive(Default, Debug)] +pub struct HandshakeData { + /// The protocol version of the client. + pub protocol_version: i32, + /// The address that the client used to connect. + pub server_address: String, + /// The port that the client used to connect. + pub server_port: u16, +} + +async fn handle_handshake( + shared: SharedNetworkState, + mut io: PacketIo, + remote_addr: SocketAddr, +) -> anyhow::Result<()> { + let handshake = io.recv_packet::().await?; + + let next_state = handshake.next_state; + + let handshake = HandshakeData { + protocol_version: handshake.protocol_version.0, + server_address: handshake.server_address.0.to_owned(), + server_port: handshake.server_port, + }; + + // TODO: this is borked. + ensure!( + shared.0.connection_mode == ConnectionMode::BungeeCord + || handshake.server_address.encode_utf16().count() <= 255, + "handshake server address is too long" + ); + + match next_state { + HandshakeNextState::Status => handle_status(shared, io, remote_addr, handshake) + .await + .context("handling status"), + HandshakeNextState::Login => { + match handle_login(&shared, &mut io, remote_addr, handshake) + .await + .context("handling login")? + { + Some((info, cleanup)) => { + let client = io.into_client_args( + info, + shared.0.incoming_byte_limit, + shared.0.outgoing_byte_limit, + cleanup, + ); + + let _ = shared.0.new_clients_send.send_async(client).await; + + Ok(()) + } + None => Ok(()), + } + } + } +} + +async fn handle_status( + shared: SharedNetworkState, + mut io: PacketIo, + remote_addr: SocketAddr, + handshake: HandshakeData, +) -> anyhow::Result<()> { + io.recv_packet::().await?; + + match shared + .0 + .callbacks + .inner + .server_list_ping(&shared, remote_addr, &handshake) + .await + { + ServerListPing::Respond { + online_players, + max_players, + player_sample, + mut description, + favicon_png, + version_name, + protocol, + } => { + // For pre-1.16 clients, replace all webcolors with their closest + // normal colors Because webcolor support was only + // added at 1.16. + if handshake.protocol_version < 735 { + fn fallback_webcolors(txt: &mut Text) { + if let Some(Color::Rgb(ref color)) = txt.color { + txt.color = Some(Color::Named(color.to_named_lossy())); + } + for child in &mut txt.extra { + fallback_webcolors(child); + } + } + + fallback_webcolors(&mut description); + } + + let mut json = json!({ + "version": { + "name": version_name, + "protocol": protocol, + }, + "players": { + "online": online_players, + "max": max_players, + "sample": player_sample, + }, + "description": description, + }); + + if !favicon_png.is_empty() { + let mut buf = "data:image/png;base64,".to_owned(); + BASE64_STANDARD.encode_string(favicon_png, &mut buf); + json["favicon"] = Value::String(buf); + } + + io.send_packet(&QueryResponseS2c { + json: &json.to_string(), + }) + .await?; + } + ServerListPing::Ignore => return Ok(()), + } + + let QueryPingC2s { payload } = io.recv_packet().await?; + + io.send_packet(&QueryPongS2c { payload }).await?; + + Ok(()) +} + +/// Handle the login process and return the new client's data if successful. +async fn handle_login( + shared: &SharedNetworkState, + io: &mut PacketIo, + remote_addr: SocketAddr, + handshake: HandshakeData, +) -> anyhow::Result> { + if handshake.protocol_version != PROTOCOL_VERSION { + io.send_packet(&LoginDisconnectS2c { + // TODO: use correct translation key. + reason: format!("Mismatched Minecraft version (server is on {MINECRAFT_VERSION})") + .color(Color::RED) + .into(), + }) + .await?; + + return Ok(None); + } + + let LoginHelloC2s { + username, + profile_id: _, // TODO + } = io.recv_packet().await?; + + let username = username.0.to_owned(); + + let info = match shared.connection_mode() { + ConnectionMode::Online { .. } => login_online(shared, io, remote_addr, username).await?, + ConnectionMode::Offline => login_offline(remote_addr, username)?, + ConnectionMode::BungeeCord => { + login_bungeecord(remote_addr, &handshake.server_address, username)? + } + ConnectionMode::Velocity { secret } => login_velocity(io, username, secret).await?, + }; + + if shared.0.threshold.0 > 0 { + io.send_packet(&LoginCompressionS2c { + threshold: shared.0.threshold.0.into(), + }) + .await?; + + io.set_compression(shared.0.threshold); + } + + let cleanup = match shared.0.callbacks.inner.login(shared, &info).await { + Ok(f) => CleanupOnDrop(Some(f)), + Err(reason) => { + info!("disconnect at login: \"{reason}\""); + io.send_packet(&LoginDisconnectS2c { + reason: reason.into(), + }) + .await?; + return Ok(None); + } + }; + + io.send_packet(&LoginSuccessS2c { + uuid: info.uuid, + username: info.username.as_str().into(), + properties: Default::default(), + }) + .await?; + + Ok(Some((info, cleanup))) +} + +/// Login procedure for online mode. +async fn login_online( + shared: &SharedNetworkState, + io: &mut PacketIo, + remote_addr: SocketAddr, + username: String, +) -> anyhow::Result { + let my_verify_token: [u8; 16] = rand::random(); + + io.send_packet(&LoginHelloS2c { + server_id: "".into(), // Always empty + public_key: &shared.0.public_key_der, + verify_token: &my_verify_token, + }) + .await?; + + let LoginKeyC2s { + shared_secret, + verify_token: encrypted_verify_token, + } = io.recv_packet().await?; + + let shared_secret = shared + .0 + .rsa_key + .decrypt(Pkcs1v15Encrypt, shared_secret) + .context("failed to decrypt shared secret")?; + + let verify_token = shared + .0 + .rsa_key + .decrypt(Pkcs1v15Encrypt, encrypted_verify_token) + .context("failed to decrypt verify token")?; + + ensure!( + my_verify_token.as_slice() == verify_token, + "verify tokens do not match" + ); + + let crypt_key: [u8; 16] = shared_secret + .as_slice() + .try_into() + .context("shared secret has the wrong length")?; + + io.enable_encryption(&crypt_key); + + let hash = Sha1::new() + .chain(&shared_secret) + .chain(&shared.0.public_key_der) + .finalize(); + + let url = shared + .0 + .callbacks + .inner + .session_server( + shared, + username.as_str(), + &auth_digest(&hash), + &remote_addr.ip(), + ) + .await; + + let resp = shared.0.http_client.get(url).send().await?; + + match resp.status() { + StatusCode::OK => {} + StatusCode::NO_CONTENT => { + let reason = Text::translate(keys::MULTIPLAYER_DISCONNECT_UNVERIFIED_USERNAME, []); + io.send_packet(&LoginDisconnectS2c { + reason: reason.into(), + }) + .await?; + bail!("session server could not verify username"); + } + status => { + bail!("session server GET request failed (status code {status})"); + } + } + + #[derive(Deserialize)] + struct GameProfile { + id: Uuid, + name: String, + properties: Vec, + } + + let profile: GameProfile = resp.json().await.context("parsing game profile")?; + + ensure!(profile.name == username, "usernames do not match"); + + Ok(NewClientInfo { + uuid: profile.id, + username, + ip: remote_addr.ip(), + properties: Properties(profile.properties), + }) +} + +fn auth_digest(bytes: &[u8]) -> String { + BigInt::from_signed_bytes_be(bytes).to_str_radix(16) +} + +fn offline_uuid(username: &str) -> anyhow::Result { + Uuid::from_slice(&Sha256::digest(username)[..16]).map_err(Into::into) +} + +/// Login procedure for offline mode. +fn login_offline(remote_addr: SocketAddr, username: String) -> anyhow::Result { + Ok(NewClientInfo { + // Derive the client's UUID from a hash of their username. + uuid: offline_uuid(username.as_str())?, + username, + properties: Default::default(), + ip: remote_addr.ip(), + }) +} + +/// Login procedure for BungeeCord. +fn login_bungeecord( + remote_addr: SocketAddr, + server_address: &str, + username: String, +) -> anyhow::Result { + // Get data from server_address field of the handshake + let data = server_address.split('\0').take(4).collect::>(); + + // Ip of player, only given if ip_forward on bungee is true + let ip = match data.get(1) { + Some(ip) => ip.parse()?, + None => remote_addr.ip(), + }; + + // Uuid of player, only given if ip_forward on bungee is true + let uuid = match data.get(2) { + Some(uuid) => uuid.parse()?, + None => offline_uuid(username.as_str())?, + }; + + // Read properties and get textures + // Properties of player's game profile, only given if ip_forward and online_mode + // on bungee both are true + let properties: Vec = match data.get(3) { + Some(properties) => serde_json::from_str(properties) + .context("failed to parse BungeeCord player properties")?, + None => vec![], + }; + + Ok(NewClientInfo { + uuid, + username, + properties: Properties(properties), + ip, + }) +} + +/// Login procedure for Velocity. +async fn login_velocity( + io: &mut PacketIo, + username: String, + velocity_secret: &str, +) -> anyhow::Result { + const VELOCITY_MIN_SUPPORTED_VERSION: u8 = 1; + const VELOCITY_MODERN_FORWARDING_WITH_KEY_V2: i32 = 3; + + let message_id: i32 = 0; // TODO: make this random? + + // Send Player Info Request into the Plugin Channel + io.send_packet(&LoginQueryRequestS2c { + message_id: VarInt(message_id), + channel: ident!("velocity:player_info").into(), + data: RawBytes(&[VELOCITY_MIN_SUPPORTED_VERSION]).into(), + }) + .await?; + + // Get Response + let plugin_response: LoginQueryResponseC2s = io.recv_packet().await?; + + ensure!( + plugin_response.message_id.0 == message_id, + "mismatched plugin response ID (got {}, expected {message_id})", + plugin_response.message_id.0, + ); + + let data = plugin_response + .data + .context("missing plugin response data")? + .0; + + ensure!(data.len() >= 32, "invalid plugin response data length"); + let (signature, mut data_without_signature) = data.split_at(32); + + // Verify signature + let mut mac = Hmac::::new_from_slice(velocity_secret.as_bytes())?; + Mac::update(&mut mac, data_without_signature); + mac.verify_slice(signature)?; + + // Check Velocity version + let version = VarInt::decode(&mut data_without_signature) + .context("failed to decode velocity version")? + .0; + + // Get client address + let remote_addr = String::decode(&mut data_without_signature)?.parse()?; + + // Get UUID + let uuid = Uuid::decode(&mut data_without_signature)?; + + // Get username and validate + ensure!( + username == <&str>::decode(&mut data_without_signature)?, + "mismatched usernames" + ); + + // Read game profile properties + let properties = Vec::::decode(&mut data_without_signature) + .context("decoding velocity game profile properties")?; + + if version >= VELOCITY_MODERN_FORWARDING_WITH_KEY_V2 { + // TODO + } + + Ok(NewClientInfo { + uuid, + username, + properties: Properties(properties), + ip: remote_addr, + }) +} + +#[cfg(test)] +mod tests { + use sha1::Digest; + + use super::*; + + #[test] + fn auth_digest_usernames() { + assert_eq!( + auth_digest(&Sha1::digest("Notch")), + "4ed1f46bbe04bc756bcb17c0c7ce3e4632f06a48" + ); + assert_eq!( + auth_digest(&Sha1::digest("jeb_")), + "-7c9d5b0044c130109a5d7b5fb5c317c02b4e28c1" + ); + assert_eq!( + auth_digest(&Sha1::digest("simon")), + "88e16a1019277b15d58faf0541e11910eb756f6" + ); + } +} diff --git a/vendor/valence/crates/valence_network/src/legacy_ping.rs b/vendor/valence/crates/valence_network/src/legacy_ping.rs new file mode 100644 index 00000000..151e63c5 --- /dev/null +++ b/vendor/valence/crates/valence_network/src/legacy_ping.rs @@ -0,0 +1,334 @@ +use std::io; +use std::net::SocketAddr; +use std::time::Duration; + +use tokio::io::{AsyncReadExt, AsyncWriteExt}; +use tokio::net::TcpStream; +use tokio::time::sleep; + +use crate::{ServerListLegacyPing, SharedNetworkState}; + +/// The payload of the legacy server list ping. +#[derive(PartialEq, Debug, Clone)] +pub enum ServerListLegacyPingPayload { + /// The 1.6 legacy ping format, which includes additional data. + Pre1_7 { + /// The protocol version of the client. + protocol: i32, + /// The hostname the client used to connect to the server. + hostname: String, + /// The port the client used to connect to the server. + port: u16, + }, + /// The 1.4-1.5 legacy ping format. + Pre1_6, + /// The Beta 1.8-1.3 legacy ping format. + Pre1_4, +} + +/// Response data of the legacy server list ping. +/// +/// # Example +/// +/// ``` +/// # use valence_network::ServerListLegacyPingResponse; +/// let mut response = +/// ServerListLegacyPingResponse::new(127, 0, 10).version("Valence 1.20.1".to_owned()); +/// +/// // This will make the description just repeat "hello" until the length limit +/// // (which depends on the other fields that we set above: protocol, version, +/// // online players, max players). +/// let max_description = response.max_description(); +/// response = response.description( +/// std::iter::repeat("hello ") +/// .flat_map(|s| s.chars()) +/// .take(max_description) +/// .collect(), +/// ); +/// ``` +#[derive(Clone, Default, Debug, PartialEq)] +pub struct ServerListLegacyPingResponse { + protocol: i32, + version: String, + online_players: i32, + max_players: i32, + description: String, +} + +#[derive(PartialEq, Debug)] +enum PingFormat { + Pre1_4, // Beta 1.8 to 1.3 + Pre1_6, // 1.4 to 1.5 + Pre1_7, // 1.6 +} + +/// Returns true if legacy ping detected and handled +pub(crate) async fn try_handle_legacy_ping( + shared: &SharedNetworkState, + stream: &mut TcpStream, + remote_addr: SocketAddr, +) -> io::Result { + let mut temp_buf = [0u8; 3]; + let mut n = stream.peek(&mut temp_buf).await?; + + if let [0xfe] | [0xfe, 0x01] = &temp_buf[..n] { + // This could mean one of following things: + // 1. The beginning of a normal handshake packet, not fully received yet though + // 2. The beginning of the 1.6 legacy ping, not fully received yet either + // 3. Pre-1.4 legacy ping (0xfe) or 1.4-1.5 legacy ping (0xfe 0x01), fully + // received + // + // So in the name of the Father, the Son, and the Holy Spirit, we pray, + // and wait for more data to arrive if it's 1 or 2, and if no + // data arrives for long enough, we can assume its 3. + // + // Downsides of this approach and where this could go wrong: + // 1. Short artificial delay for pre-1.4 and 1.4-1.5 legacy pings + // 2. If a normal handshake is encountered with the exact length of 0xfe 0x01 in + // VarInt format (extremely rare, the server address would have to be ~248 + // bytes long), and for some God-forsaken reason sent the first 2 bytes of + // the packet but not any more in this whole time, we would incorrectly + // assume that it's a legacy ping and send an incorrect response. + // 3. If it was a 1.6 legacy ping, but even after the delay we only received + // only 1 byte, then we would also send an incorrect response, thinking its a + // pre-1.4 ping. The client would still understand it though, it'd just think + // that the server is old (pre-1.4). + // + // In my opinion, 1 is insignificant, and 2/3 are so rare that they are + // effectively insignificant too. Network IO is just not that reliable + // at this level, the connection may be lost as well or something at this point. + sleep(Duration::from_millis(10)).await; + n = stream.peek(&mut temp_buf).await?; + } + + let format = match &temp_buf[..n] { + [0xfe] => PingFormat::Pre1_4, + [0xfe, 0x01] => PingFormat::Pre1_6, + [0xfe, 0x01, 0xfa] => PingFormat::Pre1_7, + _ => return Ok(false), // Not a legacy ping + }; + + let payload = match format { + PingFormat::Pre1_7 => read_payload(stream).await?, + PingFormat::Pre1_6 => ServerListLegacyPingPayload::Pre1_6, + PingFormat::Pre1_4 => ServerListLegacyPingPayload::Pre1_4, + }; + + if let ServerListLegacyPing::Respond(mut response) = shared + .0 + .callbacks + .inner + .server_list_legacy_ping(shared, remote_addr, payload) + .await + { + if format == PingFormat::Pre1_4 { + // remove formatting for pre-1.4 legacy pings + remove_formatting(&mut response.description); + } + + let separator = match format { + PingFormat::Pre1_4 => '§', + _ => '\0', + }; + + let mut buf = Vec::new(); + + // packet ID and length placeholder + buf.extend([0xff, 0x00, 0x00]); + + if format != PingFormat::Pre1_4 { + // some constant bytes lol + buf.extend("§1\0".encode_utf16().flat_map(|c| c.to_be_bytes())); + + // protocol and version + buf.extend( + format!( + "{protocol}{separator}{version}{separator}", + protocol = response.protocol, + version = response.version + ) + .encode_utf16() + .flat_map(|c| c.to_be_bytes()), + ); + } + + // Description + buf.extend( + response + .description + .encode_utf16() + .flat_map(|c| c.to_be_bytes()), + ); + + // Online and max players + buf.extend( + format!( + "{separator}{online_players}{separator}{max_players}", + online_players = response.online_players, + max_players = response.max_players + ) + .encode_utf16() + .flat_map(|c| c.to_be_bytes()), + ); + + // replace the length placeholder with the actual length + let chars = (buf.len() as u16 - 3) / 2; // -3 because of the packet prefix (id and length), and /2 because UTF16 + buf[1..3].copy_from_slice(chars.to_be_bytes().as_slice()); + + stream.write_all(&buf).await?; + } + + Ok(true) +} + +// Reads the payload of a 1.6 legacy ping +async fn read_payload(stream: &mut TcpStream) -> io::Result { + // consume the first 29 useless bytes of this amazing protocol + stream.read_exact(&mut [0u8; 29]).await?; + + let protocol = stream.read_u8().await? as i32; + let hostname_len = (stream.read_u16().await? as usize) * 2; + + if hostname_len > 512 { + return Err(io::Error::new( + io::ErrorKind::InvalidData, + "hostname too long", + )); + } + + let mut hostname = vec![0u8; hostname_len]; + stream.read_exact(&mut hostname).await?; + let hostname = String::from_utf16_lossy( + &hostname + .chunks(2) + .map(|pair| u16::from_be_bytes([pair[0], pair[1]])) + .collect::>(), + ); + + let port = stream.read_i32().await? as u16; + + Ok(ServerListLegacyPingPayload::Pre1_7 { + protocol, + hostname, + port, + }) +} + +impl ServerListLegacyPingResponse { + const MAX_VALID_LENGTH: usize = 248; + + // Length of all the fields combined in string form. Used for validating and + // comparing with MAX_VALID_LENGTH. + fn length(&self) -> usize { + let mut len = 0; + len += int_len(self.protocol); + len += int_len(self.online_players); + len += int_len(self.max_players); + len += self.version.encode_utf16().count(); + len += self.description.encode_utf16().count(); + + len + } + /// Constructs a new basic [`ServerListLegacyPingResponse`]. + /// + /// See [`description`][Self::description] and [`version`][Self::version]. + pub fn new(protocol: i32, online_players: i32, max_players: i32) -> Self { + Self { + protocol, + version: String::new(), + online_players, + max_players, + description: String::new(), + } + } + /// Sets the description of the server. + /// + /// If the resulting response packet is too long to be valid, the + /// description will be truncated. + /// + /// Use [`max_description`][Self::max_description] method to get the max + /// valid length for this specific packet with the already set fields + /// (version, protocol, online players, max_players). + /// + /// Also any null bytes will be removed. + pub fn description(mut self, description: String) -> Self { + self.description = description; + + self.description.retain(|c| c != '\0'); + + let overflow = self.length() as i32 - Self::MAX_VALID_LENGTH as i32; + if overflow > 0 { + let truncation_index = self + .description + .char_indices() + .nth(self.description.encode_utf16().count() - overflow as usize) + .unwrap() + .0; + self.description.truncate(truncation_index); + } + + self + } + /// Sets the version of the server. + /// + /// If the resulting response packet is too long to be valid, the + /// version will be truncated. + /// + /// Use [`max_version`][Self::max_version] method to get the max valid + /// length for this specific packet with the already set fields + /// (description, protocol, online players, max_players). + /// + /// Also any null bytes will be removed. + pub fn version(mut self, version: String) -> Self { + self.version = version; + + self.version.retain(|c| c != '\0'); + + let overflow = self.length() as i32 - Self::MAX_VALID_LENGTH as i32; + if overflow > 0 { + let truncation_index = self + .version + .char_indices() + .nth(self.version.encode_utf16().count() - overflow as usize) + .unwrap() + .0; + self.version.truncate(truncation_index); + } + + self + } + /// Returns the maximum number of characters (not bytes) that this packet's + /// description can have with all other fields set as they are. + pub fn max_description(&self) -> usize { + Self::MAX_VALID_LENGTH - (self.length() - self.description.encode_utf16().count()) + } + /// Returns the maximum number of characters (not bytes) that this packet's + /// version can have with all other fields set as they are. + pub fn max_version(&self) -> usize { + Self::MAX_VALID_LENGTH - (self.length() - self.version.encode_utf16().count()) + } +} + +// Returns the length of a string representation of a signed integer +fn int_len(num: i32) -> usize { + let num_abs = num.abs() as f64; + + if num < 0 { + (num_abs.log10() + 2.0) as usize // because minus sign + } else { + (num_abs.log10() + 1.0) as usize + } +} + +// Removes all `§` and their modifiers, if any +fn remove_formatting(string: &mut String) { + while let Some(pos) = string.find('§') { + // + 2 because we know that `§` is 2 bytes + if let Some(c) = string[(pos + 2)..].chars().next() { + // remove next char too if any + string.replace_range(pos..(pos + 2 + c.len_utf8()), ""); + } else { + string.remove(pos); + } + } +} diff --git a/vendor/valence/crates/valence_network/src/lib.rs b/vendor/valence/crates/valence_network/src/lib.rs new file mode 100644 index 00000000..916fea25 --- /dev/null +++ b/vendor/valence/crates/valence_network/src/lib.rs @@ -0,0 +1,693 @@ +#![doc = include_str!("../README.md")] +#![deny( + rustdoc::broken_intra_doc_links, + rustdoc::private_intra_doc_links, + rustdoc::missing_crate_level_docs, + rustdoc::invalid_codeblock_attributes, + rustdoc::invalid_rust_codeblocks, + rustdoc::bare_urls, + rustdoc::invalid_html_tags +)] +#![warn( + trivial_casts, + trivial_numeric_casts, + unused_lifetimes, + unused_import_braces, + unreachable_pub, + clippy::dbg_macro +)] + +mod byte_channel; +mod connect; +mod legacy_ping; +mod packet_io; + +use std::borrow::Cow; +use std::net::{IpAddr, Ipv4Addr, SocketAddr, SocketAddrV4}; +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::sync::Arc; +use std::time::Duration; + +use anyhow::Context; +pub use async_trait::async_trait; +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use connect::do_accept_loop; +pub use connect::HandshakeData; +use flume::{Receiver, Sender}; +pub use legacy_ping::{ServerListLegacyPingPayload, ServerListLegacyPingResponse}; +use rand::rngs::OsRng; +use rsa::traits::PublicKeyParts; +use rsa::RsaPrivateKey; +use serde::Serialize; +use tokio::net::UdpSocket; +use tokio::runtime::{Handle, Runtime}; +use tokio::sync::Semaphore; +use tokio::time; +use tracing::error; +use uuid::Uuid; +use valence_protocol::text::IntoText; +use valence_server::client::{ClientBundle, ClientBundleArgs, Properties, SpawnClientsSet}; +use valence_server::{CompressionThreshold, Server, Text, MINECRAFT_VERSION, PROTOCOL_VERSION}; + +pub struct NetworkPlugin; + +impl Plugin for NetworkPlugin { + fn build(&self, app: &mut App) { + if let Err(e) = build_plugin(app) { + error!("failed to build network plugin: {e:#}"); + } + } +} + +fn build_plugin(app: &mut App) -> anyhow::Result<()> { + let threshold = app + .world + .get_resource::() + .context("missing server resource")? + .compression_threshold(); + + let settings = app + .world + .get_resource_or_insert_with(NetworkSettings::default); + + let (new_clients_send, new_clients_recv) = flume::bounded(64); + + let rsa_key = RsaPrivateKey::new(&mut OsRng, 1024)?; + + let public_key_der = + rsa_der::public_key_to_der(&rsa_key.n().to_bytes_be(), &rsa_key.e().to_bytes_be()) + .into_boxed_slice(); + + let runtime = if settings.tokio_handle.is_none() { + Some(Runtime::new()?) + } else { + None + }; + + let tokio_handle = match &runtime { + Some(rt) => rt.handle().clone(), + None => settings.tokio_handle.clone().unwrap(), + }; + + let shared = SharedNetworkState(Arc::new(SharedNetworkStateInner { + callbacks: settings.callbacks.clone(), + address: settings.address, + incoming_byte_limit: settings.incoming_byte_limit, + outgoing_byte_limit: settings.outgoing_byte_limit, + connection_sema: Arc::new(Semaphore::new( + settings.max_connections.min(Semaphore::MAX_PERMITS), + )), + player_count: AtomicUsize::new(0), + max_players: settings.max_players, + connection_mode: settings.connection_mode.clone(), + threshold, + tokio_handle, + _tokio_runtime: runtime, + new_clients_send, + new_clients_recv, + rsa_key, + public_key_der, + http_client: reqwest::Client::new(), + })); + + app.insert_resource(shared.clone()); + + // System for starting the accept loop. + let start_accept_loop = move |shared: Res| { + let _guard = shared.0.tokio_handle.enter(); + + // Start accepting new connections. + tokio::spawn(do_accept_loop(shared.clone())); + }; + + let start_broadcast_to_lan_loop = move |shared: Res| { + let _guard = shared.0.tokio_handle.enter(); + + tokio::spawn(do_broadcast_to_lan_loop(shared.clone())); + }; + + // System for spawning new clients. + let spawn_new_clients = move |world: &mut World| { + for _ in 0..shared.0.new_clients_recv.len() { + match shared.0.new_clients_recv.try_recv() { + Ok(args) => world.spawn(ClientBundle::new(args)), + Err(_) => break, + }; + } + }; + + // Start accepting connections in `PostStartup` to allow user startup code to + // run first. + app.add_systems(PostStartup, start_accept_loop); + + // Start the loop that will broadcast messages for the LAN discovery list. + app.add_systems(PostStartup, start_broadcast_to_lan_loop); + + // Spawn new clients before the event loop starts. + app.add_systems(PreUpdate, spawn_new_clients.in_set(SpawnClientsSet)); + + Ok(()) +} + +#[derive(Resource, Clone)] +pub struct SharedNetworkState(Arc); + +impl SharedNetworkState { + pub fn connection_mode(&self) -> &ConnectionMode { + &self.0.connection_mode + } + + pub fn player_count(&self) -> &AtomicUsize { + &self.0.player_count + } + + pub fn max_players(&self) -> usize { + self.0.max_players + } +} +struct SharedNetworkStateInner { + callbacks: ErasedNetworkCallbacks, + address: SocketAddr, + incoming_byte_limit: usize, + outgoing_byte_limit: usize, + /// Limits the number of simultaneous connections to the server before the + /// play state. + connection_sema: Arc, + //// The number of clients in the play state, past the login state. + player_count: AtomicUsize, + max_players: usize, + connection_mode: ConnectionMode, + threshold: CompressionThreshold, + tokio_handle: Handle, + // Holding a runtime handle is not enough to keep tokio working. We need + // to store the runtime here so we don't drop it. + _tokio_runtime: Option, + /// Sender for new clients past the login stage. + new_clients_send: Sender, + /// Receiver for new clients past the login stage. + new_clients_recv: Receiver, + /// The RSA keypair used for encryption with clients. + rsa_key: RsaPrivateKey, + /// The public part of `rsa_key` encoded in DER, which is an ASN.1 format. + /// This is sent to clients during the authentication process. + public_key_der: Box<[u8]>, + /// For session server requests. + http_client: reqwest::Client, +} + +/// Contains information about a new client joining the server. +#[derive(Debug)] +#[non_exhaustive] +pub struct NewClientInfo { + /// The username of the new client. + pub username: String, + /// The UUID of the new client. + pub uuid: Uuid, + /// The remote address of the new client. + pub ip: IpAddr, + /// The client's properties from the game profile. Typically contains a + /// `textures` property with the skin and cape of the player. + pub properties: Properties, +} + +/// Settings for [`NetworkPlugin`]. Note that mutations to these fields have no +/// effect after the plugin is built. +#[derive(Resource, Clone)] +pub struct NetworkSettings { + pub callbacks: ErasedNetworkCallbacks, + /// The [`Handle`] to the tokio runtime the server will use. If `None` is + /// provided, the server will create its own tokio runtime at startup. + /// + /// # Default Value + /// + /// `None` + pub tokio_handle: Option, + /// The maximum number of simultaneous initial connections to the server. + /// + /// This only considers the connections _before_ the play state where the + /// client is spawned into the world.. + /// + /// # Default Value + /// + /// The default value is left unspecified and may change in future versions. + pub max_connections: usize, + /// # Default Value + /// + /// `20` + pub max_players: usize, + /// The socket address the server will be bound to. + /// + /// # Default Value + /// + /// `0.0.0.0:25565`, which will listen on every available network interface. + pub address: SocketAddr, + /// The connection mode. This determines if client authentication and + /// encryption should take place and if the server should get the player + /// data from a proxy. + /// + /// **NOTE:** Mutations to this field have no effect if + /// + /// # Default Value + /// + /// [`ConnectionMode::Online`] + pub connection_mode: ConnectionMode, + /// The maximum capacity (in bytes) of the buffer used to hold incoming + /// packet data. + /// + /// A larger capacity reduces the chance that a client needs to be + /// disconnected due to a full buffer, but increases potential + /// memory usage. + /// + /// # Default Value + /// + /// The default value is left unspecified and may change in future versions. + pub incoming_byte_limit: usize, + /// The maximum capacity (in bytes) of the buffer used to hold outgoing + /// packet data. + /// + /// A larger capacity reduces the chance that a client needs to be + /// disconnected due to a full buffer, but increases potential + /// memory usage. + /// + /// # Default Value + /// + /// The default value is left unspecified and may change in future versions. + pub outgoing_byte_limit: usize, +} + +impl Default for NetworkSettings { + fn default() -> Self { + Self { + callbacks: ErasedNetworkCallbacks::default(), + tokio_handle: None, + max_connections: 1024, + max_players: 20, + address: SocketAddrV4::new(Ipv4Addr::new(0, 0, 0, 0), 25565).into(), + connection_mode: ConnectionMode::Online { + prevent_proxy_connections: false, + }, + incoming_byte_limit: 2097152, // 2 MiB + outgoing_byte_limit: 8388608, // 8 MiB + } + } +} + +/// A type-erased wrapper around an [`NetworkCallbacks`] object. +#[derive(Clone)] +pub struct ErasedNetworkCallbacks { + // TODO: do some shenanigans when async-in-trait is stabilized. + inner: Arc, +} + +impl ErasedNetworkCallbacks { + pub fn new(callbacks: impl NetworkCallbacks) -> Self { + Self { + inner: Arc::new(callbacks), + } + } +} + +impl Default for ErasedNetworkCallbacks { + fn default() -> Self { + Self { + inner: Arc::new(()), + } + } +} + +impl From for ErasedNetworkCallbacks { + fn from(value: T) -> Self { + Self::new(value) + } +} + +/// This trait uses [`mod@async_trait`]. +#[async_trait] +pub trait NetworkCallbacks: Send + Sync + 'static { + /// Called when the server receives a Server List Ping query. + /// Data for the response can be provided or the query can be ignored. + /// + /// This function is called from within a tokio runtime. + /// + /// # Default Implementation + /// + /// A default placeholder response is returned. + async fn server_list_ping( + &self, + shared: &SharedNetworkState, + remote_addr: SocketAddr, + handshake_data: &HandshakeData, + ) -> ServerListPing { + #![allow(unused_variables)] + + ServerListPing::Respond { + online_players: shared.player_count().load(Ordering::Relaxed) as i32, + max_players: shared.max_players() as i32, + player_sample: vec![], + description: "A Valence Server".into_text(), + favicon_png: &[], + version_name: MINECRAFT_VERSION.to_owned(), + protocol: PROTOCOL_VERSION, + } + } + + /// Called when the server receives a Server List Legacy Ping query. + /// Data for the response can be provided or the query can be ignored. + /// + /// This function is called from within a tokio runtime. + /// + /// # Default Implementation + /// + /// [`server_list_ping`][Self::server_list_ping] re-used. + async fn server_list_legacy_ping( + &self, + shared: &SharedNetworkState, + remote_addr: SocketAddr, + payload: ServerListLegacyPingPayload, + ) -> ServerListLegacyPing { + #![allow(unused_variables)] + + let handshake_data = match payload { + ServerListLegacyPingPayload::Pre1_7 { + protocol, + hostname, + port, + } => HandshakeData { + protocol_version: protocol, + server_address: hostname, + server_port: port, + }, + _ => HandshakeData::default(), + }; + + match self + .server_list_ping(shared, remote_addr, &handshake_data) + .await + { + ServerListPing::Respond { + online_players, + max_players, + player_sample, + description, + favicon_png, + version_name, + protocol, + } => ServerListLegacyPing::Respond( + ServerListLegacyPingResponse::new(protocol, online_players, max_players) + .version(version_name) + .description(description.to_legacy_lossy()), + ), + ServerListPing::Ignore => ServerListLegacyPing::Ignore, + } + } + + /// This function is called every 1.5 seconds to broadcast a packet over the + /// local network in order to advertise the server to the multiplayer + /// screen with a configurable MOTD. + /// + /// # Default Implementation + /// + /// The default implementation returns [`BroadcastToLan::Disabled`], + /// disabling LAN discovery. + async fn broadcast_to_lan(&self, shared: &SharedNetworkState) -> BroadcastToLan { + #![allow(unused_variables)] + + BroadcastToLan::Disabled + } + + /// Called for each client (after successful authentication if online mode + /// is enabled) to determine if they can join the server. + /// - If `Err(reason)` is returned, then the client is immediately + /// disconnected with `reason` as the displayed message. + /// - Otherwise, `Ok(f)` is returned and the client will continue the login + /// process. This _may_ result in a new client being spawned with the + /// [`ClientBundle`] components. `f` is stored along with the client and + /// is called when the client is disconnected. + /// + /// `f` is a callback function used for handling resource cleanup when the + /// client is dropped. This is useful because a new client entity is not + /// necessarily spawned into the world after a successful login. + /// + /// This method is called from within a tokio runtime, and is the + /// appropriate place to perform asynchronous operations such as + /// database queries which may take some time to complete. + /// + /// # Default Implementation + /// + /// TODO + /// + /// [`Client`]: valence::client::Client + async fn login( + &self, + shared: &SharedNetworkState, + info: &NewClientInfo, + ) -> Result { + let _ = info; + + let max_players = shared.max_players(); + + let success = shared + .player_count() + .fetch_update(Ordering::SeqCst, Ordering::SeqCst, |n| { + if n < max_players { + Some(n + 1) + } else { + None + } + }) + .is_ok(); + + if success { + let shared = shared.clone(); + + Ok(Box::new(move || { + let prev = shared.player_count().fetch_sub(1, Ordering::SeqCst); + debug_assert_ne!(prev, 0, "player count underflowed"); + })) + } else { + // TODO: use correct translation key. + Err("Server Full".into_text()) + } + } + + /// Called upon every client login to obtain the full URL to use for session + /// server requests. This is done to authenticate player accounts. This + /// method is not called unless [online mode] is enabled. + /// + /// It is assumed that upon successful request, a structure matching the + /// description in the [wiki](https://wiki.vg/Protocol_Encryption#Server) was obtained. + /// Providing a URL that does not return such a structure will result in a + /// disconnect for every client that connects. + /// + /// The arguments are described in the linked wiki article. + /// + /// # Default Implementation + /// + /// Uses the official Minecraft session server. This is formatted as + /// `https://sessionserver.mojang.com/session/minecraft/hasJoined?username=&serverId=&ip=`. + /// + /// [online mode]: ConnectionMode::Online + async fn session_server( + &self, + shared: &SharedNetworkState, + username: &str, + auth_digest: &str, + player_ip: &IpAddr, + ) -> String { + if shared.connection_mode() + == (&ConnectionMode::Online { + prevent_proxy_connections: true, + }) + { + format!("https://sessionserver.mojang.com/session/minecraft/hasJoined?username={username}&serverId={auth_digest}&ip={player_ip}") + } else { + format!("https://sessionserver.mojang.com/session/minecraft/hasJoined?username={username}&serverId={auth_digest}") + } + } +} + +/// A callback function called when the associated client is dropped. See +/// [`NetworkCallbacks::login`] for more information. +pub type CleanupFn = Box; +struct CleanupOnDrop(Option); + +impl Drop for CleanupOnDrop { + fn drop(&mut self) { + if let Some(f) = self.0.take() { + f(); + } + } +} + +/// The default network callbacks. Useful as a placeholder. +impl NetworkCallbacks for () {} + +/// Describes how new connections to the server are handled. +#[derive(Clone, PartialEq)] +#[non_exhaustive] +pub enum ConnectionMode { + /// The "online mode" fetches all player data (username, UUID, and + /// properties) from the [configured session server] and enables + /// encryption. + /// + /// This mode should be used by all publicly exposed servers which are not + /// behind a proxy. + /// + /// [configured session server]: NetworkCallbacks::session_server + Online { + /// Determines if client IP validation should take place during + /// authentication. + /// + /// When `prevent_proxy_connections` is enabled, clients can no longer + /// log-in if they connected to the Yggdrasil server using a different + /// IP than the one used to connect to this server. + /// + /// This is used by the default implementation of + /// [`NetworkCallbacks::session_server`]. A different implementation may + /// choose to ignore this value. + prevent_proxy_connections: bool, + }, + /// Disables client authentication with the configured session server. + /// Clients can join with any username and UUID they choose, potentially + /// gaining privileges they would not otherwise have. Additionally, + /// encryption is disabled and Minecraft's default skins will be used. + /// + /// This mode should be used for development purposes only and not for + /// publicly exposed servers. + Offline, + /// This mode should be used under one of the following situations: + /// - The server is behind a [BungeeCord]/[Waterfall] proxy with IP + /// forwarding enabled. + /// - The server is behind a [Velocity] proxy configured to use the `legacy` + /// forwarding mode. + /// + /// All player data (username, UUID, and properties) is fetched from the + /// proxy, but no attempt is made to stop connections originating from + /// elsewhere. As a result, you must ensure clients connect through the + /// proxy and are unable to connect to the server directly. Otherwise, + /// clients can use any username or UUID they choose similar to + /// [`ConnectionMode::Offline`]. + /// + /// To protect against this, a firewall can be used. However, + /// [`ConnectionMode::Velocity`] is recommended as a secure alternative. + /// + /// [BungeeCord]: https://www.spigotmc.org/wiki/bungeecord/ + /// [Waterfall]: https://github.com/PaperMC/Waterfall + /// [Velocity]: https://velocitypowered.com/ + BungeeCord, + /// This mode is used when the server is behind a [Velocity] proxy + /// configured with the forwarding mode `modern`. + /// + /// All player data (username, UUID, and properties) is fetched from the + /// proxy and all connections originating from outside Velocity are + /// blocked. + /// + /// [Velocity]: https://velocitypowered.com/ + Velocity { + /// The secret key used to prevent connections from outside Velocity. + /// The proxy and Valence must be configured to use the same secret key. + secret: Arc, + }, +} + +/// The result of the Server List Ping [callback]. +/// +/// [callback]: NetworkCallbacks::server_list_ping +#[derive(Clone, Default, Debug)] +pub enum ServerListPing<'a> { + /// Responds to the server list ping with the given information. + Respond { + /// Displayed as the number of players on the server. + online_players: i32, + /// Displayed as the maximum number of players allowed on the server at + /// a time. + max_players: i32, + /// The list of players visible by hovering over the player count. + /// + /// Has no effect if this list is empty. + player_sample: Vec, + /// A description of the server. + description: Text, + /// The server's icon as the bytes of a PNG image. + /// The image must be 64x64 pixels. + /// + /// No icon is used if the slice is empty. + favicon_png: &'a [u8], + /// The version name of the server. Displayed when client is using a + /// different protocol. + /// + /// Can be formatted using `§` and format codes. Or use + /// [`valence_protocol::text::Text::to_legacy_lossy`]. + version_name: String, + /// The protocol version of the server. + protocol: i32, + }, + /// Ignores the query and disconnects from the client. + #[default] + Ignore, +} + +/// The result of the Server List Legacy Ping [callback]. +/// +/// [callback]: NetworkCallbacks::server_list_legacy_ping +#[derive(Clone, Default, Debug)] +pub enum ServerListLegacyPing { + /// Responds to the server list legacy ping with the given information. + Respond(ServerListLegacyPingResponse), + /// Ignores the query and disconnects from the client. + #[default] + Ignore, +} + +/// The result of the Broadcast To Lan [callback]. +/// +/// [callback]: NetworkCallbacks::broadcast_to_lan +#[derive(Clone, Default, Debug)] +pub enum BroadcastToLan<'a> { + /// Disabled Broadcast To Lan. + #[default] + Disabled, + /// Send packet to broadcast to LAN every 1.5 seconds with specified MOTD. + Enabled(Cow<'a, str>), +} + +/// Represents an individual entry in the player sample. +#[derive(Clone, Debug, Serialize)] +pub struct PlayerSampleEntry { + /// The name of the player. + /// + /// This string can contain + /// [legacy formatting codes](https://minecraft.wiki/w/Formatting_codes). + pub name: String, + /// The player UUID. + pub id: Uuid, +} + +async fn do_broadcast_to_lan_loop(shared: SharedNetworkState) { + let port = shared.0.address.port(); + + let Ok(socket) = UdpSocket::bind("0.0.0.0:0").await else { + tracing::error!("Failed to bind to UDP socket for broadcast to LAN"); + return; + }; + + loop { + let motd = match shared.0.callbacks.inner.broadcast_to_lan(&shared).await { + BroadcastToLan::Disabled => { + time::sleep(Duration::from_millis(1500)).await; + continue; + } + BroadcastToLan::Enabled(motd) => motd, + }; + + let message = format!("[MOTD]{motd}[/MOTD][AD]{port}[/AD]"); + + if let Err(e) = socket.send_to(message.as_bytes(), "224.0.2.60:4445").await { + tracing::warn!("Failed to send broadcast to LAN packet: {}", e); + } + + // wait 1.5 seconds + tokio::time::sleep(std::time::Duration::from_millis(1500)).await; + } +} diff --git a/vendor/valence/crates/valence_network/src/packet_io.rs b/vendor/valence/crates/valence_network/src/packet_io.rs new file mode 100644 index 00000000..7212b481 --- /dev/null +++ b/vendor/valence/crates/valence_network/src/packet_io.rs @@ -0,0 +1,255 @@ +use std::io::ErrorKind; +use std::sync::Arc; +use std::time::Instant; +use std::{io, mem}; + +use anyhow::bail; +use bytes::BytesMut; +use tokio::io::{AsyncReadExt, AsyncWriteExt}; +use tokio::net::TcpStream; +use tokio::sync::Semaphore; +use tokio::task::JoinHandle; +use tracing::{debug, warn}; +use valence_protocol::CompressionThreshold; +use valence_server::client::{ClientBundleArgs, ClientConnection, ReceivedPacket}; +use valence_server::protocol::decode::PacketFrame; +use valence_server::protocol::{Decode, Encode, Packet, PacketDecoder, PacketEncoder}; + +use crate::byte_channel::{byte_channel, ByteSender, TrySendError}; +use crate::{CleanupOnDrop, NewClientInfo}; + +pub(crate) struct PacketIo { + stream: TcpStream, + enc: PacketEncoder, + dec: PacketDecoder, + frame: PacketFrame, +} + +const READ_BUF_SIZE: usize = 4096; + +impl PacketIo { + pub(crate) fn new(stream: TcpStream, enc: PacketEncoder, dec: PacketDecoder) -> Self { + Self { + stream, + enc, + dec, + frame: PacketFrame { + id: -1, + body: BytesMut::new(), + }, + } + } + + pub(crate) async fn send_packet

(&mut self, pkt: &P) -> anyhow::Result<()> + where + P: Packet + Encode, + { + self.enc.append_packet(pkt)?; + let bytes = self.enc.take(); + self.stream.write_all(&bytes).await?; + Ok(()) + } + + pub(crate) async fn recv_packet<'a, P>(&'a mut self) -> anyhow::Result

+ where + P: Packet + Decode<'a>, + { + loop { + if let Some(frame) = self.dec.try_next_packet()? { + self.frame = frame; + + return self.frame.decode(); + } + + self.dec.reserve(READ_BUF_SIZE); + let mut buf = self.dec.take_capacity(); + + if self.stream.read_buf(&mut buf).await? == 0 { + return Err(io::Error::from(ErrorKind::UnexpectedEof).into()); + } + + // This should always be an O(1) unsplit because we reserved space earlier and + // the call to `read_buf` shouldn't have grown the allocation. + self.dec.queue_bytes(buf); + } + } + + #[allow(dead_code)] + pub(crate) fn set_compression(&mut self, threshold: CompressionThreshold) { + self.enc.set_compression(threshold); + self.dec.set_compression(threshold); + } + + pub(crate) fn enable_encryption(&mut self, key: &[u8; 16]) { + self.enc.enable_encryption(key); + self.dec.enable_encryption(key); + } + + pub(crate) fn into_client_args( + mut self, + info: NewClientInfo, + incoming_byte_limit: usize, + outgoing_byte_limit: usize, + cleanup: CleanupOnDrop, + ) -> ClientBundleArgs { + let (incoming_sender, incoming_receiver) = flume::unbounded(); + + let incoming_byte_limit = incoming_byte_limit.min(Semaphore::MAX_PERMITS); + + let recv_sem = Arc::new(Semaphore::new(incoming_byte_limit)); + let recv_sem_clone = recv_sem.clone(); + + let (mut reader, mut writer) = self.stream.into_split(); + + let reader_task = tokio::spawn(async move { + let mut buf = BytesMut::new(); + + loop { + let frame = match self.dec.try_next_packet() { + Ok(Some(frame)) => frame, + Ok(None) => { + // Incomplete packet. Need more data. + + buf.reserve(READ_BUF_SIZE); + match reader.read_buf(&mut buf).await { + Ok(0) => break, // Reader is at EOF. + Ok(_) => {} + Err(e) => { + debug!("error reading data from stream: {e}"); + break; + } + } + + self.dec.queue_bytes(buf.split()); + + continue; + } + Err(e) => { + warn!("error decoding packet frame: {e:#}"); + break; + } + }; + + let timestamp = Instant::now(); + + // Estimate memory usage of this packet. + let cost = mem::size_of::() + frame.body.len(); + + if cost > incoming_byte_limit { + debug!( + cost, + incoming_byte_limit, + "cost of received packet is greater than the incoming memory limit" + ); + // We would never acquire enough permits, so we should exit instead of getting + // stuck. + break; + } + + // Wait until there's enough space for this packet. + let Ok(permits) = recv_sem.acquire_many(cost as u32).await else { + // Semaphore closed. + break; + }; + + // The permits will be added back on the other side of the channel. + permits.forget(); + + let packet = ReceivedPacket { + timestamp, + id: frame.id, + body: frame.body.freeze(), + }; + + if incoming_sender.try_send(packet).is_err() { + // Channel closed. + break; + } + } + }); + + let (outgoing_sender, mut outgoing_receiver) = byte_channel(outgoing_byte_limit); + + let writer_task = tokio::spawn(async move { + loop { + let bytes = match outgoing_receiver.recv_async().await { + Ok(bytes) => bytes, + Err(e) => { + debug!("error receiving packet data: {e}"); + break; + } + }; + + if let Err(e) = writer.write_all(&bytes).await { + debug!("error writing data to stream: {e}"); + } + } + }); + + ClientBundleArgs { + username: info.username, + uuid: info.uuid, + ip: info.ip, + properties: info.properties.0, + conn: Box::new(RealClientConnection { + send: outgoing_sender, + recv: incoming_receiver, + recv_sem: recv_sem_clone, + reader_task, + writer_task, + _cleanup: cleanup, + }), + enc: self.enc, + } + } +} + +struct RealClientConnection { + send: ByteSender, + recv: flume::Receiver, + /// Limits the amount of data queued in the `recv` channel. Each permit + /// represents one byte. + recv_sem: Arc, + _cleanup: CleanupOnDrop, + reader_task: JoinHandle<()>, + writer_task: JoinHandle<()>, +} + +impl ClientConnection for RealClientConnection { + fn try_send(&mut self, bytes: BytesMut) -> anyhow::Result<()> { + match self.send.try_send(bytes) { + Ok(()) => Ok(()), + Err(TrySendError::Full(_)) => bail!( + "reached configured outgoing limit of {} bytes", + self.send.limit() + ), + Err(TrySendError::Disconnected(_)) => bail!("client disconnected"), + } + } + + fn try_recv(&mut self) -> anyhow::Result> { + match self.recv.try_recv() { + Ok(packet) => { + let cost = mem::size_of::() + packet.body.len(); + + // Add the permits back that we removed earlier. + self.recv_sem.add_permits(cost); + + Ok(Some(packet)) + } + Err(flume::TryRecvError::Empty) => Ok(None), + Err(flume::TryRecvError::Disconnected) => bail!("client disconnected"), + } + } + + fn len(&self) -> usize { + self.recv.len() + } +} + +impl Drop for RealClientConnection { + fn drop(&mut self) { + self.writer_task.abort(); + self.reader_task.abort(); + } +} diff --git a/vendor/valence/crates/valence_player_list/Cargo.toml b/vendor/valence/crates/valence_player_list/Cargo.toml new file mode 100644 index 00000000..176c9438 --- /dev/null +++ b/vendor/valence/crates/valence_player_list/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "valence_player_list" +description = "Player list (tablist) support for Valence" +readme = "README.md" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[dependencies] +bevy_app.workspace = true +bevy_ecs.workspace = true +bitfield-struct.workspace = true +derive_more.workspace = true +valence_server.workspace = true diff --git a/vendor/valence/crates/valence_player_list/README.md b/vendor/valence/crates/valence_player_list/README.md new file mode 100644 index 00000000..70450e4d --- /dev/null +++ b/vendor/valence/crates/valence_player_list/README.md @@ -0,0 +1,6 @@ +# valence_player_list + +Manages Minecraft's "player list" which is the table seen while holding the tab key in game. + +Correctly updating and sending the player list is necessary for player entities to be rendered by clients. + diff --git a/vendor/valence/crates/valence_player_list/src/lib.rs b/vendor/valence/crates/valence_player_list/src/lib.rs new file mode 100644 index 00000000..27fbab7d --- /dev/null +++ b/vendor/valence/crates/valence_player_list/src/lib.rs @@ -0,0 +1,387 @@ +#![doc = include_str!("../README.md")] +#![deny( + rustdoc::broken_intra_doc_links, + rustdoc::private_intra_doc_links, + rustdoc::missing_crate_level_docs, + rustdoc::invalid_codeblock_attributes, + rustdoc::invalid_rust_codeblocks, + rustdoc::bare_urls, + rustdoc::invalid_html_tags +)] +#![warn( + trivial_casts, + trivial_numeric_casts, + unused_lifetimes, + unused_import_braces, + unreachable_pub, + clippy::dbg_macro +)] +#![allow(clippy::type_complexity)] + +use std::borrow::Cow; + +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use derive_more::{Deref, DerefMut}; +use valence_server::client::{Client, Properties, Username}; +use valence_server::keepalive::Ping; +use valence_server::layer::UpdateLayersPreClientSet; +use valence_server::protocol::encode::PacketWriter; +use valence_server::protocol::packets::play::{ + player_list_s2c as packet, PlayerListHeaderS2c, PlayerListS2c, PlayerRemoveS2c, +}; +use valence_server::protocol::WritePacket; +use valence_server::text::IntoText; +use valence_server::uuid::Uuid; +use valence_server::{Despawned, GameMode, Server, Text, UniqueId}; + +pub struct PlayerListPlugin; + +#[derive(SystemSet, Copy, Clone, PartialEq, Eq, Hash, Debug)] +struct PlayerListSet; + +impl Plugin for PlayerListPlugin { + fn build(&self, app: &mut App) { + app.insert_resource(PlayerList::new()) + .configure_sets( + PostUpdate, + // Needs to happen before player entities are initialized. Otherwise, they will + // appear invisible. + PlayerListSet.before(UpdateLayersPreClientSet), + ) + .add_systems( + PostUpdate, + ( + update_header_footer, + add_new_clients_to_player_list, + apply_deferred, // So new clients get the packets for their own entry. + update_entries, + init_player_list_for_clients, + remove_despawned_entries, + write_player_list_changes, + ) + .in_set(PlayerListSet) + .chain(), + ); + } +} + +#[derive(Resource)] +pub struct PlayerList { + cached_update_packets: Vec, + header: Text, + footer: Text, + changed_header_or_footer: bool, + /// If clients should be automatically added and removed from the player + /// list with the proper components inserted. Enabled by default. + pub manage_clients: bool, +} + +impl PlayerList { + fn new() -> Self { + Self { + cached_update_packets: vec![], + header: Text::default(), + footer: Text::default(), + changed_header_or_footer: false, + manage_clients: true, + } + } + + pub fn header(&self) -> &Text { + &self.header + } + + pub fn footer(&self) -> &Text { + &self.footer + } + + pub fn set_header<'a>(&mut self, txt: impl IntoText<'a>) { + let txt = txt.into_cow_text().into_owned(); + + if txt != self.header { + self.changed_header_or_footer = true; + } + + self.header = txt; + } + + pub fn set_footer<'a>(&mut self, txt: impl IntoText<'a>) { + let txt = txt.into_cow_text().into_owned(); + + if txt != self.footer { + self.changed_header_or_footer = true; + } + + self.footer = txt; + } +} + +/// Bundle for spawning new player list entries. All components are required +/// unless otherwise stated. +/// +/// # Despawning player list entries +/// +/// The [`Despawned`] component must be used to despawn player list entries. +#[derive(Bundle, Default, Debug)] +pub struct PlayerListEntryBundle { + pub player_list_entry: PlayerListEntry, + /// Careful not to modify this! + pub uuid: UniqueId, + pub username: Username, + pub properties: Properties, + pub game_mode: GameMode, + pub ping: Ping, + pub display_name: DisplayName, + pub listed: Listed, +} + +/// Marker component for player list entries. +#[derive(Component, Default, Debug)] +pub struct PlayerListEntry; + +/// Displayed name for a player list entry. Appears as [`Username`] if `None`. +#[derive(Component, Default, Debug, Deref, DerefMut)] +pub struct DisplayName(pub Option); + +/// If a player list entry is visible. Defaults to `true`. +#[derive(Component, Copy, Clone, Debug, Deref, DerefMut)] +pub struct Listed(pub bool); + +impl Default for Listed { + fn default() -> Self { + Self(true) + } +} + +fn update_header_footer(player_list: ResMut, server: Res) { + if player_list.changed_header_or_footer { + let player_list = player_list.into_inner(); + + let mut w = PacketWriter::new( + &mut player_list.cached_update_packets, + server.compression_threshold(), + ); + + w.write_packet(&PlayerListHeaderS2c { + header: (&player_list.header).into(), + footer: (&player_list.footer).into(), + }); + + player_list.changed_header_or_footer = false; + } +} + +fn add_new_clients_to_player_list( + clients: Query>, + player_list: Res, + mut commands: Commands, +) { + if player_list.manage_clients { + for entity in &clients { + commands.entity(entity).insert(( + PlayerListEntry, + DisplayName::default(), + Listed::default(), + )); + } + } +} + +fn init_player_list_for_clients( + mut clients: Query<&mut Client, (Added, Without)>, + player_list: Res, + entries: Query< + ( + &UniqueId, + &Username, + &Properties, + &GameMode, + &Ping, + &DisplayName, + &Listed, + ), + With, + >, +) { + if player_list.manage_clients { + for mut client in &mut clients { + let actions = packet::PlayerListActions::new() + .with_add_player(true) + .with_update_game_mode(true) + .with_update_listed(true) + .with_update_latency(true) + .with_update_display_name(true); + + let entries: Vec<_> = entries + .iter() + .map( + |(uuid, username, props, game_mode, ping, display_name, listed)| { + packet::PlayerListEntry { + player_uuid: uuid.0, + username: &username.0, + properties: Cow::Borrowed(&props.0), + chat_data: None, + listed: listed.0, + ping: ping.0, + game_mode: *game_mode, + display_name: display_name.0.as_ref().map(Cow::Borrowed), + } + }, + ) + .collect(); + + if !entries.is_empty() { + client.write_packet(&PlayerListS2c { + actions, + entries: Cow::Owned(entries), + }); + } + + if !player_list.header.is_empty() || !player_list.footer.is_empty() { + client.write_packet(&PlayerListHeaderS2c { + header: Cow::Borrowed(&player_list.header), + footer: Cow::Borrowed(&player_list.footer), + }); + } + } + } +} + +fn remove_despawned_entries( + entries: Query<&UniqueId, (Added, With)>, + player_list: ResMut, + server: Res, + mut removed: Local>, +) { + if player_list.manage_clients { + debug_assert!(removed.is_empty()); + + removed.extend(entries.iter().map(|uuid| uuid.0)); + + if !removed.is_empty() { + let player_list = player_list.into_inner(); + + let mut w = PacketWriter::new( + &mut player_list.cached_update_packets, + server.compression_threshold(), + ); + + w.write_packet(&PlayerRemoveS2c { + uuids: Cow::Borrowed(&removed), + }); + + removed.clear(); + } + } +} + +fn update_entries( + entries: Query< + ( + Ref, + Ref, + Ref, + Ref, + Ref, + Ref, + Ref, + ), + ( + With, + Or<( + Changed, + Changed, + Changed, + Changed, + Changed, + Changed, + Changed, + )>, + ), + >, + server: Res, + player_list: ResMut, +) { + let player_list = player_list.into_inner(); + + let mut writer = PacketWriter::new( + &mut player_list.cached_update_packets, + server.compression_threshold(), + ); + + for (uuid, username, props, game_mode, ping, display_name, listed) in &entries { + let mut actions = packet::PlayerListActions::new(); + + // Did a change occur that would force us to overwrite the entry? This also adds + // new entries. + if uuid.is_changed() || username.is_changed() || props.is_changed() { + actions.set_add_player(true); + + if *game_mode != GameMode::default() { + actions.set_update_game_mode(true); + } + + if ping.0 != 0 { + actions.set_update_latency(true); + } + + if display_name.0.is_some() { + actions.set_update_display_name(true); + } + + if listed.0 { + actions.set_update_listed(true); + } + } else { + if game_mode.is_changed() { + actions.set_update_game_mode(true); + } + + if ping.is_changed() { + actions.set_update_latency(true); + } + + if display_name.is_changed() { + actions.set_update_display_name(true); + } + + if listed.is_changed() { + actions.set_update_listed(true); + } + + debug_assert_ne!(u8::from(actions), 0); + } + + let entry = packet::PlayerListEntry { + player_uuid: uuid.0, + username: &username.0, + properties: Cow::Borrowed(&props.0), + chat_data: None, + listed: listed.0, + ping: ping.0, + game_mode: *game_mode, + display_name: display_name.0.as_ref().map(|x| x.into()), + }; + + writer.write_packet(&PlayerListS2c { + actions, + entries: Cow::Borrowed(&[entry]), + }); + } +} + +fn write_player_list_changes( + mut player_list: ResMut, + mut clients: Query<&mut Client, Without>, +) { + if !player_list.cached_update_packets.is_empty() { + for mut client in &mut clients { + if !client.is_added() { + client.write_packet_bytes(&player_list.cached_update_packets); + } + } + + player_list.cached_update_packets.clear(); + } +} diff --git a/vendor/valence/crates/valence_protocol/Cargo.toml b/vendor/valence/crates/valence_protocol/Cargo.toml new file mode 100644 index 00000000..b5a61f58 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/Cargo.toml @@ -0,0 +1,41 @@ +[package] +name = "valence_protocol" +description = "Protocol library for Minecraft: Java Edition" +readme = "README.md" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[features] +encryption = ["dep:aes", "dep:cfb8"] +compression = ["dep:flate2"] + +[dependencies] +bevy_ecs.workspace = true # TODO: make this optional +valence_math.workspace = true +valence_generated.workspace = true +valence_text.workspace = true +valence_nbt = { workspace = true, features = ["binary"] } +valence_protocol_macros.workspace = true +anyhow.workspace = true +thiserror.workspace = true +serde = { workspace = true, features = ["derive"] } +byteorder.workspace = true +uuid.workspace = true +valence_bytes.workspace = true +valence_ident.workspace = true +base64.workspace = true +url.workspace = true +serde_json.workspace = true +tracing.workspace = true +bytes.workspace = true +bitfield-struct.workspace = true +derive_more = { workspace = true, features = ["from", "into", "deref", "deref_mut", "as_ref"] } +cfb8 = { workspace = true, optional = true } +flate2 = { workspace = true, optional = true } +aes = { workspace = true, optional = true } + +[dev-dependencies] +rand.workspace = true diff --git a/vendor/valence/crates/valence_protocol/README.md b/vendor/valence/crates/valence_protocol/README.md new file mode 100644 index 00000000..c8449447 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/README.md @@ -0,0 +1,47 @@ +# valence_protocol + +A protocol library for _Minecraft: Java Edition_. Use this to build clients, servers, proxies, or something novel! + +`valence_protocol` is primarily concerned with defining all of Minecraft's [network packets](packets) and the process for encoding and decoding them. To encode and decode packets, use the [`PacketEncoder`] and [`PacketDecoder`] types. + +```rust +use valence_protocol::{PacketEncoder, PacketDecoder, Difficulty}; +use valence_protocol::packets::play::DifficultyS2c; + +let mut encoder = PacketEncoder::new(); + +let packet = DifficultyS2c { + difficulty: Difficulty::Peaceful, + locked: true, +}; + +// Encode our packet struct. +encoder.append_packet(&packet); + +// Take our encoded packet(s) out of the encoder. +let bytes = encoder.take(); + +let mut decoder = PacketDecoder::new(); + +// Put it in the decoder. +decoder.queue_bytes(bytes); + +// Get the next packet "frame" from the decoder and use that to decode the body of the packet. +// Packet frames can be thought of as type-erased packet structs. +let frame = decoder.try_next_packet().unwrap().unwrap(); +let decoded_packet = frame.decode::().unwrap(); + +// Check that our original packet struct is the same as the one we just decoded. +assert_eq!(&packet, &decoded_packet); +``` + +## Supported Minecraft Versions + +Currently, `valence_protocol` only intends to support the most recent stable version of Minecraft. New Minecraft versions often entail a major version bump, since breaking changes to packet definitions are frequent. + +The currently targeted Minecraft version and protocol version can be checked using the [`MINECRAFT_VERSION`] and [`PROTOCOL_VERSION`] constants. + +## Feature Flags + +- `encryption`: Enables support for packet encryption. +- `compression`: Enables support for packet compression. diff --git a/vendor/valence/crates/valence_protocol/src/array.rs b/vendor/valence/crates/valence_protocol/src/array.rs new file mode 100644 index 00000000..abca7ea2 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/array.rs @@ -0,0 +1,58 @@ +use std::io::Write; + +use anyhow::ensure; +use bytes::Bytes; + +use crate::var_int::VarInt; +use crate::{Decode, DecodeBytes, Encode}; + +/// A fixed-size array encoded and decoded with a [`VarInt`] length prefix. +/// +/// This is used when the length of the array is known statically, but a +/// length prefix is needed anyway. +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] +#[repr(transparent)] +pub struct FixedArray(pub [T; N]); + +impl Encode for FixedArray { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + VarInt(N as i32).encode(&mut w)?; + self.0.encode(w) + } +} + +impl Decode for FixedArray { + fn decode(r: &mut &[u8]) -> anyhow::Result { + let len = VarInt::decode(r)?.0; + ensure!( + len == N as i32, + "unexpected length of {len} for fixed-sized array of length {N}" + ); + + <[T; N]>::decode(r).map(FixedArray) + } +} + +impl DecodeBytes for FixedArray { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + let len = VarInt::decode_bytes(r)?.0; + ensure!( + len == N as i32, + "unexpected length of {len} for fixed-sized array of length {N}" + ); + + <[T; N]>::decode_bytes(r).map(FixedArray) + } +} + +impl From<[T; N]> for FixedArray { + fn from(value: [T; N]) -> Self { + Self(value) + } +} + +impl From> for [T; N] { + fn from(value: FixedArray) -> Self { + value.0 + } +} diff --git a/vendor/valence/crates/valence_protocol/src/biome_pos.rs b/vendor/valence/crates/valence_protocol/src/biome_pos.rs new file mode 100644 index 00000000..a9db91a0 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/biome_pos.rs @@ -0,0 +1,36 @@ +use valence_math::DVec3; + +use crate::BlockPos; + +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Default, Debug)] +pub struct BiomePos { + pub x: i32, + pub y: i32, + pub z: i32, +} + +impl BiomePos { + pub const fn new(x: i32, y: i32, z: i32) -> Self { + Self { x, y, z } + } +} + +impl From for BiomePos { + fn from(pos: BlockPos) -> Self { + Self { + x: pos.x.div_euclid(4), + y: pos.y.div_euclid(4), + z: pos.z.div_euclid(4), + } + } +} + +impl From for BiomePos { + fn from(pos: DVec3) -> Self { + Self { + x: (pos.x / 4.0).floor() as i32, + y: (pos.y / 4.0).floor() as i32, + z: (pos.z / 4.0).floor() as i32, + } + } +} diff --git a/vendor/valence/crates/valence_protocol/src/bit_set.rs b/vendor/valence/crates/valence_protocol/src/bit_set.rs new file mode 100644 index 00000000..2d6c6596 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/bit_set.rs @@ -0,0 +1,126 @@ +use std::fmt; +use std::io::Write; + +use crate::{Decode, DecodeBytesAuto, Encode}; + +// TODO: when better const exprs are available, compute BYTE_COUNT from +// BIT_COUNT. +#[derive(Copy, Clone, PartialEq, Eq, DecodeBytesAuto)] +pub struct FixedBitSet(pub [u8; BYTE_COUNT]); + +impl FixedBitSet { + pub fn bit(&self, idx: usize) -> bool { + check_counts(BIT_COUNT, BYTE_COUNT); + assert!( + idx < BIT_COUNT, + "bit index of {idx} out of range for bitset with {BIT_COUNT} bits" + ); + + self.0[idx / 8] >> (idx % 8) & 1 == 1 + } + + pub fn set_bit(&mut self, idx: usize, val: bool) { + check_counts(BIT_COUNT, BYTE_COUNT); + assert!( + idx < BIT_COUNT, + "bit index of {idx} out of range for bitset with {BIT_COUNT} bits" + ); + + let byte = &mut self.0[idx / 8]; + *byte |= (val as u8) << (idx % 8); + } +} + +impl Encode + for FixedBitSet +{ + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + check_counts(BIT_COUNT, BYTE_COUNT); + self.0.encode(w) + } +} + +impl Decode + for FixedBitSet +{ + fn decode(r: &mut &[u8]) -> anyhow::Result { + check_counts(BIT_COUNT, BYTE_COUNT); + Ok(Self(Decode::decode(r)?)) + } +} + +const fn check_counts(bits: usize, bytes: usize) { + assert!(bits.div_ceil(8) == bytes) +} + +impl fmt::Debug + for FixedBitSet +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt::Display::fmt(self, f) + } +} + +impl fmt::Display + for FixedBitSet +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "0b")?; + + for i in (0..BIT_COUNT).rev() { + if self.bit(i) { + write!(f, "1")?; + } else { + write!(f, "0")?; + } + } + + Ok(()) + } +} + +/// šŸ˜” +macro_rules! impl_default { + ($($N:literal)*) => { + $( + impl Default for FixedBitSet { + fn default() -> Self { + Self(Default::default()) + } + } + )* + } +} + +impl_default!(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16); + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn fixed_bit_set_ops() { + let mut bits = FixedBitSet::<20, 3>::default(); + + assert!(!bits.bit(5)); + bits.set_bit(5, true); + assert!(bits.bit(5)); + assert_eq!(bits.0, [0b00100000, 0, 0]); + } + + #[test] + #[should_panic] + fn fixed_bit_set_out_of_range() { + let mut bits = FixedBitSet::<20, 3>::default(); + + bits.set_bit(20, true); + } + + #[test] + fn display_fixed_bit_set() { + let mut bits = FixedBitSet::<20, 3>::default(); + bits.set_bit(5, true); + + assert_eq!(format!("{bits}"), "0b00000000000000100000"); + } +} diff --git a/vendor/valence/crates/valence_protocol/src/block_pos.rs b/vendor/valence/crates/valence_protocol/src/block_pos.rs new file mode 100644 index 00000000..51ad5d2f --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/block_pos.rs @@ -0,0 +1,226 @@ +use std::fmt; +use std::io::Write; +use std::ops::{Add, Sub}; + +use anyhow::bail; +use bitfield_struct::bitfield; +use derive_more::From; +use thiserror::Error; +use valence_math::{DVec3, IVec3}; + +use crate::direction::Direction; +use crate::{Decode, DecodeBytesAuto, Encode}; + +/// Represents an absolute block position in world space. +#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, DecodeBytesAuto)] +pub struct BlockPos { + pub x: i32, + pub y: i32, + pub z: i32, +} + +impl BlockPos { + /// Constructs a new block position. + pub const fn new(x: i32, y: i32, z: i32) -> Self { + Self { x, y, z } + } + + /// Get a new [`BlockPos`] that is adjacent to this position in `dir` + /// direction. + /// + /// ``` + /// use valence_protocol::{BlockPos, Direction}; + /// + /// let pos = BlockPos::new(0, 0, 0); + /// let adj = pos.get_in_direction(Direction::South); + /// assert_eq!(adj, BlockPos::new(0, 0, 1)); + /// ``` + pub const fn get_in_direction(self, dir: Direction) -> Self { + match dir { + Direction::Down => BlockPos::new(self.x, self.y - 1, self.z), + Direction::Up => BlockPos::new(self.x, self.y + 1, self.z), + Direction::North => BlockPos::new(self.x, self.y, self.z - 1), + Direction::South => BlockPos::new(self.x, self.y, self.z + 1), + Direction::West => BlockPos::new(self.x - 1, self.y, self.z), + Direction::East => BlockPos::new(self.x + 1, self.y, self.z), + } + } + + pub const fn offset(self, x: i32, y: i32, z: i32) -> Self { + Self::new(self.x + x, self.y + y, self.z + z) + } + + pub const fn packed(self) -> Result { + match (self.x, self.y, self.z) { + (-0x2000000..=0x1ffffff, -0x800..=0x7ff, -0x2000000..=0x1ffffff) => { + Ok(PackedBlockPos::new() + .with_x(self.x) + .with_y(self.y) + .with_z(self.z)) + } + _ => Err(Error(self)), + } + } +} + +#[bitfield(u64)] +#[derive(PartialEq, Eq, PartialOrd, Ord, Encode, Decode, DecodeBytesAuto)] +pub struct PackedBlockPos { + #[bits(12)] + pub y: i32, + #[bits(26)] + pub z: i32, + #[bits(26)] + pub x: i32, +} + +impl Encode for BlockPos { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + match self.packed() { + Ok(p) => p.encode(w), + Err(e) => bail!("{e}: {self}"), + } + } +} + +impl Decode for BlockPos { + fn decode(r: &mut &[u8]) -> anyhow::Result { + PackedBlockPos::decode(r).map(Into::into) + } +} + +impl From for BlockPos { + fn from(p: PackedBlockPos) -> Self { + Self { + x: p.x(), + y: p.y(), + z: p.z(), + } + } +} + +impl TryFrom for PackedBlockPos { + type Error = Error; + + fn try_from(pos: BlockPos) -> Result { + pos.packed() + } +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Error, From)] +#[error("block position of {0} is out of range")] +pub struct Error(pub BlockPos); + +impl From for BlockPos { + fn from(pos: DVec3) -> Self { + Self { + x: pos.x.floor() as i32, + y: pos.y.floor() as i32, + z: pos.z.floor() as i32, + } + } +} + +impl From<(i32, i32, i32)> for BlockPos { + fn from((x, y, z): (i32, i32, i32)) -> Self { + BlockPos::new(x, y, z) + } +} + +impl From for (i32, i32, i32) { + fn from(pos: BlockPos) -> Self { + (pos.x, pos.y, pos.z) + } +} + +impl From<[i32; 3]> for BlockPos { + fn from([x, y, z]: [i32; 3]) -> Self { + BlockPos::new(x, y, z) + } +} + +impl From for [i32; 3] { + fn from(pos: BlockPos) -> Self { + [pos.x, pos.y, pos.z] + } +} + +impl Add for BlockPos { + type Output = Self; + + fn add(self, rhs: IVec3) -> Self::Output { + Self::new(self.x + rhs.x, self.y + rhs.y, self.z + rhs.z) + } +} + +impl Sub for BlockPos { + type Output = Self; + + fn sub(self, rhs: IVec3) -> Self::Output { + Self::new(self.x - rhs.x, self.y - rhs.y, self.z - rhs.z) + } +} + +impl Add for IVec3 { + type Output = BlockPos; + + fn add(self, rhs: BlockPos) -> Self::Output { + BlockPos::new(self.x + rhs.x, self.y + rhs.y, self.z + rhs.z) + } +} + +impl Sub for IVec3 { + type Output = BlockPos; + + fn sub(self, rhs: BlockPos) -> Self::Output { + BlockPos::new(self.x - rhs.x, self.y - rhs.y, self.z - rhs.z) + } +} + +impl fmt::Display for BlockPos { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + // Display the block position as a tuple. + fmt::Debug::fmt(&(self.x, self.y, self.z), f) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn block_position() { + let xzs = [ + (-33554432, true), + (-33554433, false), + (33554431, true), + (33554432, false), + (0, true), + (1, true), + (-1, true), + ]; + let ys = [ + (-2048, true), + (-2049, false), + (2047, true), + (2048, false), + (0, true), + (1, true), + (-1, true), + ]; + + for (x, x_valid) in xzs { + for (y, y_valid) in ys { + for (z, z_valid) in xzs { + let pos = BlockPos::new(x, y, z); + if x_valid && y_valid && z_valid { + let c = pos.packed().unwrap(); + assert_eq!((c.x(), c.y(), c.z()), (pos.x, pos.y, pos.z)); + } else { + assert_eq!(pos.packed(), Err(Error(pos))); + } + } + } + } + } +} diff --git a/vendor/valence/crates/valence_protocol/src/bounded.rs b/vendor/valence/crates/valence_protocol/src/bounded.rs new file mode 100644 index 00000000..7ef4020d --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/bounded.rs @@ -0,0 +1,42 @@ +use std::borrow::Borrow; +use std::fmt::Display; + +use derive_more::{AsRef, Deref, DerefMut, From}; + +/// A newtype wrapper for `T` which modifies the [`Encode`](crate::Encode) and +/// [`Decode`](crate::Decode) impls to be bounded by some upper limit `MAX`. +/// Implementations are expected to error eagerly if the limit is exceeded. +/// +/// What exactly `MAX` represents depends on the type `T`. Here are some +/// instances: +/// - **arrays/slices**: The maximum number of elements. +/// - **strings**: The maximum number of utf16 code units. +/// - **[`RawBytes`]**: The maximum number of bytes. +/// +/// [`RawBytes`]: crate::RawBytes +#[derive( + Copy, Clone, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Deref, DerefMut, AsRef, From, +)] +pub struct Bounded(pub T); + +impl Bounded { + pub fn map(self, f: impl FnOnce(T) -> U) -> Bounded { + Bounded(f(self.0)) + } + + pub fn map_into>(self) -> Bounded { + Bounded(self.0.into()) + } +} + +impl Borrow for Bounded { + fn borrow(&self) -> &T { + &self.0 + } +} + +impl Display for Bounded { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + self.0.fmt(f) + } +} diff --git a/vendor/valence/crates/valence_protocol/src/byte_angle.rs b/vendor/valence/crates/valence_protocol/src/byte_angle.rs new file mode 100644 index 00000000..5b0b96eb --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/byte_angle.rs @@ -0,0 +1,51 @@ +use std::f32::consts::TAU; +use std::fmt; +use std::io::Write; + +use crate::{Decode, DecodeBytesAuto, Encode}; + +/// Represents an angle in steps of 1/256 of a full turn. +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, DecodeBytesAuto)] +pub struct ByteAngle(pub u8); + +impl ByteAngle { + pub fn from_degrees(f: f32) -> ByteAngle { + ByteAngle((f.rem_euclid(360.0) / 360.0 * 256.0).round() as u8) + } + + pub fn from_radians(f: f32) -> ByteAngle { + ByteAngle((f.rem_euclid(TAU) / TAU * 256.0).round() as u8) + } + + pub fn to_degrees(self) -> f32 { + self.0 as f32 / 256.0 * 360.0 + } + + pub fn to_radians(self) -> f32 { + self.0 as f32 / 256.0 * TAU + } +} + +impl fmt::Debug for ByteAngle { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt::Display::fmt(self, f) + } +} + +impl fmt::Display for ByteAngle { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}°", self.to_degrees()) + } +} + +impl Encode for ByteAngle { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + self.0.encode(w) + } +} + +impl Decode for ByteAngle { + fn decode(r: &mut &[u8]) -> anyhow::Result { + u8::decode(r).map(ByteAngle) + } +} diff --git a/vendor/valence/crates/valence_protocol/src/chunk_pos.rs b/vendor/valence/crates/valence_protocol/src/chunk_pos.rs new file mode 100644 index 00000000..ade8fbec --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/chunk_pos.rs @@ -0,0 +1,111 @@ +use valence_math::DVec3; + +use crate::block_pos::BlockPos; +use crate::chunk_section_pos::ChunkSectionPos; +use crate::{BiomePos, Decode, DecodeBytesAuto, Encode}; + +/// The X and Z position of a chunk. +#[derive( + Clone, + Copy, + PartialEq, + Eq, + PartialOrd, + Ord, + Default, + Hash, + Debug, + Encode, + Decode, + DecodeBytesAuto, +)] +pub struct ChunkPos { + /// The X position of the chunk. + pub x: i32, + /// The Z position of the chunk. + pub z: i32, +} + +impl ChunkPos { + /// Constructs a new chunk position. + pub const fn new(x: i32, z: i32) -> Self { + Self { x, z } + } + + pub const fn distance_squared(self, other: Self) -> u64 { + let diff_x = other.x as i64 - self.x as i64; + let diff_z = other.z as i64 - self.z as i64; + + (diff_x * diff_x + diff_z * diff_z) as u64 + } +} + +impl From for ChunkPos { + fn from(pos: BlockPos) -> Self { + Self { + x: pos.x.div_euclid(16), + z: pos.z.div_euclid(16), + } + } +} + +impl From for ChunkPos { + fn from(pos: ChunkSectionPos) -> Self { + Self { x: pos.x, z: pos.z } + } +} + +impl From for ChunkPos { + fn from(pos: BiomePos) -> Self { + Self { + x: pos.x.div_euclid(4), + z: pos.z.div_euclid(4), + } + } +} + +impl From for ChunkPos { + fn from(pos: DVec3) -> Self { + Self { + x: (pos.x / 16.0).floor() as i32, + z: (pos.z / 16.0).floor() as i32, + } + } +} + +impl From<(i32, i32)> for ChunkPos { + fn from((x, z): (i32, i32)) -> Self { + Self { x, z } + } +} + +impl From for (i32, i32) { + fn from(pos: ChunkPos) -> Self { + (pos.x, pos.z) + } +} + +impl From<[i32; 2]> for ChunkPos { + fn from([x, z]: [i32; 2]) -> Self { + Self { x, z } + } +} + +impl From for [i32; 2] { + fn from(pos: ChunkPos) -> Self { + [pos.x, pos.z] + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn chunk_pos_round_trip_conv() { + let p = ChunkPos::new(rand::random(), rand::random()); + + assert_eq!(ChunkPos::from(<(i32, i32)>::from(p)), p); + assert_eq!(ChunkPos::from(<[i32; 2]>::from(p)), p); + } +} diff --git a/vendor/valence/crates/valence_protocol/src/chunk_section_pos.rs b/vendor/valence/crates/valence_protocol/src/chunk_section_pos.rs new file mode 100644 index 00000000..501f5244 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/chunk_section_pos.rs @@ -0,0 +1,104 @@ +use std::fmt; +use std::io::Write; + +use bitfield_struct::bitfield; +use derive_more::From; +use thiserror::Error; + +use crate::{BiomePos, BlockPos, Decode, DecodeBytesAuto, Encode}; + +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, DecodeBytesAuto)] +pub struct ChunkSectionPos { + pub x: i32, + pub y: i32, + pub z: i32, +} + +impl ChunkSectionPos { + pub const fn new(x: i32, y: i32, z: i32) -> Self { + Self { x, y, z } + } + + pub const fn packed(self) -> Result { + match (self.x, self.y, self.z) { + (-2097152..=2097151, -524288..=524287, -2097152..=2097151) => { + Ok(PackedChunkSectionPos::new() + .with_x(self.x) + .with_y(self.y) + .with_z(self.z)) + } + _ => Err(Error(self)), + } + } +} + +impl fmt::Display for ChunkSectionPos { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + fmt::Debug::fmt(&(self.x, self.y, self.z), f) + } +} + +impl Encode for ChunkSectionPos { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + self.packed()?.encode(w) + } +} + +impl Decode for ChunkSectionPos { + fn decode(r: &mut &[u8]) -> anyhow::Result { + PackedChunkSectionPos::decode(r).map(Into::into) + } +} + +impl From for ChunkSectionPos { + fn from(pos: BlockPos) -> Self { + Self { + x: pos.x.div_euclid(16), + y: pos.y.div_euclid(16), + z: pos.z.div_euclid(16), + } + } +} + +impl From for ChunkSectionPos { + fn from(pos: BiomePos) -> Self { + Self { + x: pos.x.div_euclid(4), + y: pos.y.div_euclid(4), + z: pos.z.div_euclid(4), + } + } +} + +#[bitfield(u64)] +#[derive(PartialEq, Eq, Ord, PartialOrd, Encode, Decode, DecodeBytesAuto)] +pub struct PackedChunkSectionPos { + #[bits(20)] + pub y: i32, + #[bits(22)] + pub z: i32, + #[bits(22)] + pub x: i32, +} + +impl From for ChunkSectionPos { + fn from(pos: PackedChunkSectionPos) -> Self { + Self { + x: pos.x(), + y: pos.y(), + z: pos.z(), + } + } +} + +impl TryFrom for PackedChunkSectionPos { + type Error = Error; + + fn try_from(pos: ChunkSectionPos) -> Result { + pos.packed() + } +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Error, From)] +#[error("chunk section position of {0} is out of range")] +pub struct Error(pub ChunkSectionPos); diff --git a/vendor/valence/crates/valence_protocol/src/decode.rs b/vendor/valence/crates/valence_protocol/src/decode.rs new file mode 100644 index 00000000..74f3eb3d --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/decode.rs @@ -0,0 +1,242 @@ +#[cfg(feature = "encryption")] +use aes::cipher::{generic_array::GenericArray, BlockDecryptMut, BlockSizeUser, KeyIvInit}; +use anyhow::{bail, ensure, Context}; +use bytes::{Buf, BytesMut}; + +use crate::var_int::{VarInt, VarIntDecodeError}; +#[cfg(feature = "compression")] +use crate::CompressionThreshold; +use crate::{Decode, Packet, MAX_PACKET_SIZE}; + +/// The AES block cipher with a 128 bit key, using the CFB-8 mode of +/// operation. +#[cfg(feature = "encryption")] +type Cipher = cfb8::Decryptor; + +#[derive(Default)] +pub struct PacketDecoder { + buf: BytesMut, + #[cfg(feature = "compression")] + decompress_buf: BytesMut, + #[cfg(feature = "compression")] + threshold: CompressionThreshold, + #[cfg(feature = "encryption")] + cipher: Option, +} + +impl PacketDecoder { + pub fn new() -> Self { + Self::default() + } + + pub fn try_next_packet(&mut self) -> anyhow::Result> { + let mut r = &self.buf[..]; + + let packet_len = match VarInt::decode_partial(&mut r) { + Ok(len) => len, + Err(VarIntDecodeError::Incomplete) => return Ok(None), + Err(VarIntDecodeError::TooLarge) => bail!("malformed packet length VarInt"), + }; + + ensure!( + (0..=MAX_PACKET_SIZE).contains(&packet_len), + "packet length of {packet_len} is out of bounds" + ); + + if r.len() < packet_len as usize { + // Not enough data arrived yet. + return Ok(None); + } + + let packet_len_len = VarInt(packet_len).written_size(); + + let mut data; + + #[cfg(feature = "compression")] + if self.threshold.0 >= 0 { + use std::io::Write; + + use bytes::BufMut; + use flate2::write::ZlibDecoder; + + r = &r[..packet_len as usize]; + + let data_len = VarInt::decode(&mut r)?.0; + + ensure!( + (0..MAX_PACKET_SIZE).contains(&data_len), + "decompressed packet length of {data_len} is out of bounds" + ); + + // Is this packet compressed? + if data_len > 0 { + ensure!( + data_len > self.threshold.0, + "decompressed packet length of {data_len} is <= the compression threshold of \ + {}", + self.threshold.0 + ); + + debug_assert!(self.decompress_buf.is_empty()); + + self.decompress_buf.put_bytes(0, data_len as usize); + + // TODO: use libdeflater or zune-inflate? + let mut z = ZlibDecoder::new(&mut self.decompress_buf[..]); + + z.write_all(r)?; + + ensure!( + z.finish()?.is_empty(), + "decompressed packet length is shorter than expected" + ); + + let total_packet_len = VarInt(packet_len).written_size() + packet_len as usize; + + self.buf.advance(total_packet_len); + + data = self.decompress_buf.split(); + } else { + debug_assert_eq!(data_len, 0); + + ensure!( + r.len() <= self.threshold.0 as usize, + "uncompressed packet length of {} exceeds compression threshold of {}", + r.len(), + self.threshold.0 + ); + + let remaining_len = r.len(); + + self.buf.advance(packet_len_len + 1); + + data = self.buf.split_to(remaining_len); + } + } else { + self.buf.advance(packet_len_len); + data = self.buf.split_to(packet_len as usize); + } + + #[cfg(not(feature = "compression"))] + { + self.buf.advance(packet_len_len); + data = self.buf.split_to(packet_len as usize); + } + + // Decode the leading packet ID. + r = &data[..]; + let packet_id = VarInt::decode(&mut r) + .context("failed to decode packet ID")? + .0; + + data.advance(data.len() - r.len()); + + Ok(Some(PacketFrame { + id: packet_id, + body: data, + })) + } + + #[cfg(feature = "compression")] + pub fn compression(&self) -> CompressionThreshold { + self.threshold + } + + #[cfg(feature = "compression")] + pub fn set_compression(&mut self, threshold: CompressionThreshold) { + self.threshold = threshold; + } + + #[cfg(feature = "encryption")] + pub fn enable_encryption(&mut self, key: &[u8; 16]) { + assert!(self.cipher.is_none(), "encryption is already enabled"); + + let mut cipher = Cipher::new_from_slices(key, key).expect("invalid key"); + + // Don't forget to decrypt the data we already have. + Self::decrypt_bytes(&mut cipher, &mut self.buf); + + self.cipher = Some(cipher); + } + + /// Decrypts the provided byte slice in place using the cipher, without + /// consuming the cipher. + #[cfg(feature = "encryption")] + fn decrypt_bytes(cipher: &mut Cipher, bytes: &mut [u8]) { + for chunk in bytes.chunks_mut(Cipher::block_size()) { + let gen_arr = GenericArray::from_mut_slice(chunk); + cipher.decrypt_block_mut(gen_arr); + } + } + + pub fn queue_bytes(&mut self, mut bytes: BytesMut) { + #![allow(unused_mut)] + + #[cfg(feature = "encryption")] + if let Some(cipher) = &mut self.cipher { + Self::decrypt_bytes(cipher, &mut bytes); + } + + self.buf.unsplit(bytes); + } + + pub fn queue_slice(&mut self, bytes: &[u8]) { + #[cfg(feature = "encryption")] + let len = self.buf.len(); + + self.buf.extend_from_slice(bytes); + + #[cfg(feature = "encryption")] + if let Some(cipher) = &mut self.cipher { + let slice = &mut self.buf[len..]; + Self::decrypt_bytes(cipher, slice); + } + } + + pub fn take_capacity(&mut self) -> BytesMut { + self.buf.split_off(self.buf.len()) + } + + pub fn reserve(&mut self, additional: usize) { + self.buf.reserve(additional); + } +} + +#[derive(Clone, Debug)] +pub struct PacketFrame { + /// The ID of the decoded packet. + pub id: i32, + /// The contents of the packet after the leading VarInt ID. + pub body: BytesMut, +} + +impl PacketFrame { + /// Attempts to decode this packet as type `P`. An error is returned if the + /// packet ID does not match, the body of the packet failed to decode, or + /// some input was missed. + pub fn decode

(&self) -> anyhow::Result

+ where + P: Packet + Decode + { + ensure!( + P::ID == self.id, + "packet ID mismatch while decoding '{}': expected {}, got {}", + P::NAME, + P::ID, + self.id + ); + + let mut r = &self.body[..]; + + let pkt = P::decode(&mut r)?; + + ensure!( + r.is_empty(), + "missed {} bytes while decoding '{}'", + r.len(), + P::NAME + ); + + Ok(pkt) + } +} diff --git a/vendor/valence/crates/valence_protocol/src/difficulty.rs b/vendor/valence/crates/valence_protocol/src/difficulty.rs new file mode 100644 index 00000000..f67ce296 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/difficulty.rs @@ -0,0 +1,9 @@ +use crate::{Decode, DecodeBytesAuto, Encode}; + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto)] +pub enum Difficulty { + Peaceful, + Easy, + Normal, + Hard, +} diff --git a/vendor/valence/crates/valence_protocol/src/direction.rs b/vendor/valence/crates/valence_protocol/src/direction.rs new file mode 100644 index 00000000..c9e8774d --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/direction.rs @@ -0,0 +1,19 @@ +use bevy_ecs::prelude::*; + +use crate::{Decode, DecodeBytesAuto, Encode}; + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto, Component)] +pub enum Direction { + /// -Y + Down, + /// +Y + Up, + /// -Z + North, + /// +Z + South, + /// -X + West, + /// +X + East, +} diff --git a/vendor/valence/crates/valence_protocol/src/encode.rs b/vendor/valence/crates/valence_protocol/src/encode.rs new file mode 100644 index 00000000..1e172d20 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/encode.rs @@ -0,0 +1,390 @@ +use std::io::Write; + +#[cfg(feature = "encryption")] +use aes::cipher::generic_array::GenericArray; +#[cfg(feature = "encryption")] +use aes::cipher::{BlockEncryptMut, BlockSizeUser, KeyIvInit}; +use anyhow::ensure; +use bytes::{BufMut, BytesMut}; +use tracing::warn; + +use crate::var_int::VarInt; +use crate::{CompressionThreshold, Encode, Packet, MAX_PACKET_SIZE}; + +/// The AES block cipher with a 128 bit key, using the CFB-8 mode of +/// operation. +#[cfg(feature = "encryption")] +type Cipher = cfb8::Encryptor; + +#[derive(Default)] +pub struct PacketEncoder { + buf: BytesMut, + #[cfg(feature = "compression")] + compress_buf: Vec, + #[cfg(feature = "compression")] + threshold: CompressionThreshold, + #[cfg(feature = "encryption")] + cipher: Option, +} + +impl PacketEncoder { + pub fn new() -> Self { + Self::default() + } + + #[inline] + pub fn append_bytes(&mut self, bytes: &[u8]) { + self.buf.extend_from_slice(bytes) + } + + pub fn prepend_packet

(&mut self, pkt: &P) -> anyhow::Result<()> + where + P: Packet + Encode, + { + let start_len = self.buf.len(); + self.append_packet(pkt)?; + + let end_len = self.buf.len(); + let total_packet_len = end_len - start_len; + + // 1) Move everything back by the length of the packet. + // 2) Move the packet to the new space at the front. + // 3) Truncate the old packet away. + self.buf.put_bytes(0, total_packet_len); + self.buf.copy_within(..end_len, total_packet_len); + self.buf.copy_within(total_packet_len + start_len.., 0); + self.buf.truncate(end_len); + + Ok(()) + } + + pub fn append_packet

(&mut self, pkt: &P) -> anyhow::Result<()> + where + P: Packet + Encode, + { + let start_len = self.buf.len(); + + pkt.encode_with_id((&mut self.buf).writer())?; + + let data_len = self.buf.len() - start_len; + + #[cfg(feature = "compression")] + if self.threshold.0 >= 0 { + use std::io::Read; + + use flate2::bufread::ZlibEncoder; + use flate2::Compression; + + if data_len > self.threshold.0 as usize { + let mut z = ZlibEncoder::new(&self.buf[start_len..], Compression::new(4)); + + self.compress_buf.clear(); + + let data_len_size = VarInt(data_len as i32).written_size(); + + let packet_len = data_len_size + z.read_to_end(&mut self.compress_buf)?; + + ensure!( + packet_len <= MAX_PACKET_SIZE as usize, + "packet exceeds maximum length" + ); + + drop(z); + + self.buf.truncate(start_len); + + let mut writer = (&mut self.buf).writer(); + + VarInt(packet_len as i32).encode(&mut writer)?; + VarInt(data_len as i32).encode(&mut writer)?; + self.buf.extend_from_slice(&self.compress_buf); + } else { + let data_len_size = 1; + let packet_len = data_len_size + data_len; + + ensure!( + packet_len <= MAX_PACKET_SIZE as usize, + "packet exceeds maximum length" + ); + + let packet_len_size = VarInt(packet_len as i32).written_size(); + + let data_prefix_len = packet_len_size + data_len_size; + + self.buf.put_bytes(0, data_prefix_len); + self.buf + .copy_within(start_len..start_len + data_len, start_len + data_prefix_len); + + let mut front = &mut self.buf[start_len..]; + + VarInt(packet_len as i32).encode(&mut front)?; + // Zero for no compression on this packet. + VarInt(0).encode(front)?; + } + + return Ok(()); + } + + let packet_len = data_len; + + ensure!( + packet_len <= MAX_PACKET_SIZE as usize, + "packet exceeds maximum length" + ); + + let packet_len_size = VarInt(packet_len as i32).written_size(); + + self.buf.put_bytes(0, packet_len_size); + self.buf + .copy_within(start_len..start_len + data_len, start_len + packet_len_size); + + let front = &mut self.buf[start_len..]; + VarInt(packet_len as i32).encode(front)?; + + Ok(()) + } + + /// Takes all the packets written so far and encrypts them if encryption is + /// enabled. + pub fn take(&mut self) -> BytesMut { + #[cfg(feature = "encryption")] + if let Some(cipher) = &mut self.cipher { + for chunk in self.buf.chunks_mut(Cipher::block_size()) { + let gen_arr = GenericArray::from_mut_slice(chunk); + cipher.encrypt_block_mut(gen_arr); + } + } + + self.buf.split() + } + + pub fn clear(&mut self) { + self.buf.clear(); + } + + #[cfg(feature = "compression")] + pub fn set_compression(&mut self, threshold: CompressionThreshold) { + self.threshold = threshold; + } + + /// Initializes the cipher with the given key. All future packets **and any + /// that have not been [taken] yet** are encrypted. + /// + /// [taken]: Self::take + /// + /// # Panics + /// + /// Panics if encryption is already enabled. + #[cfg(feature = "encryption")] + pub fn enable_encryption(&mut self, key: &[u8; 16]) { + assert!(self.cipher.is_none(), "encryption is already enabled"); + self.cipher = Some(Cipher::new_from_slices(key, key).expect("invalid key")); + } +} + +/// Types that can have packets written to them. +pub trait WritePacket { + /// Writes a packet to this object. Encoding errors are typically logged and + /// discarded. + fn write_packet

(&mut self, packet: &P) + where + P: Packet + Encode, + { + if let Err(e) = self.write_packet_fallible(packet) { + warn!("failed to write packet '{}': {e:#}", P::NAME); + } + } + + /// Writes a packet to this object. The result of encoding the packet is + /// returned. + fn write_packet_fallible

(&mut self, packet: &P) -> anyhow::Result<()> + where + P: Packet + Encode; + + /// Copies raw packet data directly into this object. Don't use this unless + /// you know what you're doing. + fn write_packet_bytes(&mut self, bytes: &[u8]); +} + +impl WritePacket for &mut W { + fn write_packet_fallible

(&mut self, packet: &P) -> anyhow::Result<()> + where + P: Packet + Encode, + { + (*self).write_packet_fallible(packet) + } + + fn write_packet_bytes(&mut self, bytes: &[u8]) { + (*self).write_packet_bytes(bytes) + } +} + +impl WritePacket for bevy_ecs::world::Mut<'_, T> { + fn write_packet_fallible

(&mut self, packet: &P) -> anyhow::Result<()> + where + P: Packet + Encode, + { + self.as_mut().write_packet_fallible(packet) + } + + fn write_packet_bytes(&mut self, bytes: &[u8]) { + self.as_mut().write_packet_bytes(bytes) + } +} + +/// An implementor of [`WritePacket`] backed by a `Vec` mutable reference. +/// +/// Packets are written by appending to the contained vec. If an error occurs +/// while writing, the written bytes are truncated away. +#[derive(Debug)] +pub struct PacketWriter<'a> { + pub buf: &'a mut Vec, + pub threshold: CompressionThreshold, +} + +impl<'a> PacketWriter<'a> { + pub fn new(buf: &'a mut Vec, threshold: CompressionThreshold) -> Self { + Self { buf, threshold } + } +} + +impl WritePacket for PacketWriter<'_> { + #[cfg_attr(not(feature = "compression"), track_caller)] + fn write_packet_fallible

(&mut self, pkt: &P) -> anyhow::Result<()> + where + P: Packet + Encode, + { + let start = self.buf.len(); + + let res; + + if self.threshold.0 >= 0 { + #[cfg(feature = "compression")] + { + res = encode_packet_compressed(self.buf, pkt, self.threshold.0 as u32); + } + + #[cfg(not(feature = "compression"))] + { + panic!("\"compression\" feature must be enabled to write compressed packets"); + } + } else { + res = encode_packet(self.buf, pkt) + }; + + if res.is_err() { + self.buf.truncate(start); + } + + res + } + + fn write_packet_bytes(&mut self, bytes: &[u8]) { + if let Err(e) = self.buf.write_all(bytes) { + warn!("failed to write packet bytes: {e:#}"); + } + } +} + +impl WritePacket for PacketEncoder { + fn write_packet_fallible

(&mut self, packet: &P) -> anyhow::Result<()> + where + P: Packet + Encode, + { + self.append_packet(packet) + } + + fn write_packet_bytes(&mut self, bytes: &[u8]) { + self.append_bytes(bytes) + } +} + +fn encode_packet

(buf: &mut Vec, pkt: &P) -> anyhow::Result<()> +where + P: Packet + Encode, +{ + let start_len = buf.len(); + + pkt.encode_with_id(&mut *buf)?; + + let packet_len = buf.len() - start_len; + + ensure!( + packet_len <= MAX_PACKET_SIZE as usize, + "packet exceeds maximum length" + ); + + let packet_len_size = VarInt(packet_len as i32).written_size(); + + buf.put_bytes(0, packet_len_size); + buf.copy_within( + start_len..start_len + packet_len, + start_len + packet_len_size, + ); + + let front = &mut buf[start_len..]; + VarInt(packet_len as i32).encode(front)?; + + Ok(()) +} + +#[cfg(feature = "compression")] +fn encode_packet_compressed

(buf: &mut Vec, pkt: &P, threshold: u32) -> anyhow::Result<()> +where + P: Packet + Encode, +{ + use std::io::Read; + + use flate2::bufread::ZlibEncoder; + use flate2::Compression; + + let start_len = buf.len(); + + pkt.encode_with_id(&mut *buf)?; + + let data_len = buf.len() - start_len; + + if data_len > threshold as usize { + let mut z = ZlibEncoder::new(&buf[start_len..], Compression::new(4)); + + let mut scratch = vec![]; + + let packet_len = VarInt(data_len as i32).written_size() + z.read_to_end(&mut scratch)?; + + ensure!( + packet_len <= MAX_PACKET_SIZE as usize, + "packet exceeds maximum length" + ); + + drop(z); + + buf.truncate(start_len); + + VarInt(packet_len as i32).encode(&mut *buf)?; + VarInt(data_len as i32).encode(&mut *buf)?; + buf.extend_from_slice(&scratch); + } else { + let data_len_size = 1; + let packet_len = data_len_size + data_len; + + ensure!( + packet_len <= MAX_PACKET_SIZE as usize, + "packet exceeds maximum length" + ); + + let packet_len_size = VarInt(packet_len as i32).written_size(); + + let data_prefix_len = packet_len_size + data_len_size; + + buf.put_bytes(0, data_prefix_len); + buf.copy_within(start_len..start_len + data_len, start_len + data_prefix_len); + + let mut front = &mut buf[start_len..]; + + VarInt(packet_len as i32).encode(&mut front)?; + // Zero for no compression on this packet. + VarInt(0).encode(front)?; + } + + Ok(()) +} diff --git a/vendor/valence/crates/valence_protocol/src/game_mode.rs b/vendor/valence/crates/valence_protocol/src/game_mode.rs new file mode 100644 index 00000000..a6034f90 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/game_mode.rs @@ -0,0 +1,45 @@ +use std::io::Write; + +use anyhow::bail; +use bevy_ecs::prelude::*; +use derive_more::{From, Into}; + +use crate::{Decode, DecodeBytesAuto, Encode}; + +#[derive( + Copy, Clone, PartialEq, Eq, Debug, Default, Encode, Decode, DecodeBytesAuto, Component, +)] +pub enum GameMode { + #[default] + Survival, + Creative, + Adventure, + Spectator, +} + +/// An optional [`GameMode`] with `None` encoded as `-1`. Isomorphic to +/// `Option`. +#[derive(Copy, Clone, PartialEq, Eq, Default, Debug, From, Into, DecodeBytesAuto)] +pub struct OptGameMode(pub Option); + +impl Encode for OptGameMode { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + match self.0 { + Some(gm) => (gm as i8).encode(w), + None => (-1i8).encode(w), + } + } +} + +impl Decode for OptGameMode { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(Self(match i8::decode(r)? { + -1 => None, + 0 => Some(GameMode::Survival), + 1 => Some(GameMode::Creative), + 2 => Some(GameMode::Adventure), + 3 => Some(GameMode::Spectator), + other => bail!("invalid game mode byte of {other}"), + })) + } +} diff --git a/vendor/valence/crates/valence_protocol/src/global_pos.rs b/vendor/valence/crates/valence_protocol/src/global_pos.rs new file mode 100644 index 00000000..268423d5 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/global_pos.rs @@ -0,0 +1,10 @@ +use valence_ident::Ident; + +use crate::block_pos::BlockPos; +use crate::{DecodeBytes, Encode}; + +#[derive(Clone, PartialEq, Eq, Debug, Encode, DecodeBytes)] +pub struct GlobalPos { + pub dimension_name: Ident, + pub position: BlockPos, +} diff --git a/vendor/valence/crates/valence_protocol/src/hand.rs b/vendor/valence/crates/valence_protocol/src/hand.rs new file mode 100644 index 00000000..475ad3e3 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/hand.rs @@ -0,0 +1,8 @@ +use crate::{Decode, DecodeBytesAuto, Encode}; + +#[derive(Copy, Clone, PartialEq, Eq, Default, Debug, Encode, Decode, DecodeBytesAuto)] +pub enum Hand { + #[default] + Main, + Off, +} diff --git a/vendor/valence/crates/valence_protocol/src/impls.rs b/vendor/valence/crates/valence_protocol/src/impls.rs new file mode 100644 index 00000000..0b1b4f9e --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/impls.rs @@ -0,0 +1,25 @@ +//! Implementations of [`Encode`](crate::Encode) and [`Decode`](crate::Decode) +//! on foreign types. + +mod map; +mod math; +mod other; +mod pointer; +mod primitive; +mod sequence; +mod string; +mod tuple; + +use std::mem; + +/// Prevents preallocating too much memory in case we get a malicious or invalid +/// sequence length. +fn cautious_capacity(size_hint: usize) -> usize { + const MAX_PREALLOC_BYTES: usize = 1024 * 1024; + + if mem::size_of::() == 0 { + 0 + } else { + size_hint.min(MAX_PREALLOC_BYTES / mem::size_of::()) + } +} diff --git a/vendor/valence/crates/valence_protocol/src/impls/map.rs b/vendor/valence/crates/valence_protocol/src/impls/map.rs new file mode 100644 index 00000000..a0070279 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/impls/map.rs @@ -0,0 +1,299 @@ +use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; +use std::hash::{BuildHasher, Hash}; +use std::io::Write; + +use anyhow::ensure; +use bytes::Bytes; + +use crate::impls::cautious_capacity; +use crate::{Decode, DecodeBytes, Encode, VarInt}; + +impl Encode for BTreeSet +where + T: Encode, +{ + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + let len = self.len(); + + ensure!( + len <= i32::MAX as usize, + "length of B-tree set ({len}) exceeds i32::MAX" + ); + + VarInt(len as i32).encode(&mut w)?; + + for val in self { + val.encode(&mut w)?; + } + + Ok(()) + } +} + +impl Decode for BTreeSet +where + T: Ord + Decode, +{ + fn decode(r: &mut &[u8]) -> anyhow::Result { + let len = VarInt::decode(r)?.0; + ensure!( + len >= 0, + "attempt to decode B-tree set with negative length" + ); + let len = len as usize; + + let mut set = BTreeSet::new(); + + for _ in 0..len { + ensure!( + set.insert(T::decode(r)?), + "encountered duplicate item while decoding B-tree set" + ); + } + + Ok(set) + } +} + +impl DecodeBytes for BTreeSet +where + T: Ord + DecodeBytes, +{ + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + let len = VarInt::decode_bytes(r)?.0; + ensure!( + len >= 0, + "attempt to decode B-tree set with negative length" + ); + let len = len as usize; + + let mut set = BTreeSet::new(); + + for _ in 0..len { + ensure!( + set.insert(T::decode_bytes(r)?), + "encountered duplicate item while decoding B-tree set" + ); + } + + Ok(set) + } +} + +impl Encode for HashSet +where + T: Encode, +{ + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + let len = self.len(); + + ensure!( + len <= i32::MAX as usize, + "length of hash set ({len}) exceeds i32::MAX" + ); + + VarInt(len as i32).encode(&mut w)?; + + for val in self { + val.encode(&mut w)?; + } + + Ok(()) + } +} + +impl Decode for HashSet +where + T: Eq + Hash + Decode, + S: BuildHasher + Default, +{ + fn decode(r: &mut &[u8]) -> anyhow::Result { + let len = VarInt::decode(r)?.0; + ensure!(len >= 0, "attempt to decode hash set with negative length"); + let len = len as usize; + + let mut set = HashSet::with_capacity_and_hasher(cautious_capacity::(len), S::default()); + + for _ in 0..len { + ensure!( + set.insert(T::decode(r)?), + "encountered duplicate item while decoding hash set" + ); + } + + Ok(set) + } +} + +impl DecodeBytes for HashSet +where + T: Eq + Hash + DecodeBytes, + S: BuildHasher + Default, +{ + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + let len = VarInt::decode_bytes(r)?.0; + ensure!(len >= 0, "attempt to decode hash set with negative length"); + let len = len as usize; + + let mut set = HashSet::with_capacity_and_hasher(cautious_capacity::(len), S::default()); + + for _ in 0..len { + ensure!( + set.insert(T::decode_bytes(r)?), + "encountered duplicate item while decoding hash set" + ); + } + + Ok(set) + } +} + +impl Encode for BTreeMap +where + K: Encode, + V: Encode, +{ + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + let len = self.len(); + + ensure!( + len <= i32::MAX as usize, + "length of B-tree map ({len}) exceeds i32::MAX" + ); + + VarInt(len as i32).encode(&mut w)?; + + for pair in self.iter() { + pair.encode(&mut w)?; + } + + Ok(()) + } +} + +impl Decode for BTreeMap +where + K: Ord + Decode, + V: Decode, +{ + fn decode(r: &mut &[u8]) -> anyhow::Result { + let len = VarInt::decode(r)?.0; + ensure!( + len >= 0, + "attempt to decode B-tree map with negative length" + ); + let len = len as usize; + + let mut map = BTreeMap::new(); + + for _ in 0..len { + ensure!( + map.insert(K::decode(r)?, V::decode(r)?).is_none(), + "encountered duplicate key while decoding B-tree map" + ); + } + + Ok(map) + } +} + +impl DecodeBytes for BTreeMap +where + K: Ord + DecodeBytes, + V: DecodeBytes, +{ + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + let len = VarInt::decode_bytes(r)?.0; + ensure!( + len >= 0, + "attempt to decode B-tree map with negative length" + ); + let len = len as usize; + + let mut map = BTreeMap::new(); + + for _ in 0..len { + ensure!( + map.insert(K::decode_bytes(r)?, V::decode_bytes(r)?) + .is_none(), + "encountered duplicate key while decoding B-tree map" + ); + } + + Ok(map) + } +} + +impl Encode for HashMap +where + K: Encode, + V: Encode, +{ + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + let len = self.len(); + + ensure!( + len <= i32::MAX as usize, + "length of hash map ({len}) exceeds i32::MAX" + ); + + VarInt(len as i32).encode(&mut w)?; + + for pair in self.iter() { + pair.encode(&mut w)?; + } + + Ok(()) + } +} + +impl Decode for HashMap +where + K: Eq + Hash + Decode, + V: Decode, + S: BuildHasher + Default, +{ + fn decode(r: &mut &[u8]) -> anyhow::Result { + let len = VarInt::decode(r)?.0; + ensure!(len >= 0, "attempt to decode hash map with negative length"); + let len = len as usize; + + let mut map = + HashMap::with_capacity_and_hasher(cautious_capacity::<(K, V)>(len), S::default()); + + for _ in 0..len { + ensure!( + map.insert(K::decode(r)?, V::decode(r)?).is_none(), + "encountered duplicate item while decoding hash map" + ); + } + + Ok(map) + } +} + +impl DecodeBytes for HashMap +where + K: Eq + Hash + DecodeBytes, + V: DecodeBytes, + S: BuildHasher + Default, +{ + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + let len = VarInt::decode_bytes(r)?.0; + ensure!(len >= 0, "attempt to decode hash map with negative length"); + let len = len as usize; + + let mut map = + HashMap::with_capacity_and_hasher(cautious_capacity::<(K, V)>(len), S::default()); + + for _ in 0..len { + ensure!( + map.insert(K::decode_bytes(r)?, V::decode_bytes(r)?) + .is_none(), + "encountered duplicate item while decoding hash map" + ); + } + + Ok(map) + } +} diff --git a/vendor/valence/crates/valence_protocol/src/impls/math.rs b/vendor/valence/crates/valence_protocol/src/impls/math.rs new file mode 100644 index 00000000..4c89374f --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/impls/math.rs @@ -0,0 +1,183 @@ +use std::io::Write; + +use valence_math::*; + +use crate::{impl_decode_bytes_auto, Decode, Encode}; + +impl Encode for Vec2 { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + self.x.encode(&mut w)?; + self.y.encode(w) + } +} + +impl Decode for Vec2 { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(Self { + x: f32::decode(r)?, + y: f32::decode(r)?, + }) + } +} + +impl_decode_bytes_auto!(Vec2); + +impl Encode for Vec3 { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + self.x.encode(&mut w)?; + self.y.encode(&mut w)?; + self.z.encode(w) + } +} + +impl Decode for Vec3 { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(Self { + x: f32::decode(r)?, + y: f32::decode(r)?, + z: f32::decode(r)?, + }) + } +} + +impl_decode_bytes_auto!(Vec3); + +impl Encode for Vec3A { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + self.x.encode(&mut w)?; + self.y.encode(&mut w)?; + self.z.encode(w) + } +} + +impl Decode for Vec3A { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(Self::new(f32::decode(r)?, f32::decode(r)?, f32::decode(r)?)) + } +} + +impl_decode_bytes_auto!(Vec3A); + +impl Encode for IVec3 { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + self.x.encode(&mut w)?; + self.y.encode(&mut w)?; + self.z.encode(w) + } +} + +impl Decode for IVec3 { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(Self { + x: i32::decode(r)?, + y: i32::decode(r)?, + z: i32::decode(r)?, + }) + } +} + +impl_decode_bytes_auto!(IVec3); + +impl Encode for Vec4 { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + self.x.encode(&mut w)?; + self.y.encode(&mut w)?; + self.z.encode(&mut w)?; + self.w.encode(&mut w) + } +} + +impl Decode for Vec4 { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(Self::new( + f32::decode(r)?, + f32::decode(r)?, + f32::decode(r)?, + f32::decode(r)?, + )) + } +} + +impl_decode_bytes_auto!(Vec4); + +impl Encode for Quat { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + self.x.encode(&mut w)?; + self.y.encode(&mut w)?; + self.z.encode(&mut w)?; + self.w.encode(w) + } +} + +impl Decode for Quat { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(Self::from_xyzw( + f32::decode(r)?, + f32::decode(r)?, + f32::decode(r)?, + f32::decode(r)?, + )) + } +} + +impl_decode_bytes_auto!(Quat); + +impl Encode for DVec2 { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + self.x.encode(&mut w)?; + self.y.encode(w) + } +} + +impl Decode for DVec2 { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(Self { + x: f64::decode(r)?, + y: f64::decode(r)?, + }) + } +} + +impl_decode_bytes_auto!(DVec2); + +impl Encode for DVec3 { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + self.x.encode(&mut w)?; + self.y.encode(&mut w)?; + self.z.encode(w) + } +} + +impl Decode for DVec3 { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(Self { + x: f64::decode(r)?, + y: f64::decode(r)?, + z: f64::decode(r)?, + }) + } +} + +impl_decode_bytes_auto!(DVec3); + +impl Encode for DQuat { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + self.x.encode(&mut w)?; + self.y.encode(&mut w)?; + self.z.encode(&mut w)?; + self.w.encode(w) + } +} + +impl Decode for DQuat { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(Self::from_xyzw( + f64::decode(r)?, + f64::decode(r)?, + f64::decode(r)?, + f64::decode(r)?, + )) + } +} + +impl_decode_bytes_auto!(DQuat); diff --git a/vendor/valence/crates/valence_protocol/src/impls/other.rs b/vendor/valence/crates/valence_protocol/src/impls/other.rs new file mode 100644 index 00000000..c71cde0e --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/impls/other.rs @@ -0,0 +1,156 @@ +use std::io::Write; + +use anyhow::Context; +use bytes::Bytes; +use uuid::Uuid; +use valence_bytes::Utf8Bytes; +use valence_generated::block::{BlockEntityKind, BlockKind, BlockState}; +use valence_generated::item::ItemKind; +use valence_ident::Ident; +use valence_nbt::Compound; + +use crate::{impl_decode_bytes_auto, Decode, DecodeBytes, Encode, VarInt}; + +impl Encode for Option { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + match self { + Some(t) => { + true.encode(&mut w)?; + t.encode(w) + } + None => false.encode(w), + } + } +} + +impl Decode for Option { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(match bool::decode(r)? { + true => Some(T::decode(r)?), + false => None, + }) + } +} + +impl DecodeBytes for Option { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + Ok(match bool::decode_bytes(r)? { + true => Some(T::decode_bytes(r)?), + false => None, + }) + } +} + +impl Encode for Uuid { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + self.as_u128().encode(w) + } +} + +impl Decode for Uuid { + fn decode(r: &mut &[u8]) -> anyhow::Result { + u128::decode(r).map(Uuid::from_u128) + } +} + +impl_decode_bytes_auto!(Uuid); + +impl Encode for Compound { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + Ok(valence_nbt::to_binary(self, w, "")?) + } +} + +impl Decode for Compound { + fn decode(r: &mut &[u8]) -> anyhow::Result { + // Check for null compound. + if r.first() == Some(&0) { + *r = &r[1..]; + return Ok(Compound::new()); + } + + // TODO: consider if we need to bound the input slice or add some other + // mitigation to prevent excessive memory usage on hostile input. + Ok(valence_nbt::from_binary(r)?.0) + } +} + +impl_decode_bytes_auto!(Compound); + +impl Encode for Ident { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + self.as_ref().encode(w) + } +} + +impl DecodeBytes for Ident { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + Ok(Ident::try_from(Utf8Bytes::decode_bytes(r)?)?) + } +} + +impl Encode for BlockState { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + VarInt(self.to_raw() as i32).encode(w) + } +} + +impl Decode for BlockState { + fn decode(r: &mut &[u8]) -> anyhow::Result { + let id = VarInt::decode(r)?.0; + let errmsg = "invalid block state ID"; + + BlockState::from_raw(id.try_into().context(errmsg)?).context(errmsg) + } +} + +impl_decode_bytes_auto!(BlockState); + +impl Encode for BlockKind { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + VarInt(self.to_raw() as i32).encode(w) + } +} + +impl Decode for BlockKind { + fn decode(r: &mut &[u8]) -> anyhow::Result { + let id = VarInt::decode(r)?.0; + let errmsg = "invalid block kind ID"; + + BlockKind::from_raw(id.try_into().context(errmsg)?).context(errmsg) + } +} + +impl_decode_bytes_auto!(BlockKind); + +impl Encode for BlockEntityKind { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + VarInt(self.id() as i32).encode(w) + } +} + +impl Decode for BlockEntityKind { + fn decode(r: &mut &[u8]) -> anyhow::Result { + let id = VarInt::decode(r)?; + Self::from_id(id.0 as u32).with_context(|| format!("id {}", id.0)) + } +} + +impl_decode_bytes_auto!(BlockEntityKind); + +impl Encode for ItemKind { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + VarInt(self.to_raw() as i32).encode(w) + } +} + +impl Decode for ItemKind { + fn decode(r: &mut &[u8]) -> anyhow::Result { + let id = VarInt::decode(r)?.0; + let errmsg = "invalid item ID"; + + ItemKind::from_raw(id.try_into().context(errmsg)?).context(errmsg) + } +} + +impl_decode_bytes_auto!(ItemKind); diff --git a/vendor/valence/crates/valence_protocol/src/impls/pointer.rs b/vendor/valence/crates/valence_protocol/src/impls/pointer.rs new file mode 100644 index 00000000..8be556fd --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/impls/pointer.rs @@ -0,0 +1,115 @@ +use std::borrow::Cow; +use std::io::Write; +use std::rc::Rc; +use std::sync::Arc; + +use valence_bytes::Bytes; + +use crate::{Decode, DecodeBytes, Encode}; + +impl Encode for &T { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + (**self).encode(w) + } +} + +impl Encode for &mut T { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + (**self).encode(w) + } +} + +impl Encode for Box { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + self.as_ref().encode(w) + } +} + +impl Decode for Box { + fn decode(r: &mut &[u8]) -> anyhow::Result { + T::decode(r).map(Box::new) + } +} + +impl DecodeBytes for Box { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + T::decode_bytes(r).map(Box::new) + } +} + +impl Encode for Rc { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + self.as_ref().encode(w) + } +} + +impl Decode for Rc { + fn decode(r: &mut &[u8]) -> anyhow::Result { + T::decode(r).map(Rc::new) + } +} + +impl DecodeBytes for Rc { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + T::decode_bytes(r).map(Rc::new) + } +} + +impl Encode for Arc { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + self.as_ref().encode(w) + } +} + +impl Decode for Arc { + fn decode(r: &mut &[u8]) -> anyhow::Result { + T::decode(r).map(Arc::new) + } +} + +impl DecodeBytes for Arc { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + T::decode_bytes(r).map(Arc::new) + } +} + +impl<'a, B> Encode for Cow<'a, B> +where + B: ToOwned + Encode + ?Sized, +{ + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + self.as_ref().encode(w) + } +} + +impl<'a, B> Decode for Cow<'a, B> +where + B: ToOwned + ?Sized, + B::Owned: Decode, +{ + fn decode(r: &mut &[u8]) -> anyhow::Result { + B::Owned::decode(r).map(Cow::Owned) + } +} + +impl<'a, B> DecodeBytes for Cow<'a, B> +where + B: ToOwned + ?Sized, + B::Owned: DecodeBytes, +{ + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + B::Owned::decode_bytes(r).map(Cow::Owned) + } +} + +// impl<'a, 'b, B> Decode<'a> for Cow<'b, B> +// where +// B: ToOwned + ?Sized, +// B::Owned: Decode<'a>, +// &'b B: Decode<'a>, +// { +// fn decode(r: &mut &'a [u8]) -> anyhow::Result { +// let decoded: &'b B = Decode::decode(r)?; +// Ok(Cow::Borrowed(decoded)) +// } +// } diff --git a/vendor/valence/crates/valence_protocol/src/impls/primitive.rs b/vendor/valence/crates/valence_protocol/src/impls/primitive.rs new file mode 100644 index 00000000..71cdb62f --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/impls/primitive.rs @@ -0,0 +1,222 @@ +use std::io::Write; +use std::slice; + +use anyhow::ensure; +use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt}; + +use crate::{impl_decode_bytes_auto, Decode, Encode}; + +impl Encode for bool { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + Ok(w.write_u8(*self as u8)?) + } + + fn encode_slice(slice: &[bool], mut w: impl Write) -> anyhow::Result<()> { + // SAFETY: Bools have the same layout as u8. + let bytes = unsafe { slice::from_raw_parts(slice.as_ptr() as *const u8, slice.len()) }; + // Bools are guaranteed to have the correct bit pattern. + Ok(w.write_all(bytes)?) + } +} + +impl Decode for bool { + fn decode(r: &mut &[u8]) -> anyhow::Result { + let n = r.read_u8()?; + ensure!(n <= 1, "decoded boolean byte is not 0 or 1 (got {n})"); + Ok(n == 1) + } +} + +impl_decode_bytes_auto!(bool); + +impl Encode for u8 { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + Ok(w.write_u8(*self)?) + } + + fn encode_slice(slice: &[u8], mut w: impl Write) -> anyhow::Result<()> { + Ok(w.write_all(slice)?) + } +} + +impl Decode for u8 { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(r.read_u8()?) + } +} + +impl_decode_bytes_auto!(u8); + +impl Encode for i8 { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + Ok(w.write_i8(*self)?) + } + + fn encode_slice(slice: &[i8], mut w: impl Write) -> anyhow::Result<()> { + // SAFETY: i8 has the same layout as u8. + let bytes = unsafe { slice::from_raw_parts(slice.as_ptr() as *const u8, slice.len()) }; + Ok(w.write_all(bytes)?) + } +} + +impl Decode for i8 { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(r.read_i8()?) + } +} + +impl_decode_bytes_auto!(i8); + +impl Encode for u16 { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + Ok(w.write_u16::(*self)?) + } +} + +impl Decode for u16 { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(r.read_u16::()?) + } +} + +impl_decode_bytes_auto!(u16); + +impl Encode for i16 { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + Ok(w.write_i16::(*self)?) + } +} + +impl Decode for i16 { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(r.read_i16::()?) + } +} + +impl_decode_bytes_auto!(i16); + +impl Encode for u32 { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + Ok(w.write_u32::(*self)?) + } +} + +impl Decode for u32 { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(r.read_u32::()?) + } +} + +impl_decode_bytes_auto!(u32); + +impl Encode for i32 { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + Ok(w.write_i32::(*self)?) + } +} + +impl Decode for i32 { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(r.read_i32::()?) + } +} + +impl_decode_bytes_auto!(i32); + +impl Encode for u64 { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + Ok(w.write_u64::(*self)?) + } +} + +impl Decode for u64 { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(r.read_u64::()?) + } +} + +impl_decode_bytes_auto!(u64); + +impl Encode for i64 { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + Ok(w.write_i64::(*self)?) + } +} + +impl Decode for i64 { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(r.read_i64::()?) + } +} + +impl_decode_bytes_auto!(i64); + +impl Encode for u128 { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + Ok(w.write_u128::(*self)?) + } +} + +impl Decode for u128 { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(r.read_u128::()?) + } +} + +impl_decode_bytes_auto!(u128); + +impl Encode for i128 { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + Ok(w.write_i128::(*self)?) + } +} + +impl Decode for i128 { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(r.read_i128::()?) + } +} + +impl_decode_bytes_auto!(i128); + +impl Encode for f32 { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + ensure!( + self.is_finite(), + "attempt to encode non-finite f32 ({})", + self + ); + Ok(w.write_f32::(*self)?) + } +} + +impl Decode for f32 { + fn decode(r: &mut &[u8]) -> anyhow::Result { + let f = r.read_f32::()?; + ensure!(f.is_finite(), "attempt to decode non-finite f32 ({f})"); + Ok(f) + } +} + +impl_decode_bytes_auto!(f32); + +impl Encode for f64 { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + ensure!( + self.is_finite(), + "attempt to encode non-finite f64 ({})", + self + ); + Ok(w.write_f64::(*self)?) + } +} + +impl Decode for f64 { + fn decode(r: &mut &[u8]) -> anyhow::Result { + let f = r.read_f64::()?; + ensure!(f.is_finite(), "attempt to decode non-finite f64 ({f})"); + Ok(f) + } +} + +impl_decode_bytes_auto!(f64); diff --git a/vendor/valence/crates/valence_protocol/src/impls/sequence.rs b/vendor/valence/crates/valence_protocol/src/impls/sequence.rs new file mode 100644 index 00000000..e99354ab --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/impls/sequence.rs @@ -0,0 +1,307 @@ +use std::io::Write; +use std::mem::{self, MaybeUninit}; + +use anyhow::ensure; +use valence_bytes::{Bytes, CowBytes, CowFixedBytes, FixedBytes}; + +use crate::impls::cautious_capacity; +use crate::{Bounded, Decode, DecodeBytes, Encode, VarInt}; + +/// Like tuples, fixed-length arrays are encoded and decoded without a VarInt +/// length prefix. +impl Encode for [T; N] { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + T::encode_slice(self, w) + } +} + +impl Decode for [T; N] { + fn decode(r: &mut &[u8]) -> anyhow::Result { + // TODO: rewrite using std::array::try_from_fn when stabilized? + + let mut data: [MaybeUninit; N] = unsafe { MaybeUninit::uninit().assume_init() }; + + for (i, elem) in data.iter_mut().enumerate() { + match T::decode(r) { + Ok(val) => { + elem.write(val); + } + Err(e) => { + // Call destructors for values decoded so far. + for elem in &mut data[..i] { + unsafe { elem.assume_init_drop() }; + } + return Err(e); + } + } + } + + // All values in `data` are initialized. + unsafe { Ok(mem::transmute_copy(&data)) } + } +} + +impl DecodeBytes for [T; N] { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + // TODO: rewrite using std::array::try_from_fn when stabilized? + + let mut data: [MaybeUninit; N] = unsafe { MaybeUninit::uninit().assume_init() }; + + for (i, elem) in data.iter_mut().enumerate() { + match T::decode_bytes(r) { + Ok(val) => { + elem.write(val); + } + Err(e) => { + // Call destructors for values decoded so far. + for elem in &mut data[..i] { + unsafe { elem.assume_init_drop() }; + } + return Err(e); + } + } + } + + // All values in `data` are initialized. + unsafe { Ok(mem::transmute_copy(&data)) } + } +} + +/// References to fixed-length arrays are not length prefixed. +// TODO: +//impl<'a, const N: usize> Decode<'a> for &'a [u8; N] { +// fn decode(r: &mut &'a [u8]) -> anyhow::Result { +// ensure!( +// r.len() >= N, +// "not enough data to decode u8 array of length {N}" +// ); +// +// let (res, remaining) = r.split_at(N); +// let arr = <&[u8; N]>::try_from(res).unwrap(); +// *r = remaining; +// Ok(arr) +// } +//} + +impl Encode for [T] { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + let len = self.len(); + ensure!( + len <= i32::MAX as usize, + "length of {} slice exceeds i32::MAX (got {len})", + std::any::type_name::() + ); + + VarInt(len as i32).encode(&mut w)?; + + T::encode_slice(self, w) + } +} + +impl Encode for Bounded<&[T], MAX_LEN> { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + let len = self.len(); + ensure!( + len <= MAX_LEN, + "length of {} slice exceeds max of {MAX_LEN} (got {len})", + std::any::type_name::(), + ); + + VarInt(len as i32).encode(&mut w)?; + + T::encode_slice(self, w) + } +} + +impl Encode for Bytes { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + let bytes: &[u8] = self; + bytes.encode(w) + } +} + +impl DecodeBytes for Bytes { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + let len = VarInt::decode_bytes(r)?.0; + ensure!(len >= 0, "attempt to decode slice with negative length"); + let len = len as usize; + ensure!( + len <= r.len(), + "not enough data remaining to decode byte slice (slice len is {len}, but input len is \ + {})", + r.len() + ); + + Ok(r.split_to(len)) + } +} + +impl Encode for FixedBytes { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + <[u8; N]>::encode(self, w) + } +} + +impl DecodeBytes for FixedBytes { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + ensure!( + N <= r.len(), + "not enough data remaining to decode byte array (array len is {N}, but input len is \ + {})", + r.len() + ); + + Ok(r.split_to(N).try_into()?) + } +} + +impl<'a> Encode for CowBytes<'a> { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + let bytes: &[u8] = self; + bytes.encode(w) + } +} + +impl<'a> DecodeBytes for CowBytes<'a> { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + Bytes::decode_bytes(r).map(Self::Owned) + } +} + +impl<'a, const N: usize> Encode for CowFixedBytes<'a, N> { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + <[u8; N]>::encode(self, w) + } +} + +impl<'a, const N: usize> DecodeBytes for CowFixedBytes<'a, N> { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + FixedBytes::decode_bytes(r).map(Self::Owned) + } +} + +impl DecodeBytes for Bounded { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + let res = Bytes::decode_bytes(r)?; + + ensure!( + res.len() <= MAX_LEN, + "length of decoded byte slice exceeds max of {MAX_LEN} (got {})", + res.len() + ); + + Ok(Bounded(res)) + } +} + +impl<'a, const MAX_LEN: usize> DecodeBytes for Bounded, MAX_LEN> { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + let res = >::decode_bytes(r)?; + + Ok(Bounded(res.0.into())) + } +} + +impl Encode for Vec { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + self.as_slice().encode(w) + } +} + +impl Decode for Vec { + fn decode(r: &mut &[u8]) -> anyhow::Result { + let len = VarInt::decode(r)?.0; + ensure!(len >= 0, "attempt to decode Vec with negative length"); + let len = len as usize; + + let mut vec = Vec::with_capacity(cautious_capacity::(len)); + + for _ in 0..len { + vec.push(T::decode(r)?); + } + + Ok(vec) + } +} + +impl DecodeBytes for Vec { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + let len = VarInt::decode_bytes(r)?.0; + ensure!(len >= 0, "attempt to decode Vec with negative length"); + let len = len as usize; + + let mut vec = Vec::with_capacity(cautious_capacity::(len)); + + for _ in 0..len { + vec.push(T::decode_bytes(r)?); + } + + Ok(vec) + } +} + +impl Decode for Bounded, MAX_LEN> { + fn decode(r: &mut &[u8]) -> anyhow::Result { + let len = VarInt::decode(r)?.0; + ensure!(len >= 0, "attempt to decode Vec with negative length"); + let len = len as usize; + + ensure!( + len <= MAX_LEN, + "length of Vec exceeds max of {MAX_LEN} (got {len})" + ); + + let mut vec = Vec::with_capacity(len); + + for _ in 0..len { + vec.push(T::decode(r)?); + } + + Ok(Bounded(vec)) + } +} + +impl DecodeBytes for Bounded, MAX_LEN> { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + let len = VarInt::decode_bytes(r)?.0; + ensure!(len >= 0, "attempt to decode Vec with negative length"); + let len = len as usize; + + ensure!( + len <= MAX_LEN, + "length of Vec exceeds max of {MAX_LEN} (got {len})" + ); + + let mut vec = Vec::with_capacity(len); + + for _ in 0..len { + vec.push(T::decode_bytes(r)?); + } + + Ok(Bounded(vec)) + } +} + +impl Decode for Box<[T]> { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(Vec::decode(r)?.into_boxed_slice()) + } +} + +impl DecodeBytes for Box<[T]> { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + Ok(Vec::decode_bytes(r)?.into_boxed_slice()) + } +} + +impl Decode for Bounded, MAX_LEN> { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(Bounded::, MAX_LEN>::decode(r)?.map_into()) + } +} + +impl DecodeBytes for Bounded, MAX_LEN> { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + Ok(Bounded::, MAX_LEN>::decode_bytes(r)?.map_into()) + } +} diff --git a/vendor/valence/crates/valence_protocol/src/impls/string.rs b/vendor/valence/crates/valence_protocol/src/impls/string.rs new file mode 100644 index 00000000..79998679 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/impls/string.rs @@ -0,0 +1,175 @@ +use std::io::Write; +use std::str::FromStr; + +use anyhow::{ensure, Context}; +use bytes::Bytes; +use valence_bytes::{CowUtf8Bytes, Utf8Bytes}; +use valence_text::Text; + +use crate::{impl_decode_bytes_auto, Bounded, Decode, DecodeBytes, Encode, VarInt}; + +const DEFAULT_MAX_STRING_CHARS: usize = 32767; +const MAX_TEXT_CHARS: usize = 262144; + +impl Encode for str { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + Bounded::<_, DEFAULT_MAX_STRING_CHARS>(self).encode(w) + } +} + +impl Encode for Bounded<&str, MAX_CHARS> { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + let char_count = self.encode_utf16().count(); + + ensure!( + char_count <= MAX_CHARS, + "char count of string exceeds maximum (expected <= {MAX_CHARS}, got {char_count})" + ); + + VarInt(self.len() as i32).encode(&mut w)?; + Ok(w.write_all(self.as_bytes())?) + } +} + +impl Encode for String { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + self.as_str().encode(w) + } +} + +impl Encode for Bounded { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + Bounded::<_, MAX_CHARS>(self.as_str()).encode(w) + } +} + +// TODO: +// impl Decode for String { +// fn decode(r: &mut &[u8]) -> anyhow::Result { +// Ok(<&str>::decode(r)?.into()) +// } +// } +// +// impl Decode for Bounded { +// fn decode(r: &mut &[u8]) -> anyhow::Result { +// Ok(Bounded(Bounded::<&str, MAX_CHARS>::decode(r)?.0.into())) +// } +// } +// +// impl Decode for Box { +// fn decode(r: &mut &[u8]) -> anyhow::Result { +// Ok(<&str>::decode(r)?.into()) +// } +// } +// +// impl Decode for Bounded, MAX_CHARS> { +// fn decode(r: &mut &[u8]) -> anyhow::Result { +// Ok(Bounded(Bounded::<&str, MAX_CHARS>::decode(r)?.0.into())) +// } +// } + +impl Encode for Text { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + let s = serde_json::to_string(self).context("serializing text JSON")?; + + Bounded::<_, MAX_TEXT_CHARS>(s).encode(w) + } +} + +impl Decode for Text { + fn decode(r: &mut &[u8]) -> anyhow::Result { + // TODO: don't do this + let len = VarInt::decode(r)?.0; + ensure!(len >= 0, "attempt to decode string with negative length"); + let len = len as usize; + ensure!( + len <= r.len(), + "not enough data remaining ({} bytes) to decode string of {len} bytes", + r.len() + ); + + let (res, remaining) = r.split_at(len); + *r = remaining; + let res = Utf8Bytes::new(res.to_owned().into())?; + + let char_count = res.encode_utf16().count(); + ensure!( + char_count <= MAX_TEXT_CHARS, + "char count of string exceeds maximum (expected <= {MAX_TEXT_CHARS}, got {char_count})" + ); + + *r = remaining; + + Self::from_str(&res).context("deserializing text JSON") + } +} + +impl_decode_bytes_auto!(Text); + +impl Encode for Utf8Bytes { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + ::encode(self, w) + } +} + +impl DecodeBytes for Utf8Bytes { + fn decode_bytes(bytes: &mut Bytes) -> anyhow::Result { + Ok(Bytes::decode_bytes(bytes)?.try_into()?) + } +} + +impl<'a> Encode for CowUtf8Bytes<'a> { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + ::encode(self, w) + } +} + +impl<'a> DecodeBytes for CowUtf8Bytes<'a> { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + Utf8Bytes::decode_bytes(r).map(Self::Owned) + } +} + +impl Encode for Bounded { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + Bounded::<_, MAX_CHARS>(self.as_str()).encode(w) + } +} + +impl DecodeBytes for Bounded { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + let len = VarInt::decode_bytes(r)?.0; + ensure!(len >= 0, "attempt to decode string with negative length"); + let len = len as usize; + ensure!( + len <= r.len(), + "not enough data remaining ({} bytes) to decode string of {len} bytes", + r.len() + ); + + let res = r.split_to(len); + let res = Utf8Bytes::new(res)?; + + let char_count = res.encode_utf16().count(); + ensure!( + char_count <= MAX_CHARS, + "char count of Utf8Bytes exceeds maximum (expected <= {MAX_CHARS}, got {char_count})" + ); + + Ok(Bounded(res)) + } +} + +impl<'a, const MAX_CHARS: usize> Encode for Bounded, MAX_CHARS> { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + Bounded::<_, MAX_CHARS>(self.as_str()).encode(w) + } +} + +impl<'a, const MAX_CHARS: usize> DecodeBytes for Bounded, MAX_CHARS> { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + let res = >::decode_bytes(r)?; + + Ok(Bounded(res.0.into())) + } +} diff --git a/vendor/valence/crates/valence_protocol/src/impls/tuple.rs b/vendor/valence/crates/valence_protocol/src/impls/tuple.rs new file mode 100644 index 00000000..790e4120 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/impls/tuple.rs @@ -0,0 +1,46 @@ +use std::io::Write; + +use bytes::Bytes; + +use crate::{Decode, DecodeBytes, Encode}; + +macro_rules! impl_tuple { + ($($ty:ident)*) => { + #[allow(non_snake_case)] + impl<$($ty: Encode,)*> Encode for ($($ty,)*) { + fn encode(&self, mut _w: impl Write) -> anyhow::Result<()> { + let ($($ty,)*) = self; + $( + $ty.encode(&mut _w)?; + )* + Ok(()) + } + } + + impl<$($ty: Decode,)*> Decode for ($($ty,)*) { + fn decode(_r: &mut &[u8]) -> anyhow::Result { + Ok(($($ty::decode(_r)?,)*)) + } + } + + impl<$($ty: DecodeBytes,)*> DecodeBytes for ($($ty,)*) { + fn decode_bytes(_r: &mut Bytes) -> anyhow::Result { + Ok(($($ty::decode_bytes(_r)?,)*)) + } + } + } +} + +impl_tuple!(); +impl_tuple!(A); +impl_tuple!(A B); +impl_tuple!(A B C); +impl_tuple!(A B C D); +impl_tuple!(A B C D E); +impl_tuple!(A B C D E F); +impl_tuple!(A B C D E F G); +impl_tuple!(A B C D E F G H); +impl_tuple!(A B C D E F G H I); +impl_tuple!(A B C D E F G H I J); +impl_tuple!(A B C D E F G H I J K); +impl_tuple!(A B C D E F G H I J K L); diff --git a/vendor/valence/crates/valence_protocol/src/item.rs b/vendor/valence/crates/valence_protocol/src/item.rs new file mode 100644 index 00000000..eaf56d38 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/item.rs @@ -0,0 +1,119 @@ +use std::io::Write; + +pub use valence_generated::item::ItemKind; +use valence_nbt::Compound; + +use crate::{Decode, DecodeBytesAuto, Encode}; + +/// A stack of items in an inventory. +#[derive(Clone, PartialEq, Debug, Default, DecodeBytesAuto)] +pub struct ItemStack { + pub item: ItemKind, + pub count: i8, + pub nbt: Option, +} + +impl From for ItemStack { + fn from(item: ItemKind) -> Self { + Self::new(item, 1, None) + } +} + +impl ItemStack { + pub const EMPTY: ItemStack = ItemStack { + item: ItemKind::Air, + count: 0, + nbt: None, + }; + + #[must_use] + pub const fn new(item: ItemKind, count: i8, nbt: Option) -> Self { + Self { item, count, nbt } + } + + #[must_use] + pub const fn with_count(mut self, count: i8) -> Self { + self.count = count; + self + } + + #[must_use] + pub const fn with_item(mut self, item: ItemKind) -> Self { + self.item = item; + self + } + + #[must_use] + pub fn with_nbt(mut self, nbt: impl Into>) -> Self { + self.nbt = nbt.into(); + self + } + + pub const fn is_empty(&self) -> bool { + matches!(self.item, ItemKind::Air) || self.count <= 0 + } +} + +impl Encode for ItemStack { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + if self.is_empty() { + false.encode(w) + } else { + true.encode(&mut w)?; + self.item.encode(&mut w)?; + self.count.encode(&mut w)?; + match &self.nbt { + Some(n) => n.encode(w), + None => 0u8.encode(w), + } + } + } +} + +impl Decode for ItemStack { + fn decode(r: &mut &[u8]) -> anyhow::Result { + let present = bool::decode(r)?; + if !present { + return Ok(ItemStack::EMPTY); + }; + + let item = ItemKind::decode(r)?; + let count = i8::decode(r)?; + + let nbt = if let [0, rest @ ..] = *r { + *r = rest; + None + } else { + Some(Compound::decode(r)?) + }; + + let stack = ItemStack { item, count, nbt }; + + // Normalize empty item stacks. + if stack.is_empty() { + Ok(ItemStack::EMPTY) + } else { + Ok(stack) + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn empty_item_stack_is_empty() { + let air_stack = ItemStack::new(ItemKind::Air, 10, None); + let less_then_one_stack = ItemStack::new(ItemKind::Stone, 0, None); + + assert!(air_stack.is_empty()); + assert!(less_then_one_stack.is_empty()); + + assert!(ItemStack::EMPTY.is_empty()); + + let not_empty_stack = ItemStack::new(ItemKind::Stone, 10, None); + + assert!(!not_empty_stack.is_empty()); + } +} diff --git a/vendor/valence/crates/valence_protocol/src/lib.rs b/vendor/valence/crates/valence_protocol/src/lib.rs new file mode 100644 index 00000000..d90f799e --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/lib.rs @@ -0,0 +1,549 @@ +#![doc = include_str!("../README.md")] +#![deny( + rustdoc::broken_intra_doc_links, + rustdoc::private_intra_doc_links, + rustdoc::missing_crate_level_docs, + rustdoc::invalid_codeblock_attributes, + rustdoc::invalid_rust_codeblocks, + rustdoc::bare_urls, + rustdoc::invalid_html_tags +)] +#![warn( + trivial_casts, + trivial_numeric_casts, + unused_lifetimes, + unused_import_braces, + unreachable_pub, + clippy::dbg_macro +)] + +/// Used only by macros. Not public API. +#[doc(hidden)] +pub mod __private { + pub use anyhow::{Context, Result, anyhow, bail, ensure}; + pub use bytes::Bytes; + + pub use crate::var_int::VarInt; + pub use crate::{Decode, DecodeBytes, Encode, Packet, decode_bytes_auto}; +} + +// This allows us to use our own proc macros internally. +extern crate self as valence_protocol; + +mod array; +mod biome_pos; +mod bit_set; +pub mod block_pos; +mod bounded; +mod byte_angle; +pub mod chunk_pos; +pub mod chunk_section_pos; +// pub mod decode; +mod difficulty; +mod direction; +pub mod encode; +pub mod game_mode; +mod global_pos; +mod hand; +mod impls; +pub mod item; +pub mod packets; +pub mod profile; +mod raw; +pub mod sound; +pub mod var_int; +mod var_long; +mod velocity; + +use std::io::Write; + +use anyhow::{Context, ensure}; +pub use array::FixedArray; +pub use biome_pos::BiomePos; +pub use bit_set::FixedBitSet; +pub use block::{BlockKind, BlockState}; +pub use block_pos::BlockPos; +pub use bounded::Bounded; +pub use byte_angle::ByteAngle; +use bytes::Bytes; +pub use chunk_pos::ChunkPos; +pub use chunk_section_pos::ChunkSectionPos; +// pub use decode::PacketDecoder; +use derive_more::{From, Into}; +pub use difficulty::Difficulty; +pub use direction::Direction; +pub use encode::{PacketEncoder, WritePacket}; +pub use game_mode::GameMode; +pub use global_pos::GlobalPos; +pub use hand::Hand; +pub use ident::ident; +pub use item::{ItemKind, ItemStack}; +pub use packets::play::particle_s2c::Particle; +pub use raw::RawBytes; +use serde::{Deserialize, Serialize}; +pub use sound::Sound; +pub use text::Text; +pub use valence_generated::{block, packet_id, status_effects}; +pub use valence_ident::Ident; +pub use valence_protocol_macros::{Decode, DecodeBytes, DecodeBytesAuto, Encode, Packet}; +pub use var_int::VarInt; +pub use var_long::VarLong; +pub use velocity::Velocity; +pub use { + anyhow, bytes, uuid, valence_ident as ident, valence_math as math, valence_nbt as nbt, + valence_text as text, +}; + +/// The maximum number of bytes in a single Minecraft packet. +pub const MAX_PACKET_SIZE: i32 = 2097152; + +/// The Minecraft protocol version this library currently targets. +pub const PROTOCOL_VERSION: i32 = 763; + +/// The stringified name of the Minecraft version this library currently +/// targets. +pub const MINECRAFT_VERSION: &str = "1.20.1"; + +/// How large a packet should be before it is compressed by the packet encoder. +/// +/// If the inner value is >= 0, then packets with encoded lengths >= to this +/// value will be compressed. If the value is negative, then compression is +/// disabled and no packets are compressed. +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, From, Into)] +pub struct CompressionThreshold(pub i32); + +impl CompressionThreshold { + /// No compression. + pub const DEFAULT: Self = Self(-1); +} + +/// No compression. +impl Default for CompressionThreshold { + fn default() -> Self { + Self::DEFAULT + } +} + +/// The `Encode` trait allows objects to be written to the Minecraft protocol. +/// It is the inverse of [`Decode`]. +/// +/// # Deriving +/// +/// This trait can be implemented automatically for structs and enums by using +/// the [`Encode`][macro] derive macro. All components of the type must +/// implement `Encode`. Components are encoded in the order they appear in the +/// type definition. +/// +/// For enums, the variant to encode is marked by a leading [`VarInt`] +/// discriminant (tag). The discriminant value can be changed using the +/// `#[packet(tag = ...)]` attribute on the variant in question. Discriminant +/// values are assigned to variants using rules similar to regular enum +/// discriminants. +/// +/// ``` +/// use valence_protocol::Encode; +/// +/// #[derive(Encode)] +/// struct MyStruct<'a> { +/// first: i32, +/// second: &'a str, +/// third: [f64; 3], +/// } +/// +/// #[derive(Encode)] +/// enum MyEnum { +/// First, // tag = 0 +/// Second, // tag = 1 +/// #[packet(tag = 25)] +/// Third, // tag = 25 +/// Fourth, // tag = 26 +/// } +/// +/// let value = MyStruct { +/// first: 10, +/// second: "hello", +/// third: [1.5, 3.14, 2.718], +/// }; +/// +/// let mut buf = vec![]; +/// value.encode(&mut buf).unwrap(); +/// +/// println!("{buf:?}"); +/// ``` +/// +/// [macro]: valence_protocol_macros::Encode +/// [`VarInt`]: var_int::VarInt +pub trait Encode { + /// Writes this object to the provided writer. + /// + /// If this type also implements [`Decode`] then successful calls to this + /// function returning `Ok(())` must always successfully [`decode`] using + /// the data that was written to the writer. The exact number of bytes + /// that were originally written must be consumed during the decoding. + /// + /// [`decode`]: Decode::decode + fn encode(&self, w: impl Write) -> anyhow::Result<()>; + + /// Like [`Encode::encode`], except that a whole slice of values is encoded. + /// + /// This method must be semantically equivalent to encoding every element of + /// the slice in sequence with no leading length prefix (which is exactly + /// what the default implementation does), but a more efficient + /// implementation may be used. + /// + /// This method is important for some types like `u8` where the entire slice + /// can be encoded in a single call to [`write_all`]. Because impl + /// specialization is unavailable in stable Rust at the time of writing, + /// we must make the slice specialization part of this trait. + /// + /// [`write_all`]: Write:write_all + fn encode_slice(slice: &[Self], mut w: impl Write) -> anyhow::Result<()> + where + Self: Sized, + { + for value in slice { + value.encode(&mut w)?; + } + + Ok(()) + } +} + +/// The `Decode` trait allows objects to be read from the Minecraft protocol. It +/// is the inverse of [`Encode`]. +/// +/// # Deriving +/// +/// This trait can be implemented automatically for structs and enums by using +/// the [`Decode`][macro] derive macro. All components of the type must +/// implement `Decode`. Components are decoded in the order they appear in the +/// type definition. +/// +/// For enums, the variant to decode is determined by a leading [`VarInt`] +/// discriminant (tag). The discriminant value can be changed using the +/// `#[packet(tag = ...)]` attribute on the variant in question. Discriminant +/// values are assigned to variants using rules similar to regular enum +/// discriminants. +/// +/// ``` +/// use valence_protocol::Decode; +/// +/// #[derive(PartialEq, Debug, Decode)] +/// struct MyStruct { +/// first: i32, +/// second: MyEnum, +/// } +/// +/// #[derive(PartialEq, Debug, Decode)] +/// enum MyEnum { +/// First, // tag = 0 +/// Second, // tag = 1 +/// #[packet(tag = 25)] +/// Third, // tag = 25 +/// Fourth, // tag = 26 +/// } +/// +/// let mut r: &[u8] = &[0, 0, 0, 0, 26]; +/// +/// let value = MyStruct::decode(&mut r).unwrap(); +/// let expected = MyStruct { +/// first: 0, +/// second: MyEnum::Fourth, +/// }; +/// +/// assert_eq!(value, expected); +/// assert!(r.is_empty()); +/// ``` +/// +/// [macro]: valence_protocol_macros::Decode +/// [`VarInt`]: var_int::VarInt +pub trait Decode: DecodeBytes + Sized { + /// Reads this object from the provided byte slice. + /// + /// Implementations of `Decode` are expected to shrink the slice from the + /// front as bytes are read. + fn decode(r: &mut &[u8]) -> anyhow::Result; + + /// Same as [`Decode::decode`], but instead of modifying the slice + /// parameter, this returns both the decoded object and the number of + /// bytes read + fn decode_and_len(mut slice: &[u8]) -> anyhow::Result<(T, usize)> { + let orig_len = slice.len(); + T::decode(&mut slice).map(|decoded| (decoded, orig_len - slice.len())) + } +} + +pub trait DecodeBytes: Sized { + /// Reads this object from the provided [`bytes::Bytes`]. + /// + /// Implementations of `Decode` are expected to shrink the slice from the + /// front as bytes are read. + fn decode_bytes(r: &mut Bytes) -> anyhow::Result; + + /// Reads this object from an owned `&[u8]`. This function may allocate a + /// [`bytes::Bytes`] if needed. + /// + /// On success, this will return the decoded object and the number of bytes + /// read. + fn decode_from_owned(r: T) -> anyhow::Result<(Self, usize)> + where + T: AsRef<[u8]> + Send + 'static, + { + let mut bytes = Bytes::from_owner(r); + let orig_len = bytes.len(); + Self::decode_bytes(&mut bytes).map(|decoded| (decoded, orig_len - bytes.len())) + } +} + +/// Implement [`DecodeBytes`] on a type that already impleemnts [`Decode`] +macro_rules! impl_decode_bytes_auto { + ($t:ty) => { + impl $crate::DecodeBytes for $t { + fn decode_bytes(r: &mut $crate::__private::Bytes) -> $crate::__private::Result { + $crate::decode_bytes_auto(r) + } + + fn decode_from_owned(r: T) -> anyhow::Result<(Self, usize)> + where + T: AsRef<[u8]> + Send + 'static, + { + ::decode_and_len(r.as_ref()) + } + } + }; +} + +pub(crate) use impl_decode_bytes_auto; + +pub fn decode_bytes_auto(r: &mut Bytes) -> anyhow::Result { + let mut slice: &[u8] = r; + let value = T::decode(&mut slice); + *r = r.slice_ref(slice); + value +} + +/// Helper function to decode a string from data without requiring +/// [`valence_bytes::Bytes`] +pub fn decode_str<'a>(r: &mut &'a [u8]) -> anyhow::Result<&'a str> { + let len = VarInt::decode(r)?.0; + ensure!(len >= 0, "attempt to decode string with negative length"); + let len = len as usize; + ensure!( + len <= r.len(), + "not enough data remaining ({} bytes) to decode string of {len} bytes", + r.len() + ); + + let (res, remaining) = r.split_at(len); + let res = std::str::from_utf8(res)?; + + *r = remaining; + + Ok(res) +} + +/// Types considered to be Minecraft packets. +/// +/// In serialized form, a packet begins with a [`VarInt`] packet ID followed by +/// the body of the packet. If present, the implementations of [`Encode`] and +/// [`Decode`] on `Self` are expected to only encode/decode the _body_ of this +/// packet without the leading ID. +pub trait Packet: std::fmt::Debug { + /// The leading VarInt ID of this packet. + const ID: i32; + /// The name of this packet for debugging purposes. + const NAME: &'static str; + /// The side this packet is intended for. + const SIDE: PacketSide; + /// The state in which this packet is used. + const STATE: PacketState; + + /// Encodes this packet's VarInt ID first, followed by the packet's body. + fn encode_with_id(&self, mut w: impl Write) -> anyhow::Result<()> + where + Self: Encode, + { + VarInt(Self::ID) + .encode(&mut w) + .context("failed to encode packet ID")?; + + self.encode(w) + } +} + +/// The side a packet is intended for. +#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, Serialize, Deserialize)] +pub enum PacketSide { + /// Server -> Client + Clientbound, + /// Client -> Server + Serverbound, +} + +/// The statein which a packet is used. +#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, Serialize, Deserialize)] +pub enum PacketState { + Handshaking, + Status, + Login, + Play, +} + +#[allow(dead_code)] +#[cfg(test)] +mod tests { + use std::borrow::Cow; + + use bytes::BytesMut; + + use super::*; + use crate::Ident; + use crate::block_pos::BlockPos; + use crate::decode::PacketDecoder; + use crate::encode::PacketEncoder; + use crate::hand::Hand; + use crate::item::{ItemKind, ItemStack}; + use crate::text::{IntoText, Text}; + use crate::var_int::VarInt; + use crate::var_long::VarLong; + + #[derive(Encode, Decode, Packet, Debug)] + #[packet(id = 1, side = PacketSide::Clientbound)] + struct RegularStruct { + foo: i32, + bar: bool, + baz: f64, + } + + #[derive(Encode, Decode, Packet, Debug)] + #[packet(id = 2, side = PacketSide::Clientbound)] + struct UnitStruct; + + #[derive(Encode, Decode, Packet, Debug)] + #[packet(id = 3, side = PacketSide::Clientbound)] + struct EmptyStruct {} + + #[derive(Encode, Decode, Packet, Debug)] + #[packet(id = 4, side = PacketSide::Clientbound)] + struct TupleStruct(i32, bool, f64); + + #[derive(Encode, Decode, Packet, Debug)] + #[packet(id = 5, side = PacketSide::Clientbound)] + struct StructWithGenerics<'z, T = ()> { + foo: &'z str, + bar: T, + } + + #[derive(Encode, Decode, Packet, Debug)] + #[packet(id = 6, side = PacketSide::Clientbound)] + struct TupleStructWithGenerics<'z, T = ()>(&'z str, i32, T); + + #[allow(unconditional_recursion, clippy::extra_unused_type_parameters)] + fn assert_has_impls<'a, T>() + where + T: Encode + Decode<'a> + Packet, + { + assert_has_impls::(); + assert_has_impls::(); + assert_has_impls::(); + assert_has_impls::(); + assert_has_impls::(); + assert_has_impls::(); + } + + #[test] + fn packet_name() { + assert_eq!(RegularStruct::NAME, "RegularStruct"); + assert_eq!(UnitStruct::NAME, "UnitStruct"); + assert_eq!(StructWithGenerics::<()>::NAME, "StructWithGenerics"); + } + + #[cfg(feature = "encryption")] + const CRYPT_KEY: [u8; 16] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; + + #[derive(PartialEq, Debug, Encode, Decode, Packet)] + #[packet(id = 42, side = PacketSide::Clientbound)] + struct TestPacket<'a> { + a: bool, + b: u8, + c: i32, + d: f32, + e: f64, + f: BlockPos, + g: Hand, + h: Ident, + i: ItemStack, + j: Text, + k: VarInt, + l: VarLong, + m: &'a str, + n: &'a [u8; 10], + o: [u128; 3], + } + + impl<'a> TestPacket<'a> { + fn new(string: &'a str) -> Self { + Self { + a: true, + b: 12, + c: -999, + d: 5.001, + e: 1e10, + f: BlockPos::new(1, 2, 3), + g: Hand::Off, + h: Ident::new("minecraft:whatever").unwrap(), + i: ItemStack::new(ItemKind::WoodenSword, 12, None), + j: "my ".into_text() + "fancy".italic() + " text", + k: VarInt(123), + l: VarLong(456), + m: string, + n: &[7; 10], + o: [123456789; 3], + } + } + } + + fn check_test_packet(dec: &mut PacketDecoder, string: &str) { + let frame = dec.try_next_packet().unwrap().unwrap(); + + let pkt = frame.decode::().unwrap(); + + assert_eq!(&pkt, &TestPacket::new(string)); + } + + #[test] + fn packets_round_trip() { + let mut buf = BytesMut::new(); + + let mut enc = PacketEncoder::new(); + + enc.append_packet(&TestPacket::new("first")).unwrap(); + #[cfg(feature = "compression")] + enc.set_compression(0.into()); + enc.append_packet(&TestPacket::new("second")).unwrap(); + buf.unsplit(enc.take()); + #[cfg(feature = "encryption")] + enc.enable_encryption(&CRYPT_KEY); + enc.append_packet(&TestPacket::new("third")).unwrap(); + enc.prepend_packet(&TestPacket::new("fourth")).unwrap(); + + buf.unsplit(enc.take()); + + let mut dec = PacketDecoder::new(); + + dec.queue_bytes(buf); + + check_test_packet(&mut dec, "first"); + + #[cfg(feature = "compression")] + dec.set_compression(0.into()); + + check_test_packet(&mut dec, "second"); + + #[cfg(feature = "encryption")] + dec.enable_encryption(&CRYPT_KEY); + + check_test_packet(&mut dec, "fourth"); + check_test_packet(&mut dec, "third"); + } +} diff --git a/vendor/valence/crates/valence_protocol/src/packets.rs b/vendor/valence/crates/valence_protocol/src/packets.rs new file mode 100644 index 00000000..447c5514 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets.rs @@ -0,0 +1,366 @@ +//! All of Minecraft's network packets. +//! +//! Packets are grouped in submodules according to the protocol stage they're +//! used in. Names are derived from the FabricMC Yarn mappings for consistency. + +pub mod handshaking { + pub mod handshake_c2s; + pub use handshake_c2s::HandshakeC2s; +} + +pub mod login { + pub mod login_compression_s2c; + pub use login_compression_s2c::LoginCompressionS2c; + pub mod login_disconnect_s2c; + pub use login_disconnect_s2c::LoginDisconnectS2c; + pub mod login_hello_c2s; + pub use login_hello_c2s::LoginHelloC2s; + pub mod login_hello_s2c; + pub use login_hello_s2c::LoginHelloS2c; + pub mod login_key_c2s; + pub use login_key_c2s::LoginKeyC2s; + pub mod login_query_request_s2c; + pub use login_query_request_s2c::LoginQueryRequestS2c; + pub mod login_query_response_c2s; + pub use login_query_response_c2s::LoginQueryResponseC2s; + pub mod login_success_s2c; + pub use login_success_s2c::LoginSuccessS2c; +} + +pub mod play { + pub mod advancement_tab_c2s; + pub use advancement_tab_c2s::AdvancementTabC2s; + pub mod advancement_update_s2c; + pub use advancement_update_s2c::AdvancementUpdateS2c; + pub mod block_breaking_progress_s2c; + pub use block_breaking_progress_s2c::BlockBreakingProgressS2c; + pub mod block_entity_update_s2c; + pub use block_entity_update_s2c::BlockEntityUpdateS2c; + pub mod block_event_s2c; + pub use block_event_s2c::BlockEventS2c; + pub mod block_update_s2c; + pub use block_update_s2c::BlockUpdateS2c; + pub mod boat_paddle_state_c2s; + pub use boat_paddle_state_c2s::BoatPaddleStateC2s; + pub mod book_update_c2s; + pub use book_update_c2s::BookUpdateC2s; + pub mod boss_bar_s2c; + pub use boss_bar_s2c::BossBarS2c; + pub mod bundle_splitter_s2c; + pub use bundle_splitter_s2c::BundleSplitterS2c; + pub mod button_click_c2s; + pub use button_click_c2s::ButtonClickC2s; + pub mod chat_message_c2s; + pub use chat_message_c2s::ChatMessageC2s; + pub mod chat_message_s2c; + pub use chat_message_s2c::ChatMessageS2c; + pub mod chat_suggestions_s2c; + pub use chat_suggestions_s2c::ChatSuggestionsS2c; + pub mod chunk_biome_data_s2c; + pub use chunk_biome_data_s2c::ChunkBiomeDataS2c; + pub mod chunk_data_s2c; + pub use chunk_data_s2c::ChunkDataS2c; + pub mod chunk_delta_update_s2c; + pub use chunk_delta_update_s2c::ChunkDeltaUpdateS2c; + pub mod chunk_load_distance_s2c; + pub use chunk_load_distance_s2c::ChunkLoadDistanceS2c; + pub mod chunk_render_distance_center_s2c; + pub use chunk_render_distance_center_s2c::ChunkRenderDistanceCenterS2c; + pub mod clear_title_s2c; + pub use clear_title_s2c::ClearTitleS2c; + pub mod click_slot_c2s; + pub use click_slot_c2s::ClickSlotC2s; + pub mod client_command_c2s; + pub use client_command_c2s::ClientCommandC2s; + pub mod client_settings_c2s; + pub use client_settings_c2s::ClientSettingsC2s; + pub mod client_status_c2s; + pub use client_status_c2s::ClientStatusC2s; + pub mod close_handled_screen_c2s; + pub use close_handled_screen_c2s::CloseHandledScreenC2s; + pub mod close_screen_s2c; + pub use close_screen_s2c::CloseScreenS2c; + pub mod command_execution_c2s; + pub use command_execution_c2s::CommandExecutionC2s; + pub mod command_suggestions_s2c; + pub use command_suggestions_s2c::CommandSuggestionsS2c; + pub mod command_tree_s2c; + pub use command_tree_s2c::CommandTreeS2c; + pub mod cooldown_update_s2c; + pub use cooldown_update_s2c::CooldownUpdateS2c; + pub mod craft_failed_response_s2c; + pub use craft_failed_response_s2c::CraftFailedResponseS2c; + pub mod craft_request_c2s; + pub use craft_request_c2s::CraftRequestC2s; + pub mod creative_inventory_action_c2s; + pub use creative_inventory_action_c2s::CreativeInventoryActionC2s; + pub mod custom_payload_c2s; + pub use custom_payload_c2s::CustomPayloadC2s; + pub mod custom_payload_s2c; + pub use custom_payload_s2c::CustomPayloadS2c; + pub mod damage_tilt_s2c; + pub use damage_tilt_s2c::DamageTiltS2c; + pub mod death_message_s2c; + pub use death_message_s2c::DeathMessageS2c; + pub mod difficulty_s2c; + pub use difficulty_s2c::DifficultyS2c; + pub mod disconnect_s2c; + pub use disconnect_s2c::DisconnectS2c; + pub mod end_combat_s2c; + pub use end_combat_s2c::EndCombatS2c; + pub mod enter_combat_s2c; + pub use enter_combat_s2c::EnterCombatS2c; + pub mod entities_destroy_s2c; + pub use entities_destroy_s2c::EntitiesDestroyS2c; + pub mod entity_animation_s2c; + pub use entity_animation_s2c::EntityAnimationS2c; + pub mod entity_attach_s2c; + pub use entity_attach_s2c::EntityAttachS2c; + pub mod entity_attributes_s2c; + pub use entity_attributes_s2c::EntityAttributesS2c; + pub mod entity_damage_s2c; + pub use entity_damage_s2c::EntityDamageS2c; + pub mod entity_equipment_update_s2c; + pub use entity_equipment_update_s2c::EntityEquipmentUpdateS2c; + pub mod entity_passengers_set_s2c; + pub use entity_passengers_set_s2c::EntityPassengersSetS2c; + pub mod entity_position_s2c; + pub use entity_position_s2c::EntityPositionS2c; + pub mod entity_set_head_yaw_s2c; + pub use entity_set_head_yaw_s2c::EntitySetHeadYawS2c; + pub mod entity_spawn_s2c; + pub use entity_spawn_s2c::EntitySpawnS2c; + pub mod entity_status_effect_s2c; + pub use entity_status_effect_s2c::EntityStatusEffectS2c; + pub mod entity_status_s2c; + pub use entity_status_s2c::EntityStatusS2c; + pub mod entity_tracker_update_s2c; + pub use entity_tracker_update_s2c::EntityTrackerUpdateS2c; + pub mod entity_velocity_update_s2c; + pub use entity_velocity_update_s2c::EntityVelocityUpdateS2c; + pub mod experience_bar_update_s2c; + pub use experience_bar_update_s2c::ExperienceBarUpdateS2c; + pub mod experience_orb_spawn_s2c; + pub use experience_orb_spawn_s2c::ExperienceOrbSpawnS2c; + pub mod explosion_s2c; + pub use explosion_s2c::ExplosionS2c; + pub mod features_s2c; + pub use features_s2c::FeaturesS2c; + pub mod full_c2s; + pub use full_c2s::FullC2s; + pub mod game_join_s2c; + pub use game_join_s2c::GameJoinS2c; + pub mod game_message_s2c; + pub use game_message_s2c::GameMessageS2c; + pub mod game_state_change_s2c; + pub use game_state_change_s2c::GameStateChangeS2c; + pub mod hand_swing_c2s; + pub use hand_swing_c2s::HandSwingC2s; + pub mod health_update_s2c; + pub use health_update_s2c::HealthUpdateS2c; + pub mod inventory_s2c; + pub use inventory_s2c::InventoryS2c; + pub mod item_pickup_animation_s2c; + pub use item_pickup_animation_s2c::ItemPickupAnimationS2c; + pub mod jigsaw_generating_c2s; + pub use jigsaw_generating_c2s::JigsawGeneratingC2s; + pub mod keep_alive_c2s; + pub use keep_alive_c2s::KeepAliveC2s; + pub mod keep_alive_s2c; + pub use keep_alive_s2c::KeepAliveS2c; + pub mod light_update_s2c; + pub use light_update_s2c::LightUpdateS2c; + pub mod look_and_on_ground_c2s; + pub use look_and_on_ground_c2s::LookAndOnGroundC2s; + pub mod look_at_s2c; + pub use look_at_s2c::LookAtS2c; + pub mod map_update_s2c; + pub use map_update_s2c::MapUpdateS2c; + pub mod message_acknowledgment_c2s; + pub use message_acknowledgment_c2s::MessageAcknowledgmentC2s; + pub mod move_relative_s2c; + pub use move_relative_s2c::MoveRelativeS2c; + pub mod nbt_query_response_s2c; + pub use nbt_query_response_s2c::NbtQueryResponseS2c; + pub mod on_ground_only_c2s; + pub use on_ground_only_c2s::OnGroundOnlyC2s; + pub mod open_horse_screen_s2c; + pub use open_horse_screen_s2c::OpenHorseScreenS2c; + pub mod open_screen_s2c; + pub use open_screen_s2c::OpenScreenS2c; + pub mod open_written_book_s2c; + pub use open_written_book_s2c::OpenWrittenBookS2c; + pub mod overlay_message_s2c; + pub use overlay_message_s2c::OverlayMessageS2c; + pub mod particle_s2c; + pub use particle_s2c::ParticleS2c; + pub mod pick_from_inventory_c2s; + pub use pick_from_inventory_c2s::PickFromInventoryC2s; + pub mod play_ping_s2c; + pub use play_ping_s2c::PlayPingS2c; + pub mod play_pong_c2s; + pub use play_pong_c2s::PlayPongC2s; + pub mod play_sound_from_entity_s2c; + pub use play_sound_from_entity_s2c::PlaySoundFromEntityS2c; + pub mod play_sound_s2c; + pub use play_sound_s2c::PlaySoundS2c; + pub mod player_abilities_s2c; + pub use player_abilities_s2c::PlayerAbilitiesS2c; + pub mod player_action_c2s; + pub use player_action_c2s::PlayerActionC2s; + pub mod player_action_response_s2c; + pub use player_action_response_s2c::PlayerActionResponseS2c; + pub mod player_input_c2s; + pub use player_input_c2s::PlayerInputC2s; + pub mod player_interact_block_c2s; + pub use player_interact_block_c2s::PlayerInteractBlockC2s; + pub mod player_interact_entity_c2s; + pub use player_interact_entity_c2s::PlayerInteractEntityC2s; + pub mod player_interact_item_c2s; + pub use player_interact_item_c2s::PlayerInteractItemC2s; + pub mod player_list_header_s2c; + pub use player_list_header_s2c::PlayerListHeaderS2c; + pub mod player_list_s2c; + pub use player_list_s2c::PlayerListS2c; + pub mod player_position_look_s2c; + pub use player_position_look_s2c::PlayerPositionLookS2c; + pub mod player_remove_s2c; + pub use player_remove_s2c::PlayerRemoveS2c; + pub mod player_respawn_s2c; + pub use player_respawn_s2c::PlayerRespawnS2c; + pub mod player_session_c2s; + pub use player_session_c2s::PlayerSessionC2s; + pub mod player_spawn_position_s2c; + pub use player_spawn_position_s2c::PlayerSpawnPositionS2c; + pub mod player_spawn_s2c; + pub use player_spawn_s2c::PlayerSpawnS2c; + pub mod position_and_on_ground_c2s; + pub use position_and_on_ground_c2s::PositionAndOnGroundC2s; + pub mod profileless_chat_message_s2c; + pub use profileless_chat_message_s2c::ProfilelessChatMessageS2c; + pub mod query_block_nbt_c2s; + pub use query_block_nbt_c2s::QueryBlockNbtC2s; + pub mod query_entity_nbt_c2s; + pub use query_entity_nbt_c2s::QueryEntityNbtC2s; + pub mod recipe_book_data_c2s; + pub use recipe_book_data_c2s::RecipeBookDataC2s; + pub mod recipe_category_options_c2s; + pub use recipe_category_options_c2s::RecipeCategoryOptionsC2s; + pub mod remove_entity_status_effect_s2c; + pub use remove_entity_status_effect_s2c::RemoveEntityStatusEffectS2c; + pub mod remove_message_s2c; + pub use remove_message_s2c::RemoveMessageS2c; + pub mod rename_item_c2s; + pub use rename_item_c2s::RenameItemC2s; + pub mod request_command_completions_c2s; + pub use request_command_completions_c2s::RequestCommandCompletionsC2s; + pub mod resource_pack_send_s2c; + pub use resource_pack_send_s2c::ResourcePackSendS2c; + pub mod resource_pack_status_c2s; + pub use resource_pack_status_c2s::ResourcePackStatusC2s; + pub mod rotate_s2c; + pub use rotate_s2c::RotateS2c; + pub mod rotate_and_move_relative_s2c; + pub use rotate_and_move_relative_s2c::RotateAndMoveRelativeS2c; + pub mod scoreboard_display_s2c; + pub use scoreboard_display_s2c::ScoreboardDisplayS2c; + pub mod scoreboard_objective_update_s2c; + pub use scoreboard_objective_update_s2c::ScoreboardObjectiveUpdateS2c; + pub mod scoreboard_player_update_s2c; + pub use scoreboard_player_update_s2c::ScoreboardPlayerUpdateS2c; + pub mod screen_handler_property_update_s2c; + pub use screen_handler_property_update_s2c::ScreenHandlerPropertyUpdateS2c; + pub mod screen_handler_slot_update_s2c; + pub use screen_handler_slot_update_s2c::ScreenHandlerSlotUpdateS2c; + pub mod select_advancement_tab_s2c; + pub use select_advancement_tab_s2c::SelectAdvancementTabS2c; + pub mod select_merchant_trade_c2s; + pub use select_merchant_trade_c2s::SelectMerchantTradeC2s; + pub mod server_metadata_s2c; + pub use server_metadata_s2c::ServerMetadataS2c; + pub mod set_camera_entity_s2c; + pub use set_camera_entity_s2c::SetCameraEntityS2c; + pub mod set_trade_offers_s2c; + pub use set_trade_offers_s2c::SetTradeOffersS2c; + pub mod sign_editor_open_s2c; + pub use sign_editor_open_s2c::SignEditorOpenS2c; + pub mod simulation_distance_s2c; + pub use simulation_distance_s2c::SimulationDistanceS2c; + pub mod spectator_teleport_c2s; + pub use spectator_teleport_c2s::SpectatorTeleportC2s; + pub mod statistics_s2c; + pub use statistics_s2c::StatisticsS2c; + pub mod stop_sound_s2c; + pub use stop_sound_s2c::StopSoundS2c; + pub mod subtitle_s2c; + pub use subtitle_s2c::SubtitleS2c; + pub mod synchronize_recipes_s2c; + pub use synchronize_recipes_s2c::SynchronizeRecipesS2c; + pub mod synchronize_tags_s2c; + pub use synchronize_tags_s2c::SynchronizeTagsS2c; + pub mod team_s2c; + pub use team_s2c::TeamS2c; + pub mod teleport_confirm_c2s; + pub use teleport_confirm_c2s::TeleportConfirmC2s; + pub mod title_fade_s2c; + pub use title_fade_s2c::TitleFadeS2c; + pub mod title_s2c; + pub use title_s2c::TitleS2c; + pub mod unload_chunk_s2c; + pub use unload_chunk_s2c::UnloadChunkS2c; + pub mod unlock_recipes_s2c; + pub use unlock_recipes_s2c::UnlockRecipesS2c; + pub mod update_beacon_c2s; + pub use update_beacon_c2s::UpdateBeaconC2s; + pub mod update_command_block_c2s; + pub use update_command_block_c2s::UpdateCommandBlockC2s; + pub mod update_command_block_minecart_c2s; + pub use update_command_block_minecart_c2s::UpdateCommandBlockMinecartC2s; + pub mod update_difficulty_c2s; + pub use update_difficulty_c2s::UpdateDifficultyC2s; + pub mod update_difficulty_lock_c2s; + pub use update_difficulty_lock_c2s::UpdateDifficultyLockC2s; + pub mod update_jigsaw_c2s; + pub use update_jigsaw_c2s::UpdateJigsawC2s; + pub mod update_player_abilities_c2s; + pub use update_player_abilities_c2s::UpdatePlayerAbilitiesC2s; + pub mod update_selected_slot_c2s; + pub use update_selected_slot_c2s::UpdateSelectedSlotC2s; + pub mod update_selected_slot_s2c; + pub use update_selected_slot_s2c::UpdateSelectedSlotS2c; + pub mod update_sign_c2s; + pub use update_sign_c2s::UpdateSignC2s; + pub mod update_structure_block_c2s; + pub use update_structure_block_c2s::UpdateStructureBlockC2s; + pub mod vehicle_move_c2s; + pub use vehicle_move_c2s::VehicleMoveC2s; + pub mod vehicle_move_s2c; + pub use vehicle_move_s2c::VehicleMoveS2c; + pub mod world_border_center_changed_s2c; + pub use world_border_center_changed_s2c::WorldBorderCenterChangedS2c; + pub mod world_border_initialize_s2c; + pub use world_border_initialize_s2c::WorldBorderInitializeS2c; + pub mod world_border_interpolate_size_s2c; + pub use world_border_interpolate_size_s2c::WorldBorderInterpolateSizeS2c; + pub mod world_border_size_changed_s2c; + pub use world_border_size_changed_s2c::WorldBorderSizeChangedS2c; + pub mod world_border_warning_blocks_changed_s2c; + pub use world_border_warning_blocks_changed_s2c::WorldBorderWarningBlocksChangedS2c; + pub mod world_border_warning_time_changed_s2c; + pub use world_border_warning_time_changed_s2c::WorldBorderWarningTimeChangedS2c; + pub mod world_event_s2c; + pub use world_event_s2c::WorldEventS2c; + pub mod world_time_update_s2c; + pub use world_time_update_s2c::WorldTimeUpdateS2c; +} + +pub mod status { + pub mod query_ping_c2s; + pub use query_ping_c2s::QueryPingC2s; + pub mod query_pong_s2c; + pub use query_pong_s2c::QueryPongS2c; + pub mod query_request_c2s; + pub use query_request_c2s::QueryRequestC2s; + pub mod query_response_s2c; + pub use query_response_s2c::QueryResponseS2c; +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/handshaking/handshake_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/handshaking/handshake_c2s.rs new file mode 100644 index 00000000..5050c25c --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/handshaking/handshake_c2s.rs @@ -0,0 +1,20 @@ +use valence_bytes::CowUtf8Bytes; + +use crate::{Bounded, Decode, DecodeBytes, DecodeBytesAuto, Encode, Packet, PacketState, VarInt}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +#[packet(state = PacketState::Handshaking)] +pub struct HandshakeC2s<'a> { + pub protocol_version: VarInt, + pub server_address: Bounded, 255>, + pub server_port: u16, + pub next_state: HandshakeNextState, +} + +#[derive(Copy, Clone, Debug, PartialEq, Eq, Encode, Decode, DecodeBytesAuto)] +pub enum HandshakeNextState { + #[packet(tag = 1)] + Status, + #[packet(tag = 2)] + Login, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/login/login_compression_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/login/login_compression_s2c.rs new file mode 100644 index 00000000..685dd175 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/login/login_compression_s2c.rs @@ -0,0 +1,7 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, PacketState, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +#[packet(state = PacketState::Login)] +pub struct LoginCompressionS2c { + pub threshold: VarInt, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/login/login_disconnect_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/login/login_disconnect_s2c.rs new file mode 100644 index 00000000..442587b3 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/login/login_disconnect_s2c.rs @@ -0,0 +1,9 @@ +use std::borrow::Cow; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet, PacketState, Text}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +#[packet(state = PacketState::Login)] +pub struct LoginDisconnectS2c<'a> { + pub reason: Cow<'a, Text>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/login/login_hello_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/login/login_hello_c2s.rs new file mode 100644 index 00000000..e38b44aa --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/login/login_hello_c2s.rs @@ -0,0 +1,11 @@ +use uuid::Uuid; +use valence_bytes::CowUtf8Bytes; + +use crate::{Bounded, DecodeBytes, Encode, Packet, PacketState}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +#[packet(state = PacketState::Login)] +pub struct LoginHelloC2s<'a> { + pub username: Bounded, 16>, + pub profile_id: Option, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/login/login_hello_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/login/login_hello_s2c.rs new file mode 100644 index 00000000..1695c1be --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/login/login_hello_s2c.rs @@ -0,0 +1,11 @@ +use valence_bytes::{CowBytes, CowUtf8Bytes}; + +use crate::{Bounded, DecodeBytes, Encode, Packet, PacketState}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +#[packet(state = PacketState::Login)] +pub struct LoginHelloS2c<'a> { + pub server_id: Bounded, 20>, + pub public_key: CowBytes<'a>, + pub verify_token: CowBytes<'a>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/login/login_key_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/login/login_key_c2s.rs new file mode 100644 index 00000000..35f3c753 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/login/login_key_c2s.rs @@ -0,0 +1,10 @@ +use valence_bytes::CowBytes; + +use crate::{DecodeBytes, Encode, Packet, PacketState}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +#[packet(state = PacketState::Login)] +pub struct LoginKeyC2s<'a> { + pub shared_secret: CowBytes<'a>, + pub verify_token: CowBytes<'a>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/login/login_query_request_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/login/login_query_request_s2c.rs new file mode 100644 index 00000000..dc5afb81 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/login/login_query_request_s2c.rs @@ -0,0 +1,11 @@ +use valence_ident::Ident; + +use crate::{Bounded, DecodeBytes, Encode, Packet, PacketState, RawBytes, VarInt}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +#[packet(state = PacketState::Login)] +pub struct LoginQueryRequestS2c<'a> { + pub message_id: VarInt, + pub channel: Ident, + pub data: Bounded, 1048576>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/login/login_query_response_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/login/login_query_response_c2s.rs new file mode 100644 index 00000000..98cb5d99 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/login/login_query_response_c2s.rs @@ -0,0 +1,8 @@ +use crate::{Bounded, DecodeBytes, Encode, Packet, PacketState, RawBytes, VarInt}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +#[packet(state = PacketState::Login)] +pub struct LoginQueryResponseC2s<'a> { + pub message_id: VarInt, + pub data: Option, 1048576>>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/login/login_success_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/login/login_success_s2c.rs new file mode 100644 index 00000000..ff951fbe --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/login/login_success_s2c.rs @@ -0,0 +1,15 @@ +use std::borrow::Cow; + +use uuid::Uuid; +use valence_bytes::CowUtf8Bytes; + +use crate::profile::Property; +use crate::{Bounded, DecodeBytes, Encode, Packet, PacketState}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +#[packet(state = PacketState::Login)] +pub struct LoginSuccessS2c<'a> { + pub uuid: Uuid, + pub username: Bounded, 16>, + pub properties: Cow<'a, [Property>]>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/advancement_tab_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/advancement_tab_c2s.rs new file mode 100644 index 00000000..a39ef5cd --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/advancement_tab_c2s.rs @@ -0,0 +1,9 @@ +use valence_ident::Ident; + +use crate::{DecodeBytes, Encode, Packet}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub enum AdvancementTabC2s { + OpenedTab { tab_id: Ident }, + ClosedScreen, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/advancement_update_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/advancement_update_s2c.rs new file mode 100644 index 00000000..ca954ab4 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/advancement_update_s2c.rs @@ -0,0 +1,106 @@ +// TODO: simplify this and bound packet fields where appropriate. + +use std::borrow::Cow; +use std::io::Write; + +use valence_bytes::{Bytes, CowUtf8Bytes}; +use valence_ident::Ident; +use valence_text::Text; + +use crate::{packet_id, DecodeBytes, Encode, ItemStack, Packet, VarInt}; + +pub type AdvancementUpdateS2c<'a> = + GenericAdvancementUpdateS2c<(Ident, Advancement<'a, ItemStack>)>; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +#[packet(id = packet_id::ADVANCEMENT_UPDATE_S2C)] +pub struct GenericAdvancementUpdateS2c { + pub reset: bool, + pub advancement_mapping: Vec, + pub identifiers: Vec, + pub progress_mapping: Vec<(Ident, Vec)>, +} + +#[derive(Clone, PartialEq, Debug, Encode, DecodeBytes)] +pub struct Advancement<'a, I> { + pub parent_id: Option, + pub display_data: Option>, + pub criteria: Vec<(Ident, ())>, + pub requirements: Vec>, + pub sends_telemetry_data: bool, +} + +#[derive(Clone, PartialEq, Eq, Debug, Encode, DecodeBytes)] +pub struct AdvancementRequirements<'a> { + pub requirement: Vec>, +} + +#[derive(Clone, PartialEq, Debug)] +pub struct AdvancementDisplay<'a, I> { + pub title: Cow<'a, Text>, + pub description: Cow<'a, Text>, + pub icon: I, + pub frame_type: VarInt, + pub flags: i32, + pub background_texture: Option, + pub x_coord: f32, + pub y_coord: f32, +} + +#[derive(Clone, PartialEq, Eq, Debug, Encode, DecodeBytes)] +pub struct AdvancementCriteria { + pub criterion_identifier: Ident, + /// If present, the criteria has been achieved at the + /// time wrapped; time represented as millis since epoch + pub criterion_progress: Option, +} + +impl Encode for AdvancementDisplay<'_, I> { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + self.title.encode(&mut w)?; + self.description.encode(&mut w)?; + self.icon.encode(&mut w)?; + self.frame_type.encode(&mut w)?; + self.flags.encode(&mut w)?; + + match self.background_texture.as_ref() { + None => {} + Some(texture) => texture.encode(&mut w)?, + } + + self.x_coord.encode(&mut w)?; + self.y_coord.encode(&mut w)?; + + Ok(()) + } +} + +impl DecodeBytes for AdvancementDisplay<'static, I> { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + let title = >::decode_bytes(r)?; + let description = >::decode_bytes(r)?; + let icon = I::decode_bytes(r)?; + let frame_type = VarInt::decode_bytes(r)?; + let flags = i32::decode_bytes(r)?; + + let background_texture = if flags & 1 == 1 { + Some(Ident::decode_bytes(r)?) + } else { + None + }; + + let x_coord = f32::decode_bytes(r)?; + let y_coord = f32::decode_bytes(r)?; + + Ok(Self { + title, + description, + icon, + frame_type, + flags, + background_texture, + x_coord, + y_coord, + }) + } +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/block_breaking_progress_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/block_breaking_progress_s2c.rs new file mode 100644 index 00000000..638ee763 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/block_breaking_progress_s2c.rs @@ -0,0 +1,8 @@ +use crate::{BlockPos, Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct BlockBreakingProgressS2c { + pub entity_id: VarInt, + pub position: BlockPos, + pub destroy_stage: u8, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/block_entity_update_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/block_entity_update_s2c.rs new file mode 100644 index 00000000..a3013982 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/block_entity_update_s2c.rs @@ -0,0 +1,13 @@ +use std::borrow::Cow; + +use valence_generated::block::BlockEntityKind; +use valence_nbt::Compound; + +use crate::{BlockPos, Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct BlockEntityUpdateS2c<'a> { + pub position: BlockPos, + pub kind: BlockEntityKind, + pub data: Cow<'a, Compound>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/block_event_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/block_event_s2c.rs new file mode 100644 index 00000000..4ade64a7 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/block_event_s2c.rs @@ -0,0 +1,10 @@ +use crate::block::BlockKind; +use crate::{BlockPos, Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct BlockEventS2c { + pub position: BlockPos, + pub action_id: u8, + pub action_parameter: u8, + pub block_type: BlockKind, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/block_update_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/block_update_s2c.rs new file mode 100644 index 00000000..7e7d62bf --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/block_update_s2c.rs @@ -0,0 +1,7 @@ +use crate::{BlockPos, BlockState, Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct BlockUpdateS2c { + pub position: BlockPos, + pub block_id: BlockState, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/boat_paddle_state_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/boat_paddle_state_c2s.rs new file mode 100644 index 00000000..85cad9f3 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/boat_paddle_state_c2s.rs @@ -0,0 +1,7 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct BoatPaddleStateC2s { + pub left_paddle_turning: bool, + pub right_paddle_turning: bool, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/book_update_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/book_update_c2s.rs new file mode 100644 index 00000000..74d85381 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/book_update_c2s.rs @@ -0,0 +1,14 @@ +use valence_bytes::CowUtf8Bytes; + +use crate::{Bounded, DecodeBytes, Encode, Packet, VarInt}; + +pub const MAX_TITLE_CHARS: usize = 128; +pub const MAX_PAGE_CHARS: usize = 8192; +pub const MAX_PAGES: usize = 200; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct BookUpdateC2s<'a> { + pub slot: VarInt, + pub entries: Bounded, MAX_PAGE_CHARS>>, MAX_PAGES>, + pub title: Option, MAX_TITLE_CHARS>>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/boss_bar_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/boss_bar_s2c.rs new file mode 100644 index 00000000..29edfaeb --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/boss_bar_s2c.rs @@ -0,0 +1,65 @@ +use std::borrow::Cow; + +use bevy_ecs::prelude::Component; +use bitfield_struct::bitfield; +use uuid::Uuid; +use valence_text::Text; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct BossBarS2c<'a> { + pub id: Uuid, + pub action: BossBarAction<'a>, +} + +#[derive(Clone, PartialEq, Debug, Encode, Decode, DecodeBytesAuto)] +pub enum BossBarAction<'a> { + Add { + title: Cow<'a, Text>, + health: f32, + color: BossBarColor, + division: BossBarDivision, + flags: BossBarFlags, + }, + Remove, + UpdateHealth(f32), + UpdateTitle(Cow<'a, Text>), + UpdateStyle(BossBarColor, BossBarDivision), + UpdateFlags(BossBarFlags), +} + +/// The color of a boss bar. +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto, Default)] +pub enum BossBarColor { + #[default] + Pink, + Blue, + Red, + Green, + Yellow, + Purple, + White, +} + +/// The division of a boss bar. +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto, Default)] +pub enum BossBarDivision { + #[default] + NoDivision, + SixNotches, + TenNotches, + TwelveNotches, + TwentyNotches, +} + +/// The flags of a boss bar (darken sky, dragon bar, create fog). +#[bitfield(u8)] +#[derive(PartialEq, Eq, Encode, Decode, DecodeBytesAuto, Component)] +pub struct BossBarFlags { + pub darken_sky: bool, + pub dragon_bar: bool, + pub create_fog: bool, + #[bits(5)] + _pad: u8, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/bundle_splitter_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/bundle_splitter_s2c.rs new file mode 100644 index 00000000..2c21f517 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/bundle_splitter_s2c.rs @@ -0,0 +1,5 @@ +use crate::{packet_id, Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +#[packet(id = packet_id::BUNDLE_SPLITTER)] +pub struct BundleSplitterS2c; diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/button_click_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/button_click_c2s.rs new file mode 100644 index 00000000..42fb6d14 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/button_click_c2s.rs @@ -0,0 +1,7 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct ButtonClickC2s { + pub window_id: i8, + pub button_id: i8, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/chat_message_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/chat_message_c2s.rs new file mode 100644 index 00000000..ad02911b --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/chat_message_c2s.rs @@ -0,0 +1,16 @@ +use valence_bytes::{CowFixedBytes, CowUtf8Bytes}; + +use crate::{Bounded, DecodeBytes, Encode, FixedBitSet, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct ChatMessageC2s<'a> { + pub message: Bounded, 256>, + pub timestamp: u64, + pub salt: u64, + pub signature: Option>, + pub message_count: VarInt, + // This is a bitset of 20; each bit represents one + // of the last 20 messages received and whether or not + // the message was acknowledged by the client + pub acknowledgement: FixedBitSet<20, 3>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/chat_message_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/chat_message_s2c.rs new file mode 100644 index 00000000..e75fbc34 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/chat_message_s2c.rs @@ -0,0 +1,135 @@ +use std::borrow::Cow; +use std::io::Write; + +use uuid::Uuid; +use valence_bytes::{Bytes, CowFixedBytes, CowUtf8Bytes}; +use valence_text::Text; + +use crate::{Bounded, Decode, DecodeBytes, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Clone, PartialEq, Debug, Packet)] +pub struct ChatMessageS2c<'a> { + pub sender: Uuid, + pub index: VarInt, + pub message_signature: Option>, + pub message: Bounded, 256>, + pub timestamp: u64, + pub salt: u64, + pub previous_messages: Vec>, + pub unsigned_content: Option>, + pub filter_type: MessageFilterType, + pub filter_type_bits: Option, + pub chat_type: VarInt, + pub network_name: Cow<'a, Text>, + pub network_target_name: Option>, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto)] +pub enum MessageFilterType { + PassThrough, + FullyFiltered, + PartiallyFiltered, +} + +impl<'a> Encode for ChatMessageS2c<'a> { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + self.sender.encode(&mut w)?; + self.index.encode(&mut w)?; + self.message_signature.encode(&mut w)?; + self.message.encode(&mut w)?; + self.timestamp.encode(&mut w)?; + self.salt.encode(&mut w)?; + self.previous_messages.encode(&mut w)?; + self.unsigned_content.encode(&mut w)?; + self.filter_type.encode(&mut w)?; + + if self.filter_type == MessageFilterType::PartiallyFiltered { + match self.filter_type_bits { + // Filler data + None => 0u8.encode(&mut w)?, + Some(bits) => bits.encode(&mut w)?, + } + } + + self.chat_type.encode(&mut w)?; + self.network_name.encode(&mut w)?; + self.network_target_name.encode(&mut w)?; + + Ok(()) + } +} + +impl<'a> DecodeBytes for ChatMessageS2c<'a> { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + let sender = Uuid::decode_bytes(r)?; + let index = VarInt::decode_bytes(r)?; + let message_signature = Option::>::decode_bytes(r)?; + let message = DecodeBytes::decode_bytes(r)?; + let time_stamp = u64::decode_bytes(r)?; + let salt = u64::decode_bytes(r)?; + let previous_messages = Vec::::decode_bytes(r)?; + let unsigned_content = Option::>::decode_bytes(r)?; + let filter_type = MessageFilterType::decode_bytes(r)?; + + let filter_type_bits = match filter_type { + MessageFilterType::PartiallyFiltered => Some(u8::decode_bytes(r)?), + _ => None, + }; + + let chat_type = VarInt::decode_bytes(r)?; + let network_name = >::decode_bytes(r)?; + let network_target_name = Option::>::decode_bytes(r)?; + + Ok(Self { + sender, + index, + message_signature, + message, + timestamp: time_stamp, + salt, + previous_messages, + unsigned_content, + filter_type, + filter_type_bits, + chat_type, + network_name, + network_target_name, + }) + } +} + +#[derive(Clone, PartialEq, Debug)] +pub struct MessageSignature<'a> { + pub message_id: i32, + pub signature: Option>, +} + +impl Encode for MessageSignature<'_> { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + VarInt(self.message_id + 1).encode(&mut w)?; + + match &self.signature { + None => {} + Some(signature) => signature.encode(&mut w)?, + } + + Ok(()) + } +} + +impl<'a> DecodeBytes for MessageSignature<'a> { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + let message_id = VarInt::decode_bytes(r)?.0 - 1; // TODO: this can underflow. + + let signature = if message_id == -1 { + Some(DecodeBytes::decode_bytes(r)?) + } else { + None + }; + + Ok(Self { + message_id, + signature, + }) + } +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/chat_suggestions_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/chat_suggestions_s2c.rs new file mode 100644 index 00000000..0b936681 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/chat_suggestions_s2c.rs @@ -0,0 +1,18 @@ +use std::borrow::Cow; + +use valence_bytes::CowUtf8Bytes; + +use crate::{Decode, DecodeBytes, DecodeBytesAuto, Encode, Packet}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct ChatSuggestionsS2c<'a> { + pub action: ChatSuggestionsAction, + pub entries: Cow<'a, [CowUtf8Bytes<'a>]>, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto)] +pub enum ChatSuggestionsAction { + Add, + Remove, + Set, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/chunk_biome_data_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/chunk_biome_data_s2c.rs new file mode 100644 index 00000000..f4364108 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/chunk_biome_data_s2c.rs @@ -0,0 +1,17 @@ +use std::borrow::Cow; + +use valence_bytes::CowBytes; + +use crate::{ChunkPos, DecodeBytes, Encode, Packet}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct ChunkBiomeDataS2c<'a> { + pub chunks: Cow<'a, [ChunkBiome<'a>]>, +} + +#[derive(Clone, Debug, Encode, DecodeBytes)] +pub struct ChunkBiome<'a> { + pub pos: ChunkPos, + /// Chunk data structure, with sections containing only the `Biomes` field. + pub data: CowBytes<'a>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/chunk_data_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/chunk_data_s2c.rs new file mode 100644 index 00000000..c091bead --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/chunk_data_s2c.rs @@ -0,0 +1,30 @@ +use std::borrow::Cow; + +use valence_bytes::CowBytes; +use valence_generated::block::BlockEntityKind; +use valence_nbt::Compound; + +use crate::array::FixedArray; +use crate::{ChunkPos, Decode, DecodeBytes, DecodeBytesAuto, Encode, Packet}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct ChunkDataS2c<'a> { + pub pos: ChunkPos, + pub heightmaps: Cow<'a, Compound>, + pub blocks_and_biomes: CowBytes<'a>, + pub block_entities: Cow<'a, [ChunkDataBlockEntity<'a>]>, + pub sky_light_mask: Cow<'a, [u64]>, + pub block_light_mask: Cow<'a, [u64]>, + pub empty_sky_light_mask: Cow<'a, [u64]>, + pub empty_block_light_mask: Cow<'a, [u64]>, + pub sky_light_arrays: Cow<'a, [FixedArray]>, + pub block_light_arrays: Cow<'a, [FixedArray]>, +} + +#[derive(Clone, PartialEq, Debug, Encode, Decode, DecodeBytesAuto)] +pub struct ChunkDataBlockEntity<'a> { + pub packed_xz: i8, + pub y: i16, + pub kind: BlockEntityKind, + pub data: Cow<'a, Compound>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/chunk_delta_update_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/chunk_delta_update_s2c.rs new file mode 100644 index 00000000..1405f904 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/chunk_delta_update_s2c.rs @@ -0,0 +1,39 @@ +use std::borrow::Cow; +use std::io::Write; + +use bitfield_struct::bitfield; + +use crate::chunk_section_pos::ChunkSectionPos; +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarLong}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct ChunkDeltaUpdateS2c<'a> { + pub chunk_sect_pos: ChunkSectionPos, + pub blocks: Cow<'a, [ChunkDeltaUpdateEntry]>, +} + +#[bitfield(u64)] +#[derive(PartialEq, Eq, DecodeBytesAuto)] +pub struct ChunkDeltaUpdateEntry { + #[bits(4)] + pub off_y: u8, + #[bits(4)] + pub off_z: u8, + #[bits(4)] + pub off_x: u8, + pub block_state: u32, + #[bits(20)] + _pad: u32, +} + +impl Encode for ChunkDeltaUpdateEntry { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + VarLong(self.0 as _).encode(w) + } +} + +impl Decode for ChunkDeltaUpdateEntry { + fn decode(r: &mut &[u8]) -> anyhow::Result { + Ok(ChunkDeltaUpdateEntry(VarLong::decode(r)?.0 as _)) + } +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/chunk_load_distance_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/chunk_load_distance_s2c.rs new file mode 100644 index 00000000..f28ef559 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/chunk_load_distance_s2c.rs @@ -0,0 +1,6 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct ChunkLoadDistanceS2c { + pub view_distance: VarInt, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/chunk_render_distance_center_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/chunk_render_distance_center_s2c.rs new file mode 100644 index 00000000..986e8ece --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/chunk_render_distance_center_s2c.rs @@ -0,0 +1,7 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct ChunkRenderDistanceCenterS2c { + pub chunk_x: VarInt, + pub chunk_z: VarInt, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/clear_title_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/clear_title_s2c.rs new file mode 100644 index 00000000..d2fa8d0a --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/clear_title_s2c.rs @@ -0,0 +1,6 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct ClearTitleS2c { + pub reset: bool, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/click_slot_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/click_slot_c2s.rs new file mode 100644 index 00000000..3fe2bdf0 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/click_slot_c2s.rs @@ -0,0 +1,33 @@ +use std::borrow::Cow; + +use crate::{Decode, DecodeBytesAuto, Encode, ItemStack, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct ClickSlotC2s<'a> { + pub window_id: u8, + pub state_id: VarInt, + pub slot_idx: i16, + /// The button used to click the slot. An enum can't easily be used for this + /// because the meaning of this value depends on the mode. + pub button: i8, + pub mode: ClickMode, + pub slot_changes: Cow<'a, [SlotChange]>, + pub carried_item: ItemStack, +} + +#[derive(Copy, Clone, Debug, PartialEq, Eq, Encode, Decode, DecodeBytesAuto)] +pub enum ClickMode { + Click, + ShiftClick, + Hotbar, + CreativeMiddleClick, + DropKey, + Drag, + DoubleClick, +} + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto)] +pub struct SlotChange { + pub idx: i16, + pub stack: ItemStack, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/client_command_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/client_command_c2s.rs new file mode 100644 index 00000000..5d2a2701 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/client_command_c2s.rs @@ -0,0 +1,21 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct ClientCommandC2s { + pub entity_id: VarInt, + pub action: ClientCommand, + pub jump_boost: VarInt, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto)] +pub enum ClientCommand { + StartSneaking, + StopSneaking, + LeaveBed, + StartSprinting, + StopSprinting, + StartJumpWithHorse, + StopJumpWithHorse, + OpenHorseInventory, + StartFlyingWithElytra, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/client_settings_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/client_settings_c2s.rs new file mode 100644 index 00000000..3035148e --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/client_settings_c2s.rs @@ -0,0 +1,44 @@ +use bitfield_struct::bitfield; +use valence_bytes::CowUtf8Bytes; + +use crate::{Decode, DecodeBytes, DecodeBytesAuto, Encode, Packet}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct ClientSettingsC2s<'a> { + pub locale: CowUtf8Bytes<'a>, + pub view_distance: u8, + pub chat_mode: ChatMode, + pub chat_colors: bool, + pub displayed_skin_parts: DisplayedSkinParts, + pub main_arm: MainArm, + pub enable_text_filtering: bool, + pub allow_server_listings: bool, +} + +#[bitfield(u8)] +#[derive(PartialEq, Eq, Encode, Decode, DecodeBytesAuto)] +pub struct DisplayedSkinParts { + pub cape: bool, + pub jacket: bool, + pub left_sleeve: bool, + pub right_sleeve: bool, + pub left_pants_leg: bool, + pub right_pants_leg: bool, + pub hat: bool, + _pad: bool, +} + +#[derive(Copy, Clone, PartialEq, Eq, Default, Debug, Encode, Decode, DecodeBytes)] +pub enum ChatMode { + Enabled, + CommandsOnly, + #[default] + Hidden, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Default, Encode, Decode, DecodeBytes)] +pub enum MainArm { + Left, + #[default] + Right, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/client_status_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/client_status_c2s.rs new file mode 100644 index 00000000..f6aea58f --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/client_status_c2s.rs @@ -0,0 +1,7 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub enum ClientStatusC2s { + PerformRespawn, + RequestStats, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/close_handled_screen_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/close_handled_screen_c2s.rs new file mode 100644 index 00000000..d8edf812 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/close_handled_screen_c2s.rs @@ -0,0 +1,6 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct CloseHandledScreenC2s { + pub window_id: i8, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/close_screen_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/close_screen_s2c.rs new file mode 100644 index 00000000..ba779459 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/close_screen_s2c.rs @@ -0,0 +1,7 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct CloseScreenS2c { + /// Ignored by notchian clients. + pub window_id: u8, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/command_execution_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/command_execution_c2s.rs new file mode 100644 index 00000000..49c621f0 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/command_execution_c2s.rs @@ -0,0 +1,22 @@ +use valence_bytes::{CowFixedBytes, CowUtf8Bytes}; + +use crate::{Bounded, DecodeBytes, Encode, FixedBitSet, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct CommandExecutionC2s<'a> { + pub command: Bounded, 256>, + pub timestamp: u64, + pub salt: u64, + pub argument_signatures: Vec>, + pub message_count: VarInt, + //// This is a bitset of 20; each bit represents one + //// of the last 20 messages received and whether or not + //// the message was acknowledged by the client + pub acknowledgement: FixedBitSet<20, 3>, +} + +#[derive(Clone, Debug, Encode, DecodeBytes)] +pub struct CommandArgumentSignature<'a> { + pub argument_name: Bounded, 16>, + pub signature: CowFixedBytes<'a, 256>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/command_suggestions_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/command_suggestions_s2c.rs new file mode 100644 index 00000000..2effb203 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/command_suggestions_s2c.rs @@ -0,0 +1,20 @@ +use std::borrow::Cow; + +use valence_bytes::CowUtf8Bytes; +use valence_text::Text; + +use crate::{DecodeBytes, Encode, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct CommandSuggestionsS2c<'a> { + pub id: VarInt, + pub start: VarInt, + pub length: VarInt, + pub matches: Vec>, +} + +#[derive(Clone, PartialEq, Debug, Encode, DecodeBytes)] +pub struct CommandSuggestionsMatch<'a> { + pub suggested_match: CowUtf8Bytes<'a>, + pub tooltip: Option>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/command_tree_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/command_tree_s2c.rs new file mode 100644 index 00000000..a893f454 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/command_tree_s2c.rs @@ -0,0 +1,438 @@ +use std::io::Write; + +use anyhow::bail; +use byteorder::WriteBytesExt; +use valence_bytes::{Bytes, Utf8Bytes}; +use valence_ident::Ident; + +use crate::{Decode, DecodeBytes, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct CommandTreeS2c { + pub commands: Vec, + pub root_index: VarInt, +} + +#[derive(Clone, Debug)] +pub struct Node { + pub data: NodeData, + pub executable: bool, + pub children: Vec, + pub redirect_node: Option, +} + +#[derive(Clone, Debug, PartialEq)] +pub enum NodeData { + Root, + Literal { + name: Utf8Bytes, + }, + Argument { + name: Utf8Bytes, + parser: Parser, + suggestion: Option, + }, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug)] +pub enum Suggestion { + AskServer, + AllRecipes, + AvailableSounds, + AvailableBiomes, + SummonableEntities, +} + +#[derive(Clone, Debug, PartialEq)] +pub enum Parser { + Bool, + Float { min: Option, max: Option }, + Double { min: Option, max: Option }, + Integer { min: Option, max: Option }, + Long { min: Option, max: Option }, + String(StringArg), + Entity { single: bool, only_players: bool }, + GameProfile, + BlockPos, + ColumnPos, + Vec3, + Vec2, + BlockState, + BlockPredicate, + ItemStack, + ItemPredicate, + Color, + Component, + Message, + NbtCompoundTag, + NbtTag, + NbtPath, + Objective, + ObjectiveCriteria, + Operation, + Particle, + Angle, + Rotation, + ScoreboardSlot, + ScoreHolder { allow_multiple: bool }, + Swizzle, + Team, + ItemSlot, + ResourceLocation, + Function, + EntityAnchor, + IntRange, + FloatRange, + Dimension, + GameMode, + Time, + ResourceOrTag { registry: Ident }, + ResourceOrTagKey { registry: Ident }, + Resource { registry: Ident }, + ResourceKey { registry: Ident }, + TemplateMirror, + TemplateRotation, + Uuid, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto)] +pub enum StringArg { + SingleWord, + QuotablePhrase, + GreedyPhrase, +} + +impl Encode for Node { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + let node_type = match &self.data { + NodeData::Root => 0, + NodeData::Literal { .. } => 1, + NodeData::Argument { .. } => 2, + }; + + let has_suggestion = matches!( + &self.data, + NodeData::Argument { + suggestion: Some(_), + .. + } + ); + + let flags: u8 = node_type + | (self.executable as u8 * 0x04) + | (self.redirect_node.is_some() as u8 * 0x08) + | (has_suggestion as u8 * 0x10); + + w.write_u8(flags)?; + + self.children.encode(&mut w)?; + + if let Some(redirect_node) = self.redirect_node { + redirect_node.encode(&mut w)?; + } + + match &self.data { + NodeData::Root => {} + NodeData::Literal { name } => { + name.encode(&mut w)?; + } + NodeData::Argument { + name, + parser, + suggestion, + } => { + name.encode(&mut w)?; + parser.encode(&mut w)?; + + if let Some(suggestion) = suggestion { + match suggestion { + Suggestion::AskServer => "ask_server", + Suggestion::AllRecipes => "all_recipes", + Suggestion::AvailableSounds => "available_sounds", + Suggestion::AvailableBiomes => "available_biomes", + Suggestion::SummonableEntities => "summonable_entities", + } + .encode(&mut w)?; + } + } + } + + Ok(()) + } +} + +impl DecodeBytes for Node { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + let flags = u8::decode_bytes(r)?; + + let children = Vec::decode_bytes(r)?; + + let redirect_node = if flags & 0x08 != 0 { + Some(VarInt::decode_bytes(r)?) + } else { + None + }; + + let node_data = match flags & 0x3 { + 0 => NodeData::Root, + 1 => NodeData::Literal { + name: Utf8Bytes::decode_bytes(r)?, + }, + 2 => NodeData::Argument { + name: Utf8Bytes::decode_bytes(r)?, + parser: Parser::decode_bytes(r)?, + suggestion: if flags & 0x10 != 0 { + Some(match Utf8Bytes::decode_bytes(r)?.as_ref() { + "minecraft:ask_server" => Suggestion::AskServer, + "minecraft:all_recipes" => Suggestion::AllRecipes, + "minecraft:available_sounds" => Suggestion::AvailableSounds, + "minecraft:available_biomes" => Suggestion::AvailableBiomes, + "minecraft:summonable_entities" => Suggestion::SummonableEntities, + other => bail!("unknown command suggestion type of \"{other}\""), + }) + } else { + None + }, + }, + n => bail!("invalid node type of {n}"), + }; + + Ok(Self { + children, + data: node_data, + executable: flags & 0x04 != 0, + redirect_node, + }) + } +} + +impl Encode for Parser { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + match self { + Parser::Bool => 0u8.encode(&mut w)?, + Parser::Float { min, max } => { + 1u8.encode(&mut w)?; + + (min.is_some() as u8 | (max.is_some() as u8 * 0x2)).encode(&mut w)?; + + if let Some(min) = min { + min.encode(&mut w)?; + } + + if let Some(max) = max { + max.encode(&mut w)?; + } + } + Parser::Double { min, max } => { + 2u8.encode(&mut w)?; + + (min.is_some() as u8 | (max.is_some() as u8 * 0x2)).encode(&mut w)?; + + if let Some(min) = min { + min.encode(&mut w)?; + } + + if let Some(max) = max { + max.encode(&mut w)?; + } + } + Parser::Integer { min, max } => { + 3u8.encode(&mut w)?; + + (min.is_some() as u8 | (max.is_some() as u8 * 0x2)).encode(&mut w)?; + + if let Some(min) = min { + min.encode(&mut w)?; + } + + if let Some(max) = max { + max.encode(&mut w)?; + } + } + Parser::Long { min, max } => { + 4u8.encode(&mut w)?; + + (min.is_some() as u8 | (max.is_some() as u8 * 0x2)).encode(&mut w)?; + + if let Some(min) = min { + min.encode(&mut w)?; + } + + if let Some(max) = max { + max.encode(&mut w)?; + } + } + Parser::String(arg) => { + 5u8.encode(&mut w)?; + arg.encode(&mut w)?; + } + Parser::Entity { + single, + only_players, + } => { + 6u8.encode(&mut w)?; + (*single as u8 | (*only_players as u8 * 0x2)).encode(&mut w)?; + } + Parser::GameProfile => 7u8.encode(&mut w)?, + Parser::BlockPos => 8u8.encode(&mut w)?, + Parser::ColumnPos => 9u8.encode(&mut w)?, + Parser::Vec3 => 10u8.encode(&mut w)?, + Parser::Vec2 => 11u8.encode(&mut w)?, + Parser::BlockState => 12u8.encode(&mut w)?, + Parser::BlockPredicate => 13u8.encode(&mut w)?, + Parser::ItemStack => 14u8.encode(&mut w)?, + Parser::ItemPredicate => 15u8.encode(&mut w)?, + Parser::Color => 16u8.encode(&mut w)?, + Parser::Component => 17u8.encode(&mut w)?, + Parser::Message => 18u8.encode(&mut w)?, + Parser::NbtCompoundTag => 19u8.encode(&mut w)?, + Parser::NbtTag => 20u8.encode(&mut w)?, + Parser::NbtPath => 21u8.encode(&mut w)?, + Parser::Objective => 22u8.encode(&mut w)?, + Parser::ObjectiveCriteria => 23u8.encode(&mut w)?, + Parser::Operation => 24u8.encode(&mut w)?, + Parser::Particle => 25u8.encode(&mut w)?, + Parser::Angle => 26u8.encode(&mut w)?, + Parser::Rotation => 27u8.encode(&mut w)?, + Parser::ScoreboardSlot => 28u8.encode(&mut w)?, + Parser::ScoreHolder { allow_multiple } => { + 29u8.encode(&mut w)?; + allow_multiple.encode(&mut w)?; + } + Parser::Swizzle => 30u8.encode(&mut w)?, + Parser::Team => 31u8.encode(&mut w)?, + Parser::ItemSlot => 32u8.encode(&mut w)?, + Parser::ResourceLocation => 33u8.encode(&mut w)?, + Parser::Function => 34u8.encode(&mut w)?, + Parser::EntityAnchor => 35u8.encode(&mut w)?, + Parser::IntRange => 36u8.encode(&mut w)?, + Parser::FloatRange => 37u8.encode(&mut w)?, + Parser::Dimension => 38u8.encode(&mut w)?, + Parser::GameMode => 39u8.encode(&mut w)?, + Parser::Time => 40u8.encode(&mut w)?, + Parser::ResourceOrTag { registry } => { + 41u8.encode(&mut w)?; + registry.encode(&mut w)?; + } + Parser::ResourceOrTagKey { registry } => { + 42u8.encode(&mut w)?; + registry.encode(&mut w)?; + } + Parser::Resource { registry } => { + 43u8.encode(&mut w)?; + registry.encode(&mut w)?; + } + Parser::ResourceKey { registry } => { + 44u8.encode(&mut w)?; + registry.encode(&mut w)?; + } + Parser::TemplateMirror => 45u8.encode(&mut w)?, + Parser::TemplateRotation => 46u8.encode(&mut w)?, + Parser::Uuid => 47u8.encode(&mut w)?, + } + + Ok(()) + } +} + +impl DecodeBytes for Parser { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + fn decode_min_max(r: &mut Bytes) -> anyhow::Result<(Option, Option)> { + let flags = u8::decode_bytes(r)?; + + let min = if flags & 0x1 != 0 { + Some(T::decode_bytes(r)?) + } else { + None + }; + + let max = if flags & 0x2 != 0 { + Some(T::decode_bytes(r)?) + } else { + None + }; + + Ok((min, max)) + } + + Ok(match u8::decode_bytes(r)? { + 0 => Self::Bool, + 1 => { + let (min, max) = decode_min_max(r)?; + Self::Float { min, max } + } + 2 => { + let (min, max) = decode_min_max(r)?; + Self::Double { min, max } + } + 3 => { + let (min, max) = decode_min_max(r)?; + Self::Integer { min, max } + } + 4 => { + let (min, max) = decode_min_max(r)?; + Self::Long { min, max } + } + 5 => Self::String(StringArg::decode_bytes(r)?), + 6 => { + let flags = u8::decode_bytes(r)?; + Self::Entity { + single: flags & 0x1 != 0, + only_players: flags & 0x2 != 0, + } + } + 7 => Self::GameProfile, + 8 => Self::BlockPos, + 9 => Self::ColumnPos, + 10 => Self::Vec3, + 11 => Self::Vec2, + 12 => Self::BlockState, + 13 => Self::BlockPredicate, + 14 => Self::ItemStack, + 15 => Self::ItemPredicate, + 16 => Self::Color, + 17 => Self::Component, + 18 => Self::Message, + 19 => Self::NbtCompoundTag, + 20 => Self::NbtTag, + 21 => Self::NbtPath, + 22 => Self::Objective, + 23 => Self::ObjectiveCriteria, + 24 => Self::Operation, + 25 => Self::Particle, + 26 => Self::Angle, + 27 => Self::Rotation, + 28 => Self::ScoreboardSlot, + 29 => Self::ScoreHolder { + allow_multiple: bool::decode_bytes(r)?, + }, + 30 => Self::Swizzle, + 31 => Self::Team, + 32 => Self::ItemSlot, + 33 => Self::ResourceLocation, + 34 => Self::Function, + 35 => Self::EntityAnchor, + 36 => Self::IntRange, + 37 => Self::FloatRange, + 38 => Self::Dimension, + 39 => Self::GameMode, + 40 => Self::Time, + 41 => Self::ResourceOrTag { + registry: Ident::decode_bytes(r)?, + }, + 42 => Self::ResourceOrTagKey { + registry: Ident::decode_bytes(r)?, + }, + 43 => Self::Resource { + registry: Ident::decode_bytes(r)?, + }, + 44 => Self::ResourceKey { + registry: Ident::decode_bytes(r)?, + }, + 45 => Self::TemplateMirror, + 46 => Self::TemplateRotation, + 47 => Self::Uuid, + n => bail!("unknown command parser ID of {n}"), + }) + } +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/cooldown_update_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/cooldown_update_s2c.rs new file mode 100644 index 00000000..36dd3bb3 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/cooldown_update_s2c.rs @@ -0,0 +1,7 @@ +use crate::{Decode, DecodeBytesAuto, Encode, ItemKind, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct CooldownUpdateS2c { + pub item_id: ItemKind, + pub cooldown_ticks: VarInt, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/craft_failed_response_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/craft_failed_response_s2c.rs new file mode 100644 index 00000000..421af0ac --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/craft_failed_response_s2c.rs @@ -0,0 +1,9 @@ +use valence_ident::Ident; + +use crate::{DecodeBytes, Encode, Packet}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct CraftFailedResponseS2c { + pub window_id: u8, + pub recipe: Ident, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/craft_request_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/craft_request_c2s.rs new file mode 100644 index 00000000..8da40ac4 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/craft_request_c2s.rs @@ -0,0 +1,10 @@ +use valence_ident::Ident; + +use crate::{DecodeBytes, Encode, Packet}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct CraftRequestC2s { + pub window_id: i8, + pub recipe: Ident, + pub make_all: bool, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/creative_inventory_action_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/creative_inventory_action_c2s.rs new file mode 100644 index 00000000..8ebac359 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/creative_inventory_action_c2s.rs @@ -0,0 +1,7 @@ +use crate::{Decode, DecodeBytesAuto, Encode, ItemStack, Packet}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct CreativeInventoryActionC2s { + pub slot: i16, + pub clicked_item: ItemStack, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/custom_payload_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/custom_payload_c2s.rs new file mode 100644 index 00000000..7b0bc902 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/custom_payload_c2s.rs @@ -0,0 +1,11 @@ +use valence_ident::Ident; + +use crate::{Bounded, DecodeBytes, Encode, Packet, RawBytes}; + +pub const MAX_PAYLOAD_SIZE: usize = 32767; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct CustomPayloadC2s<'a> { + pub channel: Ident, + pub data: Bounded, MAX_PAYLOAD_SIZE>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/custom_payload_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/custom_payload_s2c.rs new file mode 100644 index 00000000..2961d534 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/custom_payload_s2c.rs @@ -0,0 +1,11 @@ +use valence_ident::Ident; + +use crate::{Bounded, DecodeBytes, Encode, Packet, RawBytes}; + +const MAX_PAYLOAD_SIZE: usize = 0x100000; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct CustomPayloadS2c<'a> { + pub channel: Ident, + pub data: Bounded, MAX_PAYLOAD_SIZE>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/damage_tilt_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/damage_tilt_s2c.rs new file mode 100644 index 00000000..cbbf540c --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/damage_tilt_s2c.rs @@ -0,0 +1,9 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct DamageTiltS2c { + /// The ID of the entity taking damage. + pub entity_id: VarInt, + /// The direction the damage is coming from in relation to the entity. + pub yaw: f32, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/death_message_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/death_message_s2c.rs new file mode 100644 index 00000000..95bfd3d4 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/death_message_s2c.rs @@ -0,0 +1,11 @@ +use std::borrow::Cow; + +use valence_text::Text; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct DeathMessageS2c<'a> { + pub player_id: VarInt, + pub message: Cow<'a, Text>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/difficulty_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/difficulty_s2c.rs new file mode 100644 index 00000000..61eb1682 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/difficulty_s2c.rs @@ -0,0 +1,7 @@ +use crate::{Decode, DecodeBytesAuto, Difficulty, Encode, Packet}; + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct DifficultyS2c { + pub difficulty: Difficulty, + pub locked: bool, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/disconnect_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/disconnect_s2c.rs new file mode 100644 index 00000000..2e966664 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/disconnect_s2c.rs @@ -0,0 +1,11 @@ +use std::borrow::Cow; + +use valence_text::Text; + +use crate::{packet_id, Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +#[packet(id = packet_id::DISCONNECT_S2C)] +pub struct DisconnectS2c<'a> { + pub reason: Cow<'a, Text>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/end_combat_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/end_combat_s2c.rs new file mode 100644 index 00000000..3a70daf3 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/end_combat_s2c.rs @@ -0,0 +1,7 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +/// Unused by notchian clients. +#[derive(Copy, Clone, PartialEq, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct EndCombatS2c { + pub duration: VarInt, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/enter_combat_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/enter_combat_s2c.rs new file mode 100644 index 00000000..82f53330 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/enter_combat_s2c.rs @@ -0,0 +1,5 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +/// Unused by notchian clients. +#[derive(Copy, Clone, PartialEq, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct EnterCombatS2c; diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/entities_destroy_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/entities_destroy_s2c.rs new file mode 100644 index 00000000..bf33b88a --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/entities_destroy_s2c.rs @@ -0,0 +1,8 @@ +use std::borrow::Cow; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Clone, PartialEq, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct EntitiesDestroyS2c<'a> { + pub entity_ids: Cow<'a, [VarInt]>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/entity_animation_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/entity_animation_s2c.rs new file mode 100644 index 00000000..6fc5fbf1 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/entity_animation_s2c.rs @@ -0,0 +1,7 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct EntityAnimationS2c { + pub entity_id: VarInt, + pub animation: u8, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/entity_attach_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/entity_attach_s2c.rs new file mode 100644 index 00000000..0c1d45c1 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/entity_attach_s2c.rs @@ -0,0 +1,7 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct EntityAttachS2c { + pub attached_entity_id: i32, + pub holding_entity_id: i32, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/entity_attributes_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/entity_attributes_s2c.rs new file mode 100644 index 00000000..53a0c6a7 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/entity_attributes_s2c.rs @@ -0,0 +1,24 @@ +use uuid::Uuid; +use valence_ident::Ident; + +use crate::{Decode, DecodeBytes, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct EntityAttributesS2c { + pub entity_id: VarInt, + pub properties: Vec, +} + +#[derive(Clone, PartialEq, Debug, Encode, DecodeBytes)] +pub struct AttributeProperty { + pub key: Ident, + pub value: f64, + pub modifiers: Vec, +} + +#[derive(Clone, PartialEq, Debug, Encode, Decode, DecodeBytesAuto)] +pub struct AttributeModifier { + pub uuid: Uuid, + pub amount: f64, + pub operation: u8, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/entity_damage_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/entity_damage_s2c.rs new file mode 100644 index 00000000..3158b8e0 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/entity_damage_s2c.rs @@ -0,0 +1,24 @@ +use valence_math::DVec3; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct EntityDamageS2c { + /// The ID of the entity taking damage + pub entity_id: VarInt, + /// The ID of the type of damage taken + pub source_type_id: VarInt, + /// The ID + 1 of the entity responsible for the damage, if present. If not + /// present, the value is 0 + pub source_cause_id: VarInt, + /// The ID + 1 of the entity that directly dealt the damage, if present. If + /// not present, the value is 0. If this field is present: + /// * and damage was dealt indirectly, such as by the use of a projectile, + /// this field will contain the ID of such projectile; + /// * and damage was dealt directly, such as by manually attacking, this + /// field will contain the same value as Source Cause ID. + pub source_direct_id: VarInt, + /// The Notchian server sends the Source Position when the damage was dealt + /// by the /damage command and a position was specified + pub source_pos: Option, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/entity_equipment_update_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/entity_equipment_update_s2c.rs new file mode 100644 index 00000000..b3172c33 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/entity_equipment_update_s2c.rs @@ -0,0 +1,58 @@ +use std::io::Write; + +use crate::{Decode, DecodeBytesAuto, Encode, ItemStack, Packet, VarInt}; + +#[derive(Clone, PartialEq, Debug, Packet, DecodeBytesAuto)] +pub struct EntityEquipmentUpdateS2c { + pub entity_id: VarInt, + pub equipment: Vec, +} + +#[derive(Clone, PartialEq, Debug, Encode, Decode, DecodeBytesAuto)] +pub struct EquipmentEntry { + pub slot: i8, + pub item: ItemStack, +} + +impl Encode for EntityEquipmentUpdateS2c { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + self.entity_id.encode(&mut w)?; + + for i in 0..self.equipment.len() { + let slot = self.equipment[i].slot; + if i != self.equipment.len() - 1 { + (slot | -128).encode(&mut w)?; + } else { + slot.encode(&mut w)?; + } + self.equipment[i].item.encode(&mut w)?; + } + + Ok(()) + } +} + +impl Decode for EntityEquipmentUpdateS2c { + fn decode(r: &mut &[u8]) -> anyhow::Result { + let entity_id = VarInt::decode(r)?; + + let mut equipment = vec![]; + + loop { + let slot = i8::decode(r)?; + let item = ItemStack::decode(r)?; + equipment.push(EquipmentEntry { + slot: slot & 127, + item, + }); + if slot & -128 == 0 { + break; + } + } + + Ok(Self { + entity_id, + equipment, + }) + } +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/entity_passengers_set_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/entity_passengers_set_s2c.rs new file mode 100644 index 00000000..4bf22d94 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/entity_passengers_set_s2c.rs @@ -0,0 +1,10 @@ +use std::borrow::Cow; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct EntityPassengersSetS2c<'a> { + /// Vehicle's entity id + pub entity_id: VarInt, + pub passengers: Cow<'a, [VarInt]>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/entity_position_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/entity_position_s2c.rs new file mode 100644 index 00000000..8c834326 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/entity_position_s2c.rs @@ -0,0 +1,12 @@ +use valence_math::DVec3; + +use crate::{ByteAngle, Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct EntityPositionS2c { + pub entity_id: VarInt, + pub position: DVec3, + pub yaw: ByteAngle, + pub pitch: ByteAngle, + pub on_ground: bool, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/entity_set_head_yaw_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/entity_set_head_yaw_s2c.rs new file mode 100644 index 00000000..16e35816 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/entity_set_head_yaw_s2c.rs @@ -0,0 +1,7 @@ +use crate::{ByteAngle, Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct EntitySetHeadYawS2c { + pub entity_id: VarInt, + pub head_yaw: ByteAngle, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/entity_spawn_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/entity_spawn_s2c.rs new file mode 100644 index 00000000..836a5530 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/entity_spawn_s2c.rs @@ -0,0 +1,20 @@ +use uuid::Uuid; +use valence_math::DVec3; + +use crate::{ByteAngle, Decode, DecodeBytesAuto, Encode, Packet, VarInt, Velocity}; + +/// Sent by the server when a vehicle or other non-living entity is created. +/// +/// wiki : [Spawn Entity](https://wiki.vg/Protocol#Spawn_Experience_Orb) +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct EntitySpawnS2c { + pub entity_id: VarInt, + pub object_uuid: Uuid, + pub kind: VarInt, // TODO: EntityKind in valence_generated? + pub position: DVec3, + pub pitch: ByteAngle, + pub yaw: ByteAngle, + pub head_yaw: ByteAngle, + pub data: VarInt, + pub velocity: Velocity, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/entity_status_effect_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/entity_status_effect_s2c.rs new file mode 100644 index 00000000..6a5f1081 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/entity_status_effect_s2c.rs @@ -0,0 +1,24 @@ +use bitfield_struct::bitfield; +use valence_nbt::Compound; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct EntityStatusEffectS2c { + pub entity_id: VarInt, + pub effect_id: VarInt, // TODO: effect ID registry. + pub amplifier: u8, + pub duration: VarInt, + pub flags: Flags, + pub factor_codec: Option, +} + +#[bitfield(u8)] +#[derive(PartialEq, Eq, Encode, Decode, DecodeBytesAuto)] +pub struct Flags { + pub is_ambient: bool, + pub show_particles: bool, + pub show_icon: bool, + #[bits(5)] + _pad: u8, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/entity_status_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/entity_status_s2c.rs new file mode 100644 index 00000000..efd15718 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/entity_status_s2c.rs @@ -0,0 +1,7 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct EntityStatusS2c { + pub entity_id: i32, + pub entity_status: u8, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/entity_tracker_update_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/entity_tracker_update_s2c.rs new file mode 100644 index 00000000..12f7de4e --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/entity_tracker_update_s2c.rs @@ -0,0 +1,7 @@ +use crate::{DecodeBytes, Encode, Packet, RawBytes, VarInt}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct EntityTrackerUpdateS2c<'a> { + pub entity_id: VarInt, + pub tracked_values: RawBytes<'a>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/entity_velocity_update_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/entity_velocity_update_s2c.rs new file mode 100644 index 00000000..e8005433 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/entity_velocity_update_s2c.rs @@ -0,0 +1,7 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt, Velocity}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct EntityVelocityUpdateS2c { + pub entity_id: VarInt, + pub velocity: Velocity, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/experience_bar_update_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/experience_bar_update_s2c.rs new file mode 100644 index 00000000..14de7405 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/experience_bar_update_s2c.rs @@ -0,0 +1,8 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct ExperienceBarUpdateS2c { + pub bar: f32, + pub level: VarInt, + pub total_xp: VarInt, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/experience_orb_spawn_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/experience_orb_spawn_s2c.rs new file mode 100644 index 00000000..1e615b58 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/experience_orb_spawn_s2c.rs @@ -0,0 +1,14 @@ +use valence_math::DVec3; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +/// Spawns one or more experience orbs. +/// +/// wiki : [Spawn Experience Orb](https://wiki.vg/Protocol#Spawn_Experience_Orb) +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct ExperienceOrbSpawnS2c { + pub entity_id: VarInt, + pub position: DVec3, + /// The amount of experience this orb will reward once collected. + pub count: i16, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/explosion_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/explosion_s2c.rs new file mode 100644 index 00000000..c9405443 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/explosion_s2c.rs @@ -0,0 +1,13 @@ +use std::borrow::Cow; + +use valence_math::{DVec3, Vec3}; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct ExplosionS2c<'a> { + pub pos: DVec3, + pub strength: f32, + pub affected_blocks: Cow<'a, [[i8; 3]]>, + pub player_motion: Vec3, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/features_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/features_s2c.rs new file mode 100644 index 00000000..5d95dac3 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/features_s2c.rs @@ -0,0 +1,11 @@ +use std::borrow::Cow; +use std::collections::BTreeSet; + +use valence_ident::Ident; + +use crate::{DecodeBytes, Encode, Packet}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct FeaturesS2c<'a> { + pub features: Cow<'a, BTreeSet>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/full_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/full_c2s.rs new file mode 100644 index 00000000..a6fd7adb --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/full_c2s.rs @@ -0,0 +1,12 @@ +use valence_math::DVec3; + +use crate::{packet_id, Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +#[packet(id = packet_id::FULL)] +pub struct FullC2s { + pub position: DVec3, + pub yaw: f32, + pub pitch: f32, + pub on_ground: bool, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/game_join_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/game_join_s2c.rs new file mode 100644 index 00000000..86665b6a --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/game_join_s2c.rs @@ -0,0 +1,30 @@ +use std::borrow::Cow; +use std::collections::BTreeSet; + +use valence_ident::Ident; +use valence_nbt::Compound; + +use crate::game_mode::OptGameMode; +use crate::{DecodeBytes, Encode, GameMode, GlobalPos, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct GameJoinS2c<'a> { + pub entity_id: i32, + pub is_hardcore: bool, + pub game_mode: GameMode, + pub previous_game_mode: OptGameMode, + pub dimension_names: Cow<'a, BTreeSet>, + pub registry_codec: Cow<'a, Compound>, + pub dimension_type_name: Ident, + pub dimension_name: Ident, + pub hashed_seed: i64, + pub max_players: VarInt, + pub view_distance: VarInt, + pub simulation_distance: VarInt, + pub reduced_debug_info: bool, + pub enable_respawn_screen: bool, + pub is_debug: bool, + pub is_flat: bool, + pub last_death_location: Option, + pub portal_cooldown: VarInt, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/game_message_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/game_message_s2c.rs new file mode 100644 index 00000000..faf49d66 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/game_message_s2c.rs @@ -0,0 +1,12 @@ +use std::borrow::Cow; + +use valence_text::Text; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct GameMessageS2c<'a> { + pub chat: Cow<'a, Text>, + /// Whether the message is in the actionbar or the chat. + pub overlay: bool, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/game_state_change_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/game_state_change_s2c.rs new file mode 100644 index 00000000..68321363 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/game_state_change_s2c.rs @@ -0,0 +1,23 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct GameStateChangeS2c { + pub kind: GameEventKind, + pub value: f32, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto)] +pub enum GameEventKind { + NoRespawnBlockAvailable, + EndRaining, + BeginRaining, + ChangeGameMode, + WinGame, + DemoEvent, + ArrowHitPlayer, + RainLevelChange, + ThunderLevelChange, + PlayPufferfishStingSound, + PlayElderGuardianMobAppearance, + EnableRespawnScreen, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/hand_swing_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/hand_swing_c2s.rs new file mode 100644 index 00000000..0bc08c96 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/hand_swing_c2s.rs @@ -0,0 +1,6 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Hand, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct HandSwingC2s { + pub hand: Hand, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/health_update_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/health_update_s2c.rs new file mode 100644 index 00000000..1e416dfa --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/health_update_s2c.rs @@ -0,0 +1,8 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct HealthUpdateS2c { + pub health: f32, + pub food: VarInt, + pub food_saturation: f32, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/inventory_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/inventory_s2c.rs new file mode 100644 index 00000000..9eb899d3 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/inventory_s2c.rs @@ -0,0 +1,11 @@ +use std::borrow::Cow; + +use crate::{Decode, DecodeBytesAuto, Encode, ItemStack, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct InventoryS2c<'a> { + pub window_id: u8, + pub state_id: VarInt, + pub slots: Cow<'a, [ItemStack]>, + pub carried_item: Cow<'a, ItemStack>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/item_pickup_animation_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/item_pickup_animation_s2c.rs new file mode 100644 index 00000000..b3de113a --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/item_pickup_animation_s2c.rs @@ -0,0 +1,8 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct ItemPickupAnimationS2c { + pub collected_entity_id: VarInt, + pub collector_entity_id: VarInt, + pub pickup_item_count: VarInt, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/jigsaw_generating_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/jigsaw_generating_c2s.rs new file mode 100644 index 00000000..eb2c88e2 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/jigsaw_generating_c2s.rs @@ -0,0 +1,8 @@ +use crate::{BlockPos, Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct JigsawGeneratingC2s { + pub position: BlockPos, + pub levels: VarInt, + pub keep_jigsaws: bool, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/keep_alive_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/keep_alive_c2s.rs new file mode 100644 index 00000000..3bf810de --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/keep_alive_c2s.rs @@ -0,0 +1,6 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct KeepAliveC2s { + pub id: u64, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/keep_alive_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/keep_alive_s2c.rs new file mode 100644 index 00000000..62385307 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/keep_alive_s2c.rs @@ -0,0 +1,6 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct KeepAliveS2c { + pub id: u64, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/light_update_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/light_update_s2c.rs new file mode 100644 index 00000000..902c2af7 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/light_update_s2c.rs @@ -0,0 +1,16 @@ +use std::borrow::Cow; + +use crate::array::FixedArray; +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct LightUpdateS2c<'a> { + pub chunk_x: VarInt, + pub chunk_z: VarInt, + pub sky_light_mask: Cow<'a, [u64]>, + pub block_light_mask: Cow<'a, [u64]>, + pub empty_sky_light_mask: Cow<'a, [u64]>, + pub empty_block_light_mask: Cow<'a, [u64]>, + pub sky_light_arrays: Cow<'a, [FixedArray]>, + pub block_light_arrays: Cow<'a, [FixedArray]>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/look_and_on_ground_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/look_and_on_ground_c2s.rs new file mode 100644 index 00000000..d5e98a58 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/look_and_on_ground_c2s.rs @@ -0,0 +1,9 @@ +use crate::{packet_id, Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +#[packet(id = packet_id::LOOK_AND_ON_GROUND)] +pub struct LookAndOnGroundC2s { + pub yaw: f32, + pub pitch: f32, + pub on_ground: bool, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/look_at_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/look_at_s2c.rs new file mode 100644 index 00000000..960673da --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/look_at_s2c.rs @@ -0,0 +1,23 @@ +use valence_math::DVec3; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +/// Instructs a client to face an entity. +#[derive(Copy, Clone, PartialEq, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct LookAtS2c { + pub feet_or_eyes: FeetOrEyes, + pub target_position: DVec3, + pub entity_to_face: Option, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto)] +pub enum FeetOrEyes { + Feet, + Eyes, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto)] +pub struct LookAtEntity { + pub entity_id: VarInt, + pub feet_or_eyes: FeetOrEyes, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/map_update_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/map_update_s2c.rs new file mode 100644 index 00000000..f7a4da02 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/map_update_s2c.rs @@ -0,0 +1,114 @@ +use std::borrow::Cow; +use std::io::Write; + +use valence_bytes::{Bytes, CowBytes}; +use valence_text::Text; + +use crate::{Decode, DecodeBytes, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Clone, PartialEq, Debug, Packet)] +pub struct MapUpdateS2c<'a> { + pub map_id: VarInt, + pub scale: i8, + pub locked: bool, + pub icons: Option>>, + pub data: Option>, +} + +#[derive(Clone, PartialEq, Debug, Encode, Decode, DecodeBytesAuto)] +pub struct Icon<'a> { + pub icon_type: IconType, + /// In map coordinates; -128 for furthest left, +127 for furthest right + pub position: [i8; 2], + /// 0 is a vertical icon and increments by 22.5° + pub direction: i8, + pub display_name: Option>, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto)] +pub enum IconType { + WhiteArrow, + GreenArrow, + RedArrow, + BlueArrow, + WhiteCross, + RedPointer, + WhiteCircle, + SmallWhiteCircle, + Mansion, + Temple, + WhiteBanner, + OrangeBanner, + MagentaBanner, + LightBlueBanner, + YellowBanner, + LimeBanner, + PinkBanner, + GrayBanner, + LightGrayBanner, + CyanBanner, + PurpleBanner, + BlueBanner, + BrownBanner, + GreenBanner, + RedBanner, + BlackBanner, + TreasureMarker, +} + +#[derive(Clone, PartialEq, Eq, Debug, Encode)] +pub struct Data<'a> { + pub columns: u8, + pub rows: u8, + pub position: [i8; 2], + pub data: CowBytes<'a>, +} + +impl Encode for MapUpdateS2c<'_> { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + self.map_id.encode(&mut w)?; + self.scale.encode(&mut w)?; + self.locked.encode(&mut w)?; + self.icons.encode(&mut w)?; + + match &self.data { + None => 0u8.encode(&mut w)?, + Some(data) => data.encode(&mut w)?, + } + + Ok(()) + } +} + +impl<'a> DecodeBytes for MapUpdateS2c<'a> { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + let map_id = VarInt::decode_bytes(r)?; + let scale = i8::decode_bytes(r)?; + let locked = bool::decode_bytes(r)?; + let icons = >>>::decode_bytes(r)?; + let columns = u8::decode_bytes(r)?; + + let data = if columns > 0 { + let rows = u8::decode_bytes(r)?; + let position = <[i8; 2]>::decode_bytes(r)?; + let data = CowBytes::decode_bytes(r)?; + + Some(Data { + columns, + rows, + position, + data, + }) + } else { + None + }; + + Ok(Self { + map_id, + scale, + locked, + icons, + data, + }) + } +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/message_acknowledgment_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/message_acknowledgment_c2s.rs new file mode 100644 index 00000000..b8a4ccb6 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/message_acknowledgment_c2s.rs @@ -0,0 +1,6 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct MessageAcknowledgmentC2s { + pub message_count: VarInt, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/move_relative_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/move_relative_s2c.rs new file mode 100644 index 00000000..a6c31b13 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/move_relative_s2c.rs @@ -0,0 +1,9 @@ +use crate::{packet_id, Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +#[packet(id = packet_id::MOVE_RELATIVE)] +pub struct MoveRelativeS2c { + pub entity_id: VarInt, + pub delta: [i16; 3], + pub on_ground: bool, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/nbt_query_response_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/nbt_query_response_s2c.rs new file mode 100644 index 00000000..f8276d77 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/nbt_query_response_s2c.rs @@ -0,0 +1,9 @@ +use valence_nbt::Compound; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct NbtQueryResponseS2c { + pub transaction_id: VarInt, + pub nbt: Compound, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/on_ground_only_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/on_ground_only_c2s.rs new file mode 100644 index 00000000..705c2486 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/on_ground_only_c2s.rs @@ -0,0 +1,7 @@ +use crate::{packet_id, Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +#[packet(id = packet_id::ON_GROUND_ONLY)] +pub struct OnGroundOnlyC2s { + pub on_ground: bool, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/open_horse_screen_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/open_horse_screen_s2c.rs new file mode 100644 index 00000000..736e787f --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/open_horse_screen_s2c.rs @@ -0,0 +1,8 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct OpenHorseScreenS2c { + pub window_id: u8, + pub slot_count: VarInt, + pub entity_id: i32, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/open_screen_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/open_screen_s2c.rs new file mode 100644 index 00000000..2b481395 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/open_screen_s2c.rs @@ -0,0 +1,40 @@ +use std::borrow::Cow; + +use valence_text::Text; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct OpenScreenS2c<'a> { + pub window_id: VarInt, + pub window_type: WindowType, + pub window_title: Cow<'a, Text>, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto)] +pub enum WindowType { + Generic9x1, + Generic9x2, + Generic9x3, + Generic9x4, + Generic9x5, + Generic9x6, + Generic3x3, + Anvil, + Beacon, + BlastFurnace, + BrewingStand, + Crafting, + Enchantment, + Furnace, + Grindstone, + Hopper, + Lectern, + Loom, + Merchant, + ShulkerBox, + Smithing, + Smoker, + Cartography, + Stonecutter, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/open_written_book_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/open_written_book_s2c.rs new file mode 100644 index 00000000..b983f32b --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/open_written_book_s2c.rs @@ -0,0 +1,6 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Hand, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct OpenWrittenBookS2c { + pub hand: Hand, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/overlay_message_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/overlay_message_s2c.rs new file mode 100644 index 00000000..53251e7f --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/overlay_message_s2c.rs @@ -0,0 +1,10 @@ +use std::borrow::Cow; + +use valence_text::Text; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct OverlayMessageS2c<'a> { + pub action_bar_text: Cow<'a, Text>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/particle_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/particle_s2c.rs new file mode 100644 index 00000000..6477bf9c --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/particle_s2c.rs @@ -0,0 +1,441 @@ +use std::borrow::Cow; +use std::io::Write; + +use anyhow::bail; +use valence_generated::block::BlockState; +use valence_math::{DVec3, Vec3}; + +use crate::{decode_str, BlockPos, Decode, DecodeBytesAuto, Encode, ItemStack, Packet, VarInt}; + +#[derive(Clone, Debug, Packet, DecodeBytesAuto)] +pub struct ParticleS2c<'a> { + pub particle: Cow<'a, Particle>, + pub long_distance: bool, + pub position: DVec3, + pub offset: Vec3, + pub max_speed: f32, + pub count: i32, +} + +impl Encode for ParticleS2c<'_> { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + VarInt(self.particle.id()).encode(&mut w)?; + self.long_distance.encode(&mut w)?; + self.position.encode(&mut w)?; + self.offset.encode(&mut w)?; + self.max_speed.encode(&mut w)?; + self.count.encode(&mut w)?; + + self.particle.as_ref().encode(w) + } +} + +impl<'a> Decode for ParticleS2c<'a> { + fn decode(r: &mut &[u8]) -> anyhow::Result { + let particle_id = VarInt::decode(r)?.0; + let long_distance = bool::decode(r)?; + let position = Decode::decode(r)?; + let offset = Decode::decode(r)?; + let max_speed = f32::decode(r)?; + let particle_count = i32::decode(r)?; + + Ok(Self { + particle: Cow::Owned(Particle::decode_with_id(particle_id, r)?), + long_distance, + position, + offset, + max_speed, + count: particle_count, + }) + } +} + +#[derive(Clone, PartialEq, Debug)] +pub enum Particle { + AmbientEntityEffect, + AngryVillager, + Block(BlockState), + BlockMarker(BlockState), + Bubble, + Cloud, + Crit, + DamageIndicator, + DragonBreath, + DrippingLava, + FallingLava, + LandingLava, + DrippingWater, + FallingWater, + Dust { + rgb: Vec3, + scale: f32, + }, + DustColorTransition { + from_rgb: Vec3, + scale: f32, + to_rgb: Vec3, + }, + Effect, + ElderGuardian, + EnchantedHit, + Enchant, + EndRod, + EntityEffect, + ExplosionEmitter, + Explosion, + SonicBoom, + FallingDust(BlockState), + Firework, + Fishing, + Flame, + CherryLeaves, + SculkSoul, + SculkCharge { + roll: f32, + }, + SculkChargePop, + SoulFireFlame, + Soul, + Flash, + HappyVillager, + Composter, + Heart, + InstantEffect, + Item(ItemStack), + /// The 'Block' variant of the 'Vibration' particle + VibrationBlock { + block_pos: BlockPos, + ticks: i32, + }, + /// The 'Entity' variant of the 'Vibration' particle + VibrationEntity { + entity_id: i32, + entity_eye_height: f32, + ticks: i32, + }, + ItemSlime, + ItemSnowball, + LargeSmoke, + Lava, + Mycelium, + Note, + Poof, + Portal, + Rain, + Smoke, + Sneeze, + Spit, + SquidInk, + SweepAttack, + TotemOfUndying, + Underwater, + Splash, + Witch, + BubblePop, + CurrentDown, + BubbleColumnUp, + Nautilus, + Dolphin, + CampfireCosySmoke, + CampfireSignalSmoke, + DrippingHoney, + FallingHoney, + LandingHoney, + FallingNectar, + FallingSporeBlossom, + Ash, + CrimsonSpore, + WarpedSpore, + SporeBlossomAir, + DrippingObsidianTear, + FallingObsidianTear, + LandingObsidianTear, + ReversePortal, + WhiteAsh, + SmallFlame, + Snowflake, + DrippingDripstoneLava, + FallingDripstoneLava, + DrippingDripstoneWater, + FallingDripstoneWater, + GlowSquidInk, + Glow, + WaxOn, + WaxOff, + ElectricSpark, + Scrape, + Shriek { + delay: i32, + }, + EggCrack, +} + +impl Particle { + pub const fn id(&self) -> i32 { + match self { + Particle::AmbientEntityEffect => 0, + Particle::AngryVillager => 1, + Particle::Block(_) => 2, + Particle::BlockMarker(_) => 3, + Particle::Bubble => 4, + Particle::Cloud => 5, + Particle::Crit => 6, + Particle::DamageIndicator => 7, + Particle::DragonBreath => 8, + Particle::DrippingLava => 9, + Particle::FallingLava => 10, + Particle::LandingLava => 11, + Particle::DrippingWater => 12, + Particle::FallingWater => 13, + Particle::Dust { .. } => 14, + Particle::DustColorTransition { .. } => 15, + Particle::Effect => 16, + Particle::ElderGuardian => 17, + Particle::EnchantedHit => 18, + Particle::Enchant => 19, + Particle::EndRod => 20, + Particle::EntityEffect => 21, + Particle::ExplosionEmitter => 22, + Particle::Explosion => 23, + Particle::SonicBoom => 24, + Particle::FallingDust(_) => 25, + Particle::Firework => 26, + Particle::Fishing => 27, + Particle::Flame => 28, + Particle::CherryLeaves => 29, + Particle::SculkSoul => 30, + Particle::SculkCharge { .. } => 31, + Particle::SculkChargePop => 32, + Particle::SoulFireFlame => 33, + Particle::Soul => 34, + Particle::Flash => 35, + Particle::HappyVillager => 36, + Particle::Composter => 37, + Particle::Heart => 38, + Particle::InstantEffect => 39, + Particle::Item { .. } => 40, + Particle::VibrationBlock { .. } => 41, + Particle::VibrationEntity { .. } => 41, + Particle::ItemSlime => 42, + Particle::ItemSnowball => 43, + Particle::LargeSmoke => 44, + Particle::Lava => 45, + Particle::Mycelium => 46, + Particle::Note => 47, + Particle::Poof => 48, + Particle::Portal => 49, + Particle::Rain => 50, + Particle::Smoke => 51, + Particle::Sneeze => 52, + Particle::Spit => 53, + Particle::SquidInk => 54, + Particle::SweepAttack => 55, + Particle::TotemOfUndying => 56, + Particle::Underwater => 57, + Particle::Splash => 58, + Particle::Witch => 59, + Particle::BubblePop => 60, + Particle::CurrentDown => 61, + Particle::BubbleColumnUp => 62, + Particle::Nautilus => 63, + Particle::Dolphin => 64, + Particle::CampfireCosySmoke => 65, + Particle::CampfireSignalSmoke => 66, + Particle::DrippingHoney => 67, + Particle::FallingHoney => 68, + Particle::LandingHoney => 69, + Particle::FallingNectar => 70, + Particle::FallingSporeBlossom => 71, + Particle::Ash => 72, + Particle::CrimsonSpore => 73, + Particle::WarpedSpore => 74, + Particle::SporeBlossomAir => 75, + Particle::DrippingObsidianTear => 76, + Particle::FallingObsidianTear => 77, + Particle::LandingObsidianTear => 78, + Particle::ReversePortal => 79, + Particle::WhiteAsh => 80, + Particle::SmallFlame => 81, + Particle::Snowflake => 82, + Particle::DrippingDripstoneLava => 83, + Particle::FallingDripstoneLava => 84, + Particle::DrippingDripstoneWater => 85, + Particle::FallingDripstoneWater => 86, + Particle::GlowSquidInk => 87, + Particle::Glow => 88, + Particle::WaxOn => 89, + Particle::WaxOff => 80, + Particle::ElectricSpark => 91, + Particle::Scrape => 92, + Particle::Shriek { .. } => 93, + Particle::EggCrack => 94, + } + } + + /// Decodes the particle assuming the given particle ID. + pub fn decode_with_id(particle_id: i32, r: &mut &[u8]) -> anyhow::Result { + Ok(match particle_id { + 0 => Particle::AmbientEntityEffect, + 1 => Particle::AngryVillager, + 2 => Particle::Block(BlockState::decode(r)?), + 3 => Particle::BlockMarker(BlockState::decode(r)?), + 4 => Particle::Bubble, + 5 => Particle::Cloud, + 6 => Particle::Crit, + 7 => Particle::DamageIndicator, + 8 => Particle::DragonBreath, + 9 => Particle::DrippingLava, + 10 => Particle::FallingLava, + 11 => Particle::LandingLava, + 12 => Particle::DrippingWater, + 13 => Particle::FallingWater, + 14 => Particle::Dust { + rgb: Decode::decode(r)?, + scale: Decode::decode(r)?, + }, + 15 => Particle::DustColorTransition { + from_rgb: Decode::decode(r)?, + scale: Decode::decode(r)?, + to_rgb: Decode::decode(r)?, + }, + 16 => Particle::Effect, + 17 => Particle::ElderGuardian, + 18 => Particle::EnchantedHit, + 19 => Particle::Enchant, + 20 => Particle::EndRod, + 21 => Particle::EntityEffect, + 22 => Particle::ExplosionEmitter, + 23 => Particle::Explosion, + 24 => Particle::SonicBoom, + 25 => Particle::FallingDust(BlockState::decode(r)?), + 26 => Particle::Firework, + 27 => Particle::Fishing, + 28 => Particle::Flame, + 29 => Particle::CherryLeaves, + 30 => Particle::SculkSoul, + 31 => Particle::SculkCharge { + roll: f32::decode(r)?, + }, + 32 => Particle::SculkChargePop, + 33 => Particle::SoulFireFlame, + 34 => Particle::Soul, + 35 => Particle::Flash, + 36 => Particle::HappyVillager, + 37 => Particle::Composter, + 38 => Particle::Heart, + 39 => Particle::InstantEffect, + 40 => Particle::Item(Decode::decode(r)?), + 41 => match decode_str(r)? { + "block" => Particle::VibrationBlock { + block_pos: BlockPos::decode(r)?, + ticks: VarInt::decode(r)?.0, + }, + "entity" => Particle::VibrationEntity { + entity_id: VarInt::decode(r)?.0, + entity_eye_height: f32::decode(r)?, + ticks: VarInt::decode(r)?.0, + }, + invalid => bail!("invalid vibration position source of \"{invalid}\""), + }, + 42 => Particle::ItemSlime, + 43 => Particle::ItemSnowball, + 44 => Particle::LargeSmoke, + 45 => Particle::Lava, + 46 => Particle::Mycelium, + 47 => Particle::Note, + 48 => Particle::Poof, + 49 => Particle::Portal, + 50 => Particle::Rain, + 51 => Particle::Smoke, + 52 => Particle::Sneeze, + 53 => Particle::Spit, + 54 => Particle::SquidInk, + 55 => Particle::SweepAttack, + 56 => Particle::TotemOfUndying, + 57 => Particle::Underwater, + 58 => Particle::Splash, + 59 => Particle::Witch, + 60 => Particle::BubblePop, + 61 => Particle::CurrentDown, + 62 => Particle::BubbleColumnUp, + 63 => Particle::Nautilus, + 64 => Particle::Dolphin, + 65 => Particle::CampfireCosySmoke, + 66 => Particle::CampfireSignalSmoke, + 67 => Particle::DrippingHoney, + 68 => Particle::FallingHoney, + 69 => Particle::LandingHoney, + 70 => Particle::FallingNectar, + 71 => Particle::FallingSporeBlossom, + 72 => Particle::Ash, + 73 => Particle::CrimsonSpore, + 74 => Particle::WarpedSpore, + 75 => Particle::SporeBlossomAir, + 76 => Particle::DrippingObsidianTear, + 77 => Particle::FallingObsidianTear, + 78 => Particle::LandingObsidianTear, + 79 => Particle::ReversePortal, + 80 => Particle::WhiteAsh, + 81 => Particle::SmallFlame, + 82 => Particle::Snowflake, + 83 => Particle::DrippingDripstoneLava, + 84 => Particle::FallingDripstoneLava, + 85 => Particle::DrippingDripstoneWater, + 86 => Particle::FallingDripstoneWater, + 87 => Particle::GlowSquidInk, + 88 => Particle::Glow, + 89 => Particle::WaxOn, + 90 => Particle::WaxOff, + 91 => Particle::ElectricSpark, + 92 => Particle::Scrape, + 93 => Particle::Shriek { + delay: VarInt::decode(r)?.0, + }, + 94 => Particle::EggCrack, + id => bail!("invalid particle ID of {id}"), + }) + } +} + +/// Encodes the particle without an ID. +impl Encode for Particle { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + match self { + Particle::Block(block_state) => block_state.encode(w), + Particle::BlockMarker(block_state) => block_state.encode(w), + Particle::Dust { rgb, scale } => { + rgb.encode(&mut w)?; + scale.encode(w) + } + Particle::DustColorTransition { + from_rgb, + scale, + to_rgb, + } => { + from_rgb.encode(&mut w)?; + scale.encode(&mut w)?; + to_rgb.encode(w) + } + Particle::FallingDust(block_state) => block_state.encode(w), + Particle::SculkCharge { roll } => roll.encode(w), + Particle::Item(stack) => stack.encode(w), + Particle::VibrationBlock { block_pos, ticks } => { + "block".encode(&mut w)?; + block_pos.encode(&mut w)?; + VarInt(*ticks).encode(w) + } + Particle::VibrationEntity { + entity_id, + entity_eye_height, + ticks, + } => { + "entity".encode(&mut w)?; + VarInt(*entity_id).encode(&mut w)?; + entity_eye_height.encode(&mut w)?; + VarInt(*ticks).encode(w) + } + Particle::Shriek { delay } => VarInt(*delay).encode(w), + _ => Ok(()), + } + } +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/pick_from_inventory_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/pick_from_inventory_c2s.rs new file mode 100644 index 00000000..55c0ce88 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/pick_from_inventory_c2s.rs @@ -0,0 +1,6 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct PickFromInventoryC2s { + pub slot_to_use: VarInt, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/play_ping_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/play_ping_s2c.rs new file mode 100644 index 00000000..8fdf0a35 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/play_ping_s2c.rs @@ -0,0 +1,6 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct PlayPingS2c { + pub id: i32, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/play_pong_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/play_pong_c2s.rs new file mode 100644 index 00000000..4aea25a7 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/play_pong_c2s.rs @@ -0,0 +1,6 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct PlayPongC2s { + pub id: i32, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/play_sound_from_entity_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/play_sound_from_entity_s2c.rs new file mode 100644 index 00000000..aa46e34e --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/play_sound_from_entity_s2c.rs @@ -0,0 +1,12 @@ +use crate::sound::SoundCategory; +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct PlaySoundFromEntityS2c { + pub id: VarInt, + pub category: SoundCategory, + pub entity_id: VarInt, + pub volume: f32, + pub pitch: f32, + pub seed: i64, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/play_sound_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/play_sound_s2c.rs new file mode 100644 index 00000000..9e3ac92a --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/play_sound_s2c.rs @@ -0,0 +1,14 @@ +use valence_math::IVec3; + +use crate::sound::{SoundCategory, SoundId}; +use crate::{DecodeBytes, Encode, Packet}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct PlaySoundS2c { + pub id: SoundId, + pub category: SoundCategory, + pub position: IVec3, + pub volume: f32, + pub pitch: f32, + pub seed: i64, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/player_abilities_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/player_abilities_s2c.rs new file mode 100644 index 00000000..9b8f255d --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/player_abilities_s2c.rs @@ -0,0 +1,22 @@ +use bevy_ecs::prelude::Component; +use bitfield_struct::bitfield; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct PlayerAbilitiesS2c { + pub flags: PlayerAbilitiesFlags, + pub flying_speed: f32, + pub fov_modifier: f32, +} + +#[bitfield(u8)] +#[derive(PartialEq, Eq, Encode, Decode, DecodeBytesAuto, Component)] +pub struct PlayerAbilitiesFlags { + pub invulnerable: bool, + pub flying: bool, + pub allow_flying: bool, + pub instant_break: bool, + #[bits(4)] + _pad: u8, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/player_action_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/player_action_c2s.rs new file mode 100644 index 00000000..264bad67 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/player_action_c2s.rs @@ -0,0 +1,20 @@ +use crate::{BlockPos, Decode, DecodeBytesAuto, Direction, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct PlayerActionC2s { + pub action: PlayerAction, + pub position: BlockPos, + pub direction: Direction, + pub sequence: VarInt, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto)] +pub enum PlayerAction { + StartDestroyBlock, + AbortDestroyBlock, + StopDestroyBlock, + DropAllItems, + DropItem, + ReleaseUseItem, + SwapItemWithOffhand, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/player_action_response_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/player_action_response_s2c.rs new file mode 100644 index 00000000..7b1dd781 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/player_action_response_s2c.rs @@ -0,0 +1,6 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct PlayerActionResponseS2c { + pub sequence: VarInt, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/player_input_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/player_input_c2s.rs new file mode 100644 index 00000000..e0e0a3e8 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/player_input_c2s.rs @@ -0,0 +1,19 @@ +use bitfield_struct::bitfield; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct PlayerInputC2s { + pub sideways: f32, + pub forward: f32, + pub flags: PlayerInputFlags, +} + +#[bitfield(u8)] +#[derive(PartialEq, Eq, Encode, Decode, DecodeBytesAuto)] +pub struct PlayerInputFlags { + pub jump: bool, + pub unmount: bool, + #[bits(6)] + _pad: u8, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/player_interact_block_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/player_interact_block_c2s.rs new file mode 100644 index 00000000..546b4496 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/player_interact_block_c2s.rs @@ -0,0 +1,13 @@ +use valence_math::Vec3; + +use crate::{BlockPos, Decode, DecodeBytesAuto, Direction, Encode, Hand, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct PlayerInteractBlockC2s { + pub hand: Hand, + pub position: BlockPos, + pub face: Direction, + pub cursor_pos: Vec3, + pub head_inside_block: bool, + pub sequence: VarInt, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/player_interact_entity_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/player_interact_entity_c2s.rs new file mode 100644 index 00000000..4733bbf9 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/player_interact_entity_c2s.rs @@ -0,0 +1,17 @@ +use valence_math::Vec3; + +use crate::{Decode, DecodeBytesAuto, Encode, Hand, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct PlayerInteractEntityC2s { + pub entity_id: VarInt, + pub interact: EntityInteraction, + pub sneaking: bool, +} + +#[derive(Copy, Clone, PartialEq, Debug, Encode, Decode, DecodeBytesAuto)] +pub enum EntityInteraction { + Interact(Hand), + Attack, + InteractAt { target: Vec3, hand: Hand }, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/player_interact_item_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/player_interact_item_c2s.rs new file mode 100644 index 00000000..e63fb3c6 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/player_interact_item_c2s.rs @@ -0,0 +1,7 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Hand, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct PlayerInteractItemC2s { + pub hand: Hand, + pub sequence: VarInt, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/player_list_header_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/player_list_header_s2c.rs new file mode 100644 index 00000000..19c4d047 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/player_list_header_s2c.rs @@ -0,0 +1,11 @@ +use std::borrow::Cow; + +use valence_text::Text; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct PlayerListHeaderS2c<'a> { + pub header: Cow<'a, Text>, + pub footer: Cow<'a, Text>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/player_list_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/player_list_s2c.rs new file mode 100644 index 00000000..58ea19c9 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/player_list_s2c.rs @@ -0,0 +1,136 @@ +use std::borrow::Cow; +use std::io::Write; + +use bitfield_struct::bitfield; +use uuid::Uuid; +use valence_bytes::{Bytes, CowBytes, CowUtf8Bytes}; +use valence_text::Text; + +use crate::profile::Property; +use crate::{DecodeBytes, Encode, GameMode, Packet, VarInt}; + +#[derive(Clone, Debug, Packet)] +pub struct PlayerListS2c<'a> { + pub actions: PlayerListActions, + pub entries: Cow<'a, [PlayerListEntry<'a>]>, +} + +impl<'a> Encode for PlayerListS2c<'a> { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + self.actions.0.encode(&mut w)?; + + // Write number of entries. + VarInt(self.entries.len() as i32).encode(&mut w)?; + + for entry in self.entries.as_ref() { + entry.player_uuid.encode(&mut w)?; + + if self.actions.add_player() { + entry.username.encode(&mut w)?; + entry.properties.encode(&mut w)?; + } + + if self.actions.initialize_chat() { + entry.chat_data.encode(&mut w)?; + } + + if self.actions.update_game_mode() { + entry.game_mode.encode(&mut w)?; + } + + if self.actions.update_listed() { + entry.listed.encode(&mut w)?; + } + + if self.actions.update_latency() { + VarInt(entry.ping).encode(&mut w)?; + } + + if self.actions.update_display_name() { + entry.display_name.encode(&mut w)?; + } + } + + Ok(()) + } +} + +impl<'a> DecodeBytes for PlayerListS2c<'a> { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + let actions = PlayerListActions(u8::decode_bytes(r)?); + + let mut entries = vec![]; + + for _ in 0..VarInt::decode_bytes(r)?.0 { + let mut entry = PlayerListEntry { + player_uuid: Uuid::decode_bytes(r)?, + ..Default::default() + }; + + if actions.add_player() { + entry.username = DecodeBytes::decode_bytes(r)?; + entry.properties = DecodeBytes::decode_bytes(r)?; + } + + if actions.initialize_chat() { + entry.chat_data = DecodeBytes::decode_bytes(r)?; + } + + if actions.update_game_mode() { + entry.game_mode = DecodeBytes::decode_bytes(r)?; + } + + if actions.update_listed() { + entry.listed = DecodeBytes::decode_bytes(r)?; + } + + if actions.update_latency() { + entry.ping = VarInt::decode_bytes(r)?.0; + } + + if actions.update_display_name() { + entry.display_name = DecodeBytes::decode_bytes(r)?; + } + + entries.push(entry); + } + + Ok(Self { + actions, + entries: entries.into(), + }) + } +} + +#[bitfield(u8)] +pub struct PlayerListActions { + pub add_player: bool, + pub initialize_chat: bool, + pub update_game_mode: bool, + pub update_listed: bool, + pub update_latency: bool, + pub update_display_name: bool, + #[bits(2)] + _pad: u8, +} + +#[derive(Clone, Default, Debug)] +pub struct PlayerListEntry<'a> { + pub player_uuid: Uuid, + pub username: CowUtf8Bytes<'a>, + pub properties: Cow<'a, [Property]>, + pub chat_data: Option>, + pub listed: bool, + pub ping: i32, + pub game_mode: GameMode, + pub display_name: Option>, +} + +#[derive(Clone, PartialEq, Debug, Encode, DecodeBytes)] +pub struct ChatData<'a> { + pub session_id: Uuid, + /// Unix timestamp in milliseconds. + pub key_expiry_time: i64, + pub public_key: CowBytes<'a>, + pub public_key_signature: CowBytes<'a>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/player_position_look_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/player_position_look_s2c.rs new file mode 100644 index 00000000..76c84a0c --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/player_position_look_s2c.rs @@ -0,0 +1,25 @@ +use bitfield_struct::bitfield; +use valence_math::DVec3; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, PartialEq, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct PlayerPositionLookS2c { + pub position: DVec3, + pub yaw: f32, + pub pitch: f32, + pub flags: PlayerPositionLookFlags, + pub teleport_id: VarInt, +} + +#[bitfield(u8)] +#[derive(PartialEq, Eq, Encode, Decode, DecodeBytesAuto)] +pub struct PlayerPositionLookFlags { + pub x: bool, + pub y: bool, + pub z: bool, + pub y_rot: bool, + pub x_rot: bool, + #[bits(3)] + _pad: u8, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/player_remove_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/player_remove_s2c.rs new file mode 100644 index 00000000..cf12943a --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/player_remove_s2c.rs @@ -0,0 +1,10 @@ +use std::borrow::Cow; + +use uuid::Uuid; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Clone, PartialEq, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct PlayerRemoveS2c<'a> { + pub uuids: Cow<'a, [Uuid]>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/player_respawn_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/player_respawn_s2c.rs new file mode 100644 index 00000000..1bea98bb --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/player_respawn_s2c.rs @@ -0,0 +1,18 @@ +use valence_ident::Ident; + +use crate::game_mode::OptGameMode; +use crate::{DecodeBytes, Encode, GameMode, GlobalPos, Packet, VarInt}; + +#[derive(Clone, PartialEq, Debug, Encode, DecodeBytes, Packet)] +pub struct PlayerRespawnS2c { + pub dimension_type_name: Ident, + pub dimension_name: Ident, + pub hashed_seed: u64, + pub game_mode: GameMode, + pub previous_game_mode: OptGameMode, + pub is_debug: bool, + pub is_flat: bool, + pub copy_metadata: bool, + pub last_death_location: Option, + pub portal_cooldown: VarInt, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/player_session_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/player_session_c2s.rs new file mode 100644 index 00000000..98b9d666 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/player_session_c2s.rs @@ -0,0 +1,13 @@ +use uuid::Uuid; +use valence_bytes::CowBytes; + +use crate::{Bounded, DecodeBytes, Encode, Packet}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct PlayerSessionC2s<'a> { + pub session_id: Uuid, + // Public key + pub expires_at: i64, + pub public_key_data: Bounded, 512>, + pub key_signature: Bounded, 4096>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/player_spawn_position_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/player_spawn_position_s2c.rs new file mode 100644 index 00000000..172a6a49 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/player_spawn_position_s2c.rs @@ -0,0 +1,7 @@ +use crate::{BlockPos, Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct PlayerSpawnPositionS2c { + pub position: BlockPos, + pub angle: f32, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/player_spawn_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/player_spawn_s2c.rs new file mode 100644 index 00000000..e826b23a --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/player_spawn_s2c.rs @@ -0,0 +1,27 @@ +use uuid::Uuid; +use valence_math::DVec3; + +use crate::{ByteAngle, Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +/// This packet is sent by the server when a player comes into visible range, +/// not when a player joins. +/// +/// This packet must be sent after the Player Info Update packet that adds the +/// player data for the client to use when spawning a player. If the Player Info +/// for the player spawned by this packet is not present when this packet +/// arrives, Notchian clients will not spawn the player entity. The Player Info +/// packet includes skin/cape data. +/// +/// Servers can, however, safely spawn player entities for players not in +/// visible range. The client appears to handle it correctly. +/// +/// wiki : [Spawn Player](https://wiki.vg/Protocol#Spawn_Player) +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct PlayerSpawnS2c { + /// A unique integer ID mostly used in the protocol to identify the player. + pub entity_id: VarInt, + pub player_uuid: Uuid, + pub position: DVec3, + pub yaw: ByteAngle, + pub pitch: ByteAngle, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/position_and_on_ground_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/position_and_on_ground_c2s.rs new file mode 100644 index 00000000..cc7b9f44 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/position_and_on_ground_c2s.rs @@ -0,0 +1,10 @@ +use valence_math::DVec3; + +use crate::{packet_id, Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +#[packet(id = packet_id::POSITION_AND_ON_GROUND)] +pub struct PositionAndOnGroundC2s { + pub position: DVec3, + pub on_ground: bool, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/profileless_chat_message_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/profileless_chat_message_s2c.rs new file mode 100644 index 00000000..829f2542 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/profileless_chat_message_s2c.rs @@ -0,0 +1,13 @@ +use std::borrow::Cow; + +use valence_text::Text; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct ProfilelessChatMessageS2c<'a> { + pub message: Cow<'a, Text>, + pub chat_type: VarInt, + pub chat_type_name: Cow<'a, Text>, + pub target_name: Option>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/query_block_nbt_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/query_block_nbt_c2s.rs new file mode 100644 index 00000000..8ea1be98 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/query_block_nbt_c2s.rs @@ -0,0 +1,7 @@ +use crate::{BlockPos, Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct QueryBlockNbtC2s { + pub transaction_id: VarInt, + pub position: BlockPos, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/query_entity_nbt_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/query_entity_nbt_c2s.rs new file mode 100644 index 00000000..89a033fe --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/query_entity_nbt_c2s.rs @@ -0,0 +1,7 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct QueryEntityNbtC2s { + pub transaction_id: VarInt, + pub entity_id: VarInt, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/recipe_book_data_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/recipe_book_data_c2s.rs new file mode 100644 index 00000000..5b627017 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/recipe_book_data_c2s.rs @@ -0,0 +1,8 @@ +use valence_ident::Ident; + +use crate::{DecodeBytes, Encode, Packet}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct RecipeBookDataC2s { + pub recipe_id: Ident, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/recipe_category_options_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/recipe_category_options_c2s.rs new file mode 100644 index 00000000..f19c5bdb --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/recipe_category_options_c2s.rs @@ -0,0 +1,16 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct RecipeCategoryOptionsC2s { + pub book_id: RecipeBookId, + pub book_open: bool, + pub filter_active: bool, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto)] +pub enum RecipeBookId { + Crafting, + Furnace, + BlastFurnace, + Smoker, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/remove_entity_status_effect_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/remove_entity_status_effect_s2c.rs new file mode 100644 index 00000000..31f13b9f --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/remove_entity_status_effect_s2c.rs @@ -0,0 +1,7 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Clone, PartialEq, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct RemoveEntityStatusEffectS2c { + pub entity_id: VarInt, + pub effect_id: VarInt, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/remove_message_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/remove_message_s2c.rs new file mode 100644 index 00000000..6e94e6c3 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/remove_message_s2c.rs @@ -0,0 +1,7 @@ +use super::chat_message_s2c::MessageSignature; +use crate::{DecodeBytes, Encode, Packet}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct RemoveMessageS2c<'a> { + pub signature: MessageSignature<'a>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/rename_item_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/rename_item_c2s.rs new file mode 100644 index 00000000..54490945 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/rename_item_c2s.rs @@ -0,0 +1,9 @@ +use valence_bytes::CowUtf8Bytes; + +use crate::{DecodeBytes, Encode, Packet}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct RenameItemC2s<'a> { + // Surprisingly, this is not bounded as of 1.20.1. + pub item_name: CowUtf8Bytes<'a>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/request_command_completions_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/request_command_completions_c2s.rs new file mode 100644 index 00000000..6ad1956a --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/request_command_completions_c2s.rs @@ -0,0 +1,9 @@ +use valence_bytes::CowUtf8Bytes; + +use crate::{Bounded, DecodeBytes, Encode, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct RequestCommandCompletionsC2s<'a> { + pub transaction_id: VarInt, + pub text: Bounded, 32500>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/resource_pack_send_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/resource_pack_send_s2c.rs new file mode 100644 index 00000000..15defb87 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/resource_pack_send_s2c.rs @@ -0,0 +1,14 @@ +use std::borrow::Cow; + +use valence_bytes::CowUtf8Bytes; +use valence_text::Text; + +use crate::{Bounded, DecodeBytes, Encode, Packet}; + +#[derive(Clone, PartialEq, Debug, Encode, DecodeBytes, Packet)] +pub struct ResourcePackSendS2c<'a> { + pub url: CowUtf8Bytes<'a>, + pub hash: Bounded, 40>, + pub forced: bool, + pub prompt_message: Option>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/resource_pack_status_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/resource_pack_status_c2s.rs new file mode 100644 index 00000000..6c23d3f3 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/resource_pack_status_c2s.rs @@ -0,0 +1,13 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub enum ResourcePackStatusC2s { + /// The client has successfully loaded the server's resource pack. + SuccessfullyLoaded, + /// The client has declined the server's resource pack. + Declined, + /// The client has failed to download the server's resource pack. + FailedDownload, + /// The client has accepted the server's resource pack. + Accepted, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/rotate_and_move_relative_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/rotate_and_move_relative_s2c.rs new file mode 100644 index 00000000..53dc0898 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/rotate_and_move_relative_s2c.rs @@ -0,0 +1,11 @@ +use crate::{packet_id, ByteAngle, Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +#[packet(id = packet_id::ROTATE_AND_MOVE_RELATIVE)] +pub struct RotateAndMoveRelativeS2c { + pub entity_id: VarInt, + pub delta: [i16; 3], + pub yaw: ByteAngle, + pub pitch: ByteAngle, + pub on_ground: bool, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/rotate_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/rotate_s2c.rs new file mode 100644 index 00000000..e223f98d --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/rotate_s2c.rs @@ -0,0 +1,10 @@ +use crate::{packet_id, ByteAngle, Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +#[packet(id = packet_id::ROTATE)] +pub struct RotateS2c { + pub entity_id: VarInt, + pub yaw: ByteAngle, + pub pitch: ByteAngle, + pub on_ground: bool, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/scoreboard_display_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/scoreboard_display_s2c.rs new file mode 100644 index 00000000..f684acd9 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/scoreboard_display_s2c.rs @@ -0,0 +1,83 @@ +use bevy_ecs::prelude::Component; +use valence_bytes::CowUtf8Bytes; + +use super::team_s2c::TeamColor; +use crate::{Decode, DecodeBytes, DecodeBytesAuto, Encode, Packet}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct ScoreboardDisplayS2c<'a> { + pub position: ScoreboardPosition, + pub score_name: CowUtf8Bytes<'a>, +} + +/// Defines where a scoreboard is displayed. +#[derive(Copy, Clone, PartialEq, Eq, Debug, Component, Default, DecodeBytesAuto)] +pub enum ScoreboardPosition { + /// Display the scoreboard in the player list (the one you see when you + /// press tab), as a yellow number next to players' names. + List, + /// Display the scoreboard on the sidebar. + #[default] + Sidebar, + /// Display the scoreboard below players' name tags in the world. + BelowName, + /// Display the scoreboard on the sidebar, visible only to one team. + SidebarTeam(TeamColor), +} + +impl Encode for ScoreboardPosition { + fn encode(&self, w: impl std::io::Write) -> anyhow::Result<()> { + match self { + ScoreboardPosition::List => 0u8.encode(w), + ScoreboardPosition::Sidebar => 1u8.encode(w), + ScoreboardPosition::BelowName => 2u8.encode(w), + ScoreboardPosition::SidebarTeam(TeamColor::Black) => 3u8.encode(w), + ScoreboardPosition::SidebarTeam(TeamColor::DarkBlue) => 4u8.encode(w), + ScoreboardPosition::SidebarTeam(TeamColor::DarkGreen) => 5u8.encode(w), + ScoreboardPosition::SidebarTeam(TeamColor::DarkCyan) => 6u8.encode(w), + ScoreboardPosition::SidebarTeam(TeamColor::DarkRed) => 7u8.encode(w), + ScoreboardPosition::SidebarTeam(TeamColor::Purple) => 8u8.encode(w), + ScoreboardPosition::SidebarTeam(TeamColor::Gold) => 9u8.encode(w), + ScoreboardPosition::SidebarTeam(TeamColor::Gray) => 10u8.encode(w), + ScoreboardPosition::SidebarTeam(TeamColor::DarkGray) => 11u8.encode(w), + ScoreboardPosition::SidebarTeam(TeamColor::Blue) => 12u8.encode(w), + ScoreboardPosition::SidebarTeam(TeamColor::BrightGreen) => 13u8.encode(w), + ScoreboardPosition::SidebarTeam(TeamColor::Cyan) => 14u8.encode(w), + ScoreboardPosition::SidebarTeam(TeamColor::Red) => 15u8.encode(w), + ScoreboardPosition::SidebarTeam(TeamColor::Pink) => 16u8.encode(w), + ScoreboardPosition::SidebarTeam(TeamColor::Yellow) => 17u8.encode(w), + ScoreboardPosition::SidebarTeam(TeamColor::White) => 18u8.encode(w), + ScoreboardPosition::SidebarTeam(_) => { + Err(anyhow::anyhow!("Invalid scoreboard display position")) + } + } + } +} + +impl Decode for ScoreboardPosition { + fn decode(r: &mut &[u8]) -> anyhow::Result { + let value = u8::decode(r)?; + match value { + 0 => Ok(ScoreboardPosition::List), + 1 => Ok(ScoreboardPosition::Sidebar), + 2 => Ok(ScoreboardPosition::BelowName), + 3 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::Black)), + 4 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::DarkBlue)), + 5 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::DarkGreen)), + 6 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::DarkCyan)), + 7 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::DarkRed)), + 8 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::Purple)), + 9 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::Gold)), + 10 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::Gray)), + 11 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::DarkGray)), + 12 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::Blue)), + 13 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::BrightGreen)), + 14 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::Cyan)), + 15 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::Red)), + 16 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::Pink)), + 17 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::Yellow)), + 18 => Ok(ScoreboardPosition::SidebarTeam(TeamColor::White)), + _ => Err(anyhow::anyhow!("Invalid scoreboard display position")), + } + } +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/scoreboard_objective_update_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/scoreboard_objective_update_s2c.rs new file mode 100644 index 00000000..3192b10b --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/scoreboard_objective_update_s2c.rs @@ -0,0 +1,37 @@ +use std::borrow::Cow; + +use bevy_ecs::prelude::*; +use valence_bytes::CowUtf8Bytes; +use valence_text::Text; + +use crate::{Decode, DecodeBytes, DecodeBytesAuto, Encode, Packet}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct ScoreboardObjectiveUpdateS2c<'a> { + pub objective_name: CowUtf8Bytes<'a>, + pub mode: ObjectiveMode<'a>, +} + +#[derive(Clone, PartialEq, Debug, Encode, Decode, DecodeBytesAuto)] +pub enum ObjectiveMode<'a> { + Create { + objective_display_name: Cow<'a, Text>, + render_type: ObjectiveRenderType, + }, + Remove, + Update { + objective_display_name: Cow<'a, Text>, + render_type: ObjectiveRenderType, + }, +} + +#[derive( + Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto, Component, Default, +)] +pub enum ObjectiveRenderType { + /// Display the value as a number. + #[default] + Integer, + /// Display the value as hearts. + Hearts, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/scoreboard_player_update_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/scoreboard_player_update_s2c.rs new file mode 100644 index 00000000..9e889af4 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/scoreboard_player_update_s2c.rs @@ -0,0 +1,20 @@ +use valence_bytes::CowUtf8Bytes; + +use crate::{DecodeBytes, Encode, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct ScoreboardPlayerUpdateS2c<'a> { + pub entity_name: CowUtf8Bytes<'a>, + pub action: ScoreboardPlayerUpdateAction<'a>, +} + +#[derive(Clone, PartialEq, Debug, Encode, DecodeBytes)] +pub enum ScoreboardPlayerUpdateAction<'a> { + Update { + objective_name: CowUtf8Bytes<'a>, + objective_score: VarInt, + }, + Remove { + objective_name: CowUtf8Bytes<'a>, + }, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/screen_handler_property_update_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/screen_handler_property_update_s2c.rs new file mode 100644 index 00000000..ae258385 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/screen_handler_property_update_s2c.rs @@ -0,0 +1,8 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct ScreenHandlerPropertyUpdateS2c { + pub window_id: u8, + pub property: i16, + pub value: i16, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/screen_handler_slot_update_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/screen_handler_slot_update_s2c.rs new file mode 100644 index 00000000..e23bab6b --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/screen_handler_slot_update_s2c.rs @@ -0,0 +1,11 @@ +use std::borrow::Cow; + +use crate::{Decode, DecodeBytesAuto, Encode, ItemStack, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct ScreenHandlerSlotUpdateS2c<'a> { + pub window_id: i8, + pub state_id: VarInt, + pub slot_idx: i16, + pub slot_data: Cow<'a, ItemStack>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/select_advancement_tab_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/select_advancement_tab_s2c.rs new file mode 100644 index 00000000..b95a5fc6 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/select_advancement_tab_s2c.rs @@ -0,0 +1,8 @@ +use valence_ident::Ident; + +use crate::{DecodeBytes, Encode, Packet}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct SelectAdvancementTabS2c { + pub identifier: Option, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/select_merchant_trade_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/select_merchant_trade_c2s.rs new file mode 100644 index 00000000..6b13087a --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/select_merchant_trade_c2s.rs @@ -0,0 +1,6 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct SelectMerchantTradeC2s { + pub selected_slot: VarInt, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/server_metadata_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/server_metadata_s2c.rs new file mode 100644 index 00000000..b6af121a --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/server_metadata_s2c.rs @@ -0,0 +1,13 @@ +use std::borrow::Cow; + +use valence_bytes::CowBytes; +use valence_text::Text; + +use crate::{DecodeBytes, Encode, Packet}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct ServerMetadataS2c<'a> { + pub motd: Cow<'a, Text>, + pub icon: Option>, + pub enforce_secure_chat: bool, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/set_camera_entity_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/set_camera_entity_s2c.rs new file mode 100644 index 00000000..58e47e43 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/set_camera_entity_s2c.rs @@ -0,0 +1,6 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct SetCameraEntityS2c { + pub entity_id: VarInt, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/set_trade_offers_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/set_trade_offers_s2c.rs new file mode 100644 index 00000000..63ae0d64 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/set_trade_offers_s2c.rs @@ -0,0 +1,25 @@ +use crate::{Decode, DecodeBytesAuto, Encode, ItemStack, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct SetTradeOffersS2c { + pub window_id: VarInt, + pub trades: Vec, + pub villager_level: VarInt, + pub experience: VarInt, + pub is_regular_villager: bool, + pub can_restock: bool, +} + +#[derive(Clone, PartialEq, Debug, Encode, Decode, DecodeBytesAuto)] +pub struct TradeOffer { + pub input_one: ItemStack, + pub output_item: ItemStack, + pub input_two: ItemStack, + pub trade_disabled: bool, + pub number_of_trade_uses: i32, + pub max_trade_uses: i32, + pub xp: i32, + pub special_price: i32, + pub price_multiplier: f32, + pub demand: i32, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/sign_editor_open_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/sign_editor_open_s2c.rs new file mode 100644 index 00000000..f2998bf2 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/sign_editor_open_s2c.rs @@ -0,0 +1,6 @@ +use crate::{BlockPos, Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct SignEditorOpenS2c { + pub location: BlockPos, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/simulation_distance_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/simulation_distance_s2c.rs new file mode 100644 index 00000000..45cae024 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/simulation_distance_s2c.rs @@ -0,0 +1,6 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct SimulationDistanceS2c { + pub simulation_distance: VarInt, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/spectator_teleport_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/spectator_teleport_c2s.rs new file mode 100644 index 00000000..ec795700 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/spectator_teleport_c2s.rs @@ -0,0 +1,8 @@ +use uuid::Uuid; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct SpectatorTeleportC2s { + pub target: Uuid, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/statistics_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/statistics_s2c.rs new file mode 100644 index 00000000..ebbc0438 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/statistics_s2c.rs @@ -0,0 +1,13 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct StatisticsS2c { + pub statistics: Vec, +} + +#[derive(Copy, Clone, PartialEq, Debug, Encode, Decode, DecodeBytesAuto)] +pub struct Statistic { + pub category_id: VarInt, + pub statistic_id: VarInt, + pub value: VarInt, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/stop_sound_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/stop_sound_s2c.rs new file mode 100644 index 00000000..10194b59 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/stop_sound_s2c.rs @@ -0,0 +1,52 @@ +use std::io::Write; + +use valence_bytes::Bytes; +use valence_ident::Ident; + +use crate::sound::SoundCategory; +use crate::{DecodeBytes, Encode, Packet}; + +#[derive(Clone, PartialEq, Debug, Packet)] +pub struct StopSoundS2c { + pub source: Option, + pub sound: Option, +} + +impl Encode for StopSoundS2c { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + match (self.source, self.sound.as_ref()) { + (Some(source), Some(sound)) => { + 3i8.encode(&mut w)?; + source.encode(&mut w)?; + sound.encode(&mut w)?; + } + (None, Some(sound)) => { + 2i8.encode(&mut w)?; + sound.encode(&mut w)?; + } + (Some(source), None) => { + 1i8.encode(&mut w)?; + source.encode(&mut w)?; + } + _ => 0i8.encode(&mut w)?, + } + + Ok(()) + } +} + +impl DecodeBytes for StopSoundS2c { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + let (source, sound) = match i8::decode_bytes(r)? { + 3 => ( + Some(SoundCategory::decode_bytes(r)?), + Some(Ident::decode_bytes(r)?), + ), + 2 => (None, Some(::decode_bytes(r)?)), + 1 => (Some(SoundCategory::decode_bytes(r)?), None), + _ => (None, None), + }; + + Ok(Self { source, sound }) + } +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/subtitle_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/subtitle_s2c.rs new file mode 100644 index 00000000..e09a977e --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/subtitle_s2c.rs @@ -0,0 +1,10 @@ +use std::borrow::Cow; + +use valence_text::Text; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct SubtitleS2c<'a> { + pub subtitle_text: Cow<'a, Text>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/synchronize_recipes_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/synchronize_recipes_s2c.rs new file mode 100644 index 00000000..c65296d5 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/synchronize_recipes_s2c.rs @@ -0,0 +1,107 @@ +use std::borrow::Cow; +use std::io::Write; + +use anyhow::ensure; +use valence_bytes::CowUtf8Bytes; +use valence_ident::Ident; + +use crate::{Decode, DecodeBytes, DecodeBytesAuto, Encode, ItemStack, Packet, RawBytes}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct SynchronizeRecipesS2c<'a> { + // TODO: this should be a Vec> + pub recipes: RawBytes<'a>, +} + +#[derive(Clone, Debug, Encode)] +pub struct Recipe<'a> { + pub kind: Ident, + pub recipe_id: Ident, + pub data: RecipeData<'a>, +} + +#[derive(Clone, Debug, Encode)] +pub enum RecipeData<'a> { + CraftingShapeless(CraftingShapedData<'a>), + // TODO: fill in the rest. + CraftingShaped, + CraftingSpecialArmordye, + CraftingSpecialBookcloning, + CraftingSpecialMapcloning, + CraftingSpecialMapextending, + CraftingSpecialFireworkRocket, + CraftingSpecialFireworkStar, + CraftingSpecialFireworkStarFade, + CraftingSpecialRepairitem, + CraftingSpecialTippedarrow, + CraftingSpecialBannerduplicate, + CraftingSpecialShielddecoration, + CraftingSpecialShulkerboxcoloring, + CraftingSpecialSuspiciousStew, + CraftingDecoratedPot, + Smelting, + Blasting, + Smoking, + CampfireCooking, + Stonecutting, + SmithingTransform, + SmithingTrim, +} + +#[derive(Clone, Debug)] +pub struct CraftingShapedData<'a> { + pub width: u32, + pub height: u32, + pub group: CowUtf8Bytes<'a>, + pub category: CraftingShapedCategory, + /// Length must be width * height. + pub ingredients: Cow<'a, [Ingredient<'a>]>, + pub result: ItemStack, + pub show_notification: bool, +} + +impl Encode for CraftingShapedData<'_> { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + let Self { + width, + height, + group, + category, + ingredients, + result, + show_notification, + } = self; + + width.encode(&mut w)?; + height.encode(&mut w)?; + group.encode(&mut w)?; + category.encode(&mut w)?; + + let len = width + .checked_mul(*height) + .expect("bad shaped recipe dimensions") as usize; + + ensure!( + len == ingredients.len(), + "number of ingredients in shaped recipe must be equal to width * height" + ); + + for ingr in ingredients.as_ref() { + ingr.encode(&mut w)?; + } + + result.encode(&mut w)?; + + show_notification.encode(w) + } +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto)] +pub enum CraftingShapedCategory { + Building, + Redstone, + Equipment, + Misc, +} + +pub type Ingredient<'a> = Cow<'a, [ItemStack]>; diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/synchronize_tags_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/synchronize_tags_s2c.rs new file mode 100644 index 00000000..aa10a828 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/synchronize_tags_s2c.rs @@ -0,0 +1,13 @@ +use std::borrow::Cow; +use std::collections::BTreeMap; + +use valence_ident::Ident; + +use crate::{DecodeBytes, Encode, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct SynchronizeTagsS2c<'a> { + pub groups: Cow<'a, RegistryMap>, +} + +pub type RegistryMap = BTreeMap>>; diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/team_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/team_s2c.rs new file mode 100644 index 00000000..39c0c368 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/team_s2c.rs @@ -0,0 +1,233 @@ +use std::borrow::Cow; +use std::io::Write; + +use anyhow::bail; +use bitfield_struct::bitfield; +use valence_bytes::{Bytes, CowUtf8Bytes, Utf8Bytes}; +use valence_text::Text; + +use crate::{Decode, DecodeBytes, DecodeBytesAuto, Encode, Packet}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct TeamS2c<'a> { + pub team_name: CowUtf8Bytes<'a>, + pub mode: Mode<'a>, +} + +#[derive(Clone, PartialEq, Debug)] +pub enum Mode<'a> { + CreateTeam { + team_display_name: Cow<'a, Text>, + friendly_flags: TeamFlags, + name_tag_visibility: NameTagVisibility, + collision_rule: CollisionRule, + team_color: TeamColor, + team_prefix: Cow<'a, Text>, + team_suffix: Cow<'a, Text>, + entities: Vec>, + }, + RemoveTeam, + UpdateTeamInfo { + team_display_name: Cow<'a, Text>, + friendly_flags: TeamFlags, + name_tag_visibility: NameTagVisibility, + collision_rule: CollisionRule, + team_color: TeamColor, + team_prefix: Cow<'a, Text>, + team_suffix: Cow<'a, Text>, + }, + AddEntities { + entities: Vec>, + }, + RemoveEntities { + entities: Vec>, + }, +} + +impl Encode for Mode<'_> { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + match self { + Mode::CreateTeam { + team_display_name, + friendly_flags, + name_tag_visibility, + collision_rule, + team_color, + team_prefix, + team_suffix, + entities, + } => { + 0i8.encode(&mut w)?; + team_display_name.encode(&mut w)?; + friendly_flags.encode(&mut w)?; + match name_tag_visibility { + NameTagVisibility::Always => "always", + NameTagVisibility::Never => "never", + NameTagVisibility::HideForOtherTeams => "hideForOtherTeams", + NameTagVisibility::HideForOwnTeam => "hideForOwnTeam", + } + .encode(&mut w)?; + match collision_rule { + CollisionRule::Always => "always", + CollisionRule::Never => "never", + CollisionRule::PushOtherTeams => "pushOtherTeams", + CollisionRule::PushOwnTeam => "pushOwnTeam", + } + .encode(&mut w)?; + team_color.encode(&mut w)?; + team_prefix.encode(&mut w)?; + team_suffix.encode(&mut w)?; + entities.encode(&mut w)?; + } + Mode::RemoveTeam => 1i8.encode(&mut w)?, + Mode::UpdateTeamInfo { + team_display_name, + friendly_flags, + name_tag_visibility, + collision_rule, + team_color, + team_prefix, + team_suffix, + } => { + 2i8.encode(&mut w)?; + team_display_name.encode(&mut w)?; + friendly_flags.encode(&mut w)?; + match name_tag_visibility { + NameTagVisibility::Always => "always", + NameTagVisibility::Never => "never", + NameTagVisibility::HideForOtherTeams => "hideForOtherTeams", + NameTagVisibility::HideForOwnTeam => "hideForOwnTeam", + } + .encode(&mut w)?; + match collision_rule { + CollisionRule::Always => "always", + CollisionRule::Never => "never", + CollisionRule::PushOtherTeams => "pushOtherTeams", + CollisionRule::PushOwnTeam => "pushOwnTeam", + } + .encode(&mut w)?; + team_color.encode(&mut w)?; + team_prefix.encode(&mut w)?; + team_suffix.encode(&mut w)?; + } + Mode::AddEntities { entities } => { + 3i8.encode(&mut w)?; + entities.encode(&mut w)?; + } + Mode::RemoveEntities { entities } => { + 4i8.encode(&mut w)?; + entities.encode(&mut w)?; + } + } + Ok(()) + } +} + +impl<'a> DecodeBytes for Mode<'a> { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + Ok(match i8::decode_bytes(r)? { + 0 => Self::CreateTeam { + team_display_name: DecodeBytes::decode_bytes(r)?, + friendly_flags: DecodeBytes::decode_bytes(r)?, + name_tag_visibility: match Utf8Bytes::decode_bytes(r)?.as_ref() { + "always" => NameTagVisibility::Always, + "never" => NameTagVisibility::Never, + "hideForOtherTeams" => NameTagVisibility::HideForOtherTeams, + "hideForOwnTeam" => NameTagVisibility::HideForOwnTeam, + other => bail!("unknown name tag visibility type \"{other}\""), + }, + collision_rule: match Utf8Bytes::decode_bytes(r)?.as_ref() { + "always" => CollisionRule::Always, + "never" => CollisionRule::Never, + "pushOtherTeams" => CollisionRule::PushOtherTeams, + "pushOwnTeam" => CollisionRule::PushOwnTeam, + other => bail!("unknown collision rule type \"{other}\""), + }, + team_color: DecodeBytes::decode_bytes(r)?, + team_prefix: DecodeBytes::decode_bytes(r)?, + team_suffix: DecodeBytes::decode_bytes(r)?, + entities: DecodeBytes::decode_bytes(r)?, + }, + 1 => Self::RemoveTeam, + 2 => Self::UpdateTeamInfo { + team_display_name: DecodeBytes::decode_bytes(r)?, + friendly_flags: DecodeBytes::decode_bytes(r)?, + name_tag_visibility: match Utf8Bytes::decode_bytes(r)?.as_ref() { + "always" => NameTagVisibility::Always, + "never" => NameTagVisibility::Never, + "hideForOtherTeams" => NameTagVisibility::HideForOtherTeams, + "hideForOwnTeam" => NameTagVisibility::HideForOwnTeam, + other => bail!("unknown name tag visibility type \"{other}\""), + }, + collision_rule: match Utf8Bytes::decode_bytes(r)?.as_ref() { + "always" => CollisionRule::Always, + "never" => CollisionRule::Never, + "pushOtherTeams" => CollisionRule::PushOtherTeams, + "pushOwnTeam" => CollisionRule::PushOwnTeam, + other => bail!("unknown collision rule type \"{other}\""), + }, + team_color: DecodeBytes::decode_bytes(r)?, + team_prefix: DecodeBytes::decode_bytes(r)?, + team_suffix: DecodeBytes::decode_bytes(r)?, + }, + 3 => Self::AddEntities { + entities: DecodeBytes::decode_bytes(r)?, + }, + 4 => Self::RemoveEntities { + entities: DecodeBytes::decode_bytes(r)?, + }, + n => bail!("unknown update teams action of {n}"), + }) + } +} + +#[bitfield(u8)] +#[derive(PartialEq, Eq, Encode, Decode, DecodeBytesAuto)] +pub struct TeamFlags { + pub friendly_fire: bool, + pub see_invisible_teammates: bool, + #[bits(6)] + _pad: u8, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug)] +pub enum NameTagVisibility { + Always, + Never, + HideForOtherTeams, + HideForOwnTeam, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug)] +pub enum CollisionRule { + Always, + Never, + PushOtherTeams, + PushOwnTeam, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto)] +pub enum TeamColor { + Black, + DarkBlue, + DarkGreen, + DarkCyan, + DarkRed, + Purple, + Gold, + Gray, + DarkGray, + Blue, + BrightGreen, + Cyan, + Red, + Pink, + Yellow, + White, + Obfuscated, + Bold, + Strikethrough, + Underlined, + Italic, + Reset, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/teleport_confirm_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/teleport_confirm_c2s.rs new file mode 100644 index 00000000..1d3c01fa --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/teleport_confirm_c2s.rs @@ -0,0 +1,6 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct TeleportConfirmC2s { + pub teleport_id: VarInt, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/title_fade_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/title_fade_s2c.rs new file mode 100644 index 00000000..f69baf1e --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/title_fade_s2c.rs @@ -0,0 +1,8 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct TitleFadeS2c { + pub fade_in: i32, + pub stay: i32, + pub fade_out: i32, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/title_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/title_s2c.rs new file mode 100644 index 00000000..792866a7 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/title_s2c.rs @@ -0,0 +1,10 @@ +use std::borrow::Cow; + +use valence_text::Text; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct TitleS2c<'a> { + pub title_text: Cow<'a, Text>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/unload_chunk_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/unload_chunk_s2c.rs new file mode 100644 index 00000000..83842bd3 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/unload_chunk_s2c.rs @@ -0,0 +1,6 @@ +use crate::{ChunkPos, Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct UnloadChunkS2c { + pub pos: ChunkPos, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/unlock_recipes_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/unlock_recipes_s2c.rs new file mode 100644 index 00000000..c1527734 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/unlock_recipes_s2c.rs @@ -0,0 +1,70 @@ +use std::io::Write; + +use anyhow::bail; +use valence_bytes::Bytes; +use valence_ident::Ident; + +use crate::{DecodeBytes, Encode, Packet, VarInt}; + +#[derive(Clone, PartialEq, Eq, Debug, Packet)] +pub struct UnlockRecipesS2c { + pub action: UpdateRecipeBookAction, + pub crafting_recipe_book_open: bool, + pub crafting_recipe_book_filter_active: bool, + pub smelting_recipe_book_open: bool, + pub smelting_recipe_book_filter_active: bool, + pub blast_furnace_recipe_book_open: bool, + pub blast_furnace_recipe_book_filter_active: bool, + pub smoker_recipe_book_open: bool, + pub smoker_recipe_book_filter_active: bool, + pub recipe_ids: Vec, +} + +impl DecodeBytes for UnlockRecipesS2c { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + let action_id = VarInt::decode_bytes(r)?.0; + + let crafting_recipe_book_open = bool::decode_bytes(r)?; + let crafting_recipe_book_filter_active = bool::decode_bytes(r)?; + let smelting_recipe_book_open = bool::decode_bytes(r)?; + let smelting_recipe_book_filter_active = bool::decode_bytes(r)?; + let blast_furnace_recipe_book_open = bool::decode_bytes(r)?; + let blast_furnace_recipe_book_filter_active = bool::decode_bytes(r)?; + let smoker_recipe_book_open = bool::decode_bytes(r)?; + let smoker_recipe_book_filter_active = bool::decode_bytes(r)?; + let recipe_ids = Vec::decode_bytes(r)?; + + Ok(Self { + action: match action_id { + 0 => UpdateRecipeBookAction::Init { + recipe_ids: Vec::decode_bytes(r)?, + }, + 1 => UpdateRecipeBookAction::Add, + 2 => UpdateRecipeBookAction::Remove, + n => bail!("unknown recipe book action of {n}"), + }, + crafting_recipe_book_open, + crafting_recipe_book_filter_active, + smelting_recipe_book_open, + smelting_recipe_book_filter_active, + blast_furnace_recipe_book_open, + blast_furnace_recipe_book_filter_active, + smoker_recipe_book_open, + smoker_recipe_book_filter_active, + recipe_ids, + }) + } +} + +impl Encode for UnlockRecipesS2c { + fn encode(&self, _w: impl Write) -> anyhow::Result<()> { + todo!() + } +} + +#[derive(Clone, PartialEq, Eq, Debug)] +pub enum UpdateRecipeBookAction { + Init { recipe_ids: Vec }, + Add, + Remove, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/update_beacon_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/update_beacon_c2s.rs new file mode 100644 index 00000000..f982a89f --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/update_beacon_c2s.rs @@ -0,0 +1,7 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct UpdateBeaconC2s { + pub primary_effect: Option, + pub secondary_effect: Option, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/update_command_block_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/update_command_block_c2s.rs new file mode 100644 index 00000000..2aa70999 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/update_command_block_c2s.rs @@ -0,0 +1,29 @@ +use bitfield_struct::bitfield; +use valence_bytes::CowUtf8Bytes; + +use crate::{BlockPos, Decode, DecodeBytes, DecodeBytesAuto, Encode, Packet}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct UpdateCommandBlockC2s<'a> { + pub position: BlockPos, + pub command: CowUtf8Bytes<'a>, + pub mode: UpdateCommandBlockMode, + pub flags: UpdateCommandBlockFlags, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto)] +pub enum UpdateCommandBlockMode { + Sequence, + Auto, + Redstone, +} + +#[bitfield(u8)] +#[derive(PartialEq, Eq, Encode, Decode, DecodeBytesAuto)] +pub struct UpdateCommandBlockFlags { + pub track_output: bool, + pub conditional: bool, + pub automatic: bool, + #[bits(5)] + _pad: u8, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/update_command_block_minecart_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/update_command_block_minecart_c2s.rs new file mode 100644 index 00000000..8c718ece --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/update_command_block_minecart_c2s.rs @@ -0,0 +1,10 @@ +use valence_bytes::CowUtf8Bytes; + +use crate::{DecodeBytes, Encode, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct UpdateCommandBlockMinecartC2s<'a> { + pub entity_id: VarInt, + pub command: CowUtf8Bytes<'a>, + pub track_output: bool, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/update_difficulty_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/update_difficulty_c2s.rs new file mode 100644 index 00000000..2be3986c --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/update_difficulty_c2s.rs @@ -0,0 +1,6 @@ +use crate::{Decode, DecodeBytesAuto, Difficulty, Encode, Packet}; + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct UpdateDifficultyC2s { + pub difficulty: Difficulty, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/update_difficulty_lock_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/update_difficulty_lock_c2s.rs new file mode 100644 index 00000000..119aa0fc --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/update_difficulty_lock_c2s.rs @@ -0,0 +1,6 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct UpdateDifficultyLockC2s { + pub locked: bool, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/update_jigsaw_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/update_jigsaw_c2s.rs new file mode 100644 index 00000000..86ea63d1 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/update_jigsaw_c2s.rs @@ -0,0 +1,14 @@ +use valence_bytes::CowUtf8Bytes; +use valence_ident::Ident; + +use crate::{BlockPos, DecodeBytes, Encode, Packet}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct UpdateJigsawC2s<'a> { + pub position: BlockPos, + pub name: Ident, + pub target: Ident, + pub pool: Ident, + pub final_state: CowUtf8Bytes<'a>, + pub joint_type: CowUtf8Bytes<'a>, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/update_player_abilities_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/update_player_abilities_c2s.rs new file mode 100644 index 00000000..b2c33a8c --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/update_player_abilities_c2s.rs @@ -0,0 +1,9 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet, PartialEq, Eq)] +pub enum UpdatePlayerAbilitiesC2s { + #[packet(tag = 0b00)] + StopFlying, + #[packet(tag = 0b10)] + StartFlying, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/update_selected_slot_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/update_selected_slot_c2s.rs new file mode 100644 index 00000000..4bdfbfb7 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/update_selected_slot_c2s.rs @@ -0,0 +1,6 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct UpdateSelectedSlotC2s { + pub slot: u16, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/update_selected_slot_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/update_selected_slot_s2c.rs new file mode 100644 index 00000000..feaa329a --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/update_selected_slot_s2c.rs @@ -0,0 +1,6 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct UpdateSelectedSlotS2c { + pub slot: u8, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/update_sign_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/update_sign_c2s.rs new file mode 100644 index 00000000..2f26b3c3 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/update_sign_c2s.rs @@ -0,0 +1,10 @@ +use valence_bytes::CowUtf8Bytes; + +use crate::{BlockPos, Bounded, DecodeBytes, Encode, Packet}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct UpdateSignC2s<'a> { + pub position: BlockPos, + pub is_front_text: bool, + pub lines: [Bounded, 384>; 4], +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/update_structure_block_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/update_structure_block_c2s.rs new file mode 100644 index 00000000..e39ce1fc --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/update_structure_block_c2s.rs @@ -0,0 +1,61 @@ +use bitfield_struct::bitfield; +use valence_bytes::CowUtf8Bytes; + +use crate::{BlockPos, Bounded, Decode, DecodeBytes, DecodeBytesAuto, Encode, Packet, VarLong}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +pub struct UpdateStructureBlockC2s<'a> { + pub position: BlockPos, + pub action: Action, + pub mode: Mode, + pub name: CowUtf8Bytes<'a>, + pub offset_xyz: [i8; 3], + pub size_xyz: [i8; 3], + pub mirror: Mirror, + pub rotation: Rotation, + pub metadata: Bounded, 128>, + pub integrity: f32, + pub seed: VarLong, + pub flags: Flags, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto)] +pub enum Action { + UpdateData, + SaveStructure, + LoadStructure, + DetectSize, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto)] +pub enum Mode { + Save, + Load, + Corner, + Data, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto)] +pub enum Mirror { + None, + LeftRight, + FrontBack, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto)] +pub enum Rotation { + None, + Clockwise90, + Clockwise180, + Counterclockwise90, +} + +#[bitfield(u8)] +#[derive(PartialEq, Eq, Encode, Decode, DecodeBytesAuto)] +pub struct Flags { + pub ignore_entities: bool, + pub show_air: bool, + pub show_bounding_box: bool, + #[bits(5)] + _pad: u8, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/vehicle_move_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/vehicle_move_c2s.rs new file mode 100644 index 00000000..a19a674f --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/vehicle_move_c2s.rs @@ -0,0 +1,10 @@ +use valence_math::DVec3; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct VehicleMoveC2s { + pub position: DVec3, + pub yaw: f32, + pub pitch: f32, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/vehicle_move_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/vehicle_move_s2c.rs new file mode 100644 index 00000000..50a6f987 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/vehicle_move_s2c.rs @@ -0,0 +1,10 @@ +use valence_math::DVec3; + +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct VehicleMoveS2c { + pub position: DVec3, + pub yaw: f32, + pub pitch: f32, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/world_border_center_changed_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/world_border_center_changed_s2c.rs new file mode 100644 index 00000000..a5072a24 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/world_border_center_changed_s2c.rs @@ -0,0 +1,7 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct WorldBorderCenterChangedS2c { + pub x_pos: f64, + pub z_pos: f64, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/world_border_initialize_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/world_border_initialize_s2c.rs new file mode 100644 index 00000000..4c1baee8 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/world_border_initialize_s2c.rs @@ -0,0 +1,13 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt, VarLong}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct WorldBorderInitializeS2c { + pub x: f64, + pub z: f64, + pub old_diameter: f64, + pub new_diameter: f64, + pub duration_millis: VarLong, + pub portal_teleport_boundary: VarInt, + pub warning_blocks: VarInt, + pub warning_time: VarInt, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/world_border_interpolate_size_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/world_border_interpolate_size_s2c.rs new file mode 100644 index 00000000..3bfe9e48 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/world_border_interpolate_size_s2c.rs @@ -0,0 +1,8 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarLong}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct WorldBorderInterpolateSizeS2c { + pub old_diameter: f64, + pub new_diameter: f64, + pub duration_millis: VarLong, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/world_border_size_changed_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/world_border_size_changed_s2c.rs new file mode 100644 index 00000000..5ea501b4 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/world_border_size_changed_s2c.rs @@ -0,0 +1,6 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct WorldBorderSizeChangedS2c { + pub diameter: f64, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/world_border_warning_blocks_changed_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/world_border_warning_blocks_changed_s2c.rs new file mode 100644 index 00000000..6f399510 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/world_border_warning_blocks_changed_s2c.rs @@ -0,0 +1,6 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct WorldBorderWarningBlocksChangedS2c { + pub warning_blocks: VarInt, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/world_border_warning_time_changed_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/world_border_warning_time_changed_s2c.rs new file mode 100644 index 00000000..db0d5481 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/world_border_warning_time_changed_s2c.rs @@ -0,0 +1,6 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct WorldBorderWarningTimeChangedS2c { + pub warning_time: VarInt, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/world_event_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/world_event_s2c.rs new file mode 100644 index 00000000..866d6d2e --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/world_event_s2c.rs @@ -0,0 +1,9 @@ +use crate::{BlockPos, Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct WorldEventS2c { + pub event: i32, + pub location: BlockPos, + pub data: i32, + pub disable_relative_volume: bool, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/world_time_update_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/world_time_update_s2c.rs new file mode 100644 index 00000000..a8f75edf --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/play/world_time_update_s2c.rs @@ -0,0 +1,11 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +pub struct WorldTimeUpdateS2c { + /// The age of the world in 1/20ths of a second. + pub world_age: i64, + /// The current time of day in 1/20ths of a second. + /// The value should be in the range \[0, 24000]. + /// 6000 is noon, 12000 is sunset, and 18000 is midnight. + pub time_of_day: i64, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/status.rs b/vendor/valence/crates/valence_protocol/src/packets/status.rs new file mode 100644 index 00000000..c5d584ae --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/status.rs @@ -0,0 +1,2 @@ +use super::*; + diff --git a/vendor/valence/crates/valence_protocol/src/packets/status/query_ping_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/status/query_ping_c2s.rs new file mode 100644 index 00000000..1720318c --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/status/query_ping_c2s.rs @@ -0,0 +1,7 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, PacketState}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +#[packet(state = PacketState::Status)] +pub struct QueryPingC2s { + pub payload: u64, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/status/query_pong_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/status/query_pong_s2c.rs new file mode 100644 index 00000000..a848881b --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/status/query_pong_s2c.rs @@ -0,0 +1,7 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, PacketState}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +#[packet(state = PacketState::Status)] +pub struct QueryPongS2c { + pub payload: u64, +} diff --git a/vendor/valence/crates/valence_protocol/src/packets/status/query_request_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/status/query_request_c2s.rs new file mode 100644 index 00000000..60a305c0 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/status/query_request_c2s.rs @@ -0,0 +1,5 @@ +use crate::{Decode, DecodeBytesAuto, Encode, Packet, PacketState}; + +#[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] +#[packet(state = PacketState::Status)] +pub struct QueryRequestC2s; diff --git a/vendor/valence/crates/valence_protocol/src/packets/status/query_response_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/status/query_response_s2c.rs new file mode 100644 index 00000000..d2fa4767 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/packets/status/query_response_s2c.rs @@ -0,0 +1,9 @@ +use valence_bytes::CowUtf8Bytes; + +use crate::{DecodeBytes, Encode, Packet, PacketState}; + +#[derive(Clone, Debug, Encode, DecodeBytes, Packet)] +#[packet(state = PacketState::Status)] +pub struct QueryResponseS2c<'a> { + pub json: CowUtf8Bytes<'a>, +} diff --git a/vendor/valence/crates/valence_protocol/src/profile.rs b/vendor/valence/crates/valence_protocol/src/profile.rs new file mode 100644 index 00000000..9ad87d53 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/profile.rs @@ -0,0 +1,59 @@ +use base64::prelude::*; +use serde::{Deserialize, Serialize}; +use url::Url; +use valence_bytes::Utf8Bytes; + +use crate::{DecodeBytes, Encode}; + +/// A property from the game profile. +#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize, Encode, DecodeBytes)] +pub struct Property { + pub name: S, + pub value: S, + pub signature: Option, +} + +/// Contains URLs to the skin and cape of a player. +#[derive(Clone, PartialEq, Eq, Debug)] +pub struct PlayerTextures { + /// URL to the player's skin texture. + pub skin: Url, + /// URL to the player's cape texture. May be absent if the player does not + /// have a cape. + pub cape: Option, +} + +impl PlayerTextures { + /// Constructs player textures from the "textures" property of the game + /// profile. + /// + /// "textures" is a base64 string of JSON data. + pub fn try_from_textures(textures: &str) -> anyhow::Result { + #[derive(Debug, Deserialize)] + struct Textures { + textures: PlayerTexturesPayload, + } + + #[derive(Debug, Deserialize)] + #[serde(rename_all = "UPPERCASE")] + struct PlayerTexturesPayload { + skin: TextureUrl, + #[serde(default)] + cape: Option, + } + + #[derive(Debug, Deserialize)] + struct TextureUrl { + url: Url, + } + + let decoded = BASE64_STANDARD.decode(textures.as_bytes())?; + + let Textures { textures } = serde_json::from_slice(&decoded)?; + + Ok(Self { + skin: textures.skin.url, + cape: textures.cape.map(|t| t.url), + }) + } +} diff --git a/vendor/valence/crates/valence_protocol/src/raw.rs b/vendor/valence/crates/valence_protocol/src/raw.rs new file mode 100644 index 00000000..f98916f1 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/raw.rs @@ -0,0 +1,60 @@ +use std::io::Write; +use std::mem; + +use anyhow::ensure; +use derive_more::{Deref, DerefMut, From, Into}; +use valence_bytes::{Bytes, CowBytes}; + +use crate::{Bounded, DecodeBytes, Encode}; + +/// While [encoding], the contained slice is written directly to the output +/// without any length prefix or metadata. +/// +/// While [decoding], the remainder of the input is returned as the contained +/// slice. The input will be at the EOF state after this is decoded. +/// +/// [encoding]: Encode +/// [decoding]: Decode +#[derive( + Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default, Debug, Deref, DerefMut, From, Into, +)] +pub struct RawBytes<'a>(pub CowBytes<'a>); + +impl Encode for RawBytes<'_> { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + Ok(w.write_all(&self.0)?) + } +} + +impl DecodeBytes for RawBytes<'_> { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + Ok(Self(mem::take(r).into())) + } +} + +/// Raises an encoding error if the inner slice is longer than `MAX_BYTES`. +impl Encode for Bounded, MAX_BYTES> { + fn encode(&self, w: impl Write) -> anyhow::Result<()> { + ensure!( + self.len() <= MAX_BYTES, + "cannot encode more than {MAX_BYTES} raw bytes (got {} bytes)", + self.len() + ); + + self.0.encode(w) + } +} + +/// Raises a decoding error if the remainder of the input is larger than +/// `MAX_BYTES`. +impl DecodeBytes for Bounded, MAX_BYTES> { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + ensure!( + r.len() <= MAX_BYTES, + "remainder of input exceeds max of {MAX_BYTES} bytes (got {} bytes)", + r.len() + ); + + Ok(Bounded(RawBytes::decode_bytes(r)?)) + } +} diff --git a/vendor/valence/crates/valence_protocol/src/sound.rs b/vendor/valence/crates/valence_protocol/src/sound.rs new file mode 100644 index 00000000..5dca149b --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/sound.rs @@ -0,0 +1,58 @@ +use std::io::Write; + +use bytes::Bytes; +pub use valence_generated::sound::Sound; +use valence_ident::Ident; + +use crate::var_int::VarInt; +use crate::{Decode, DecodeBytes, DecodeBytesAuto, Encode}; + +#[derive(Clone, PartialEq, Debug)] +pub enum SoundId { + Direct { id: Ident, range: Option }, + Reference { id: VarInt }, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Encode, Decode, DecodeBytesAuto)] +pub enum SoundCategory { + Master, + Music, + Record, + Weather, + Block, + Hostile, + Neutral, + Player, + Ambient, + Voice, +} + +impl Encode for SoundId { + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + match self { + SoundId::Direct { id, range } => { + VarInt(0).encode(&mut w)?; + id.encode(&mut w)?; + range.encode(&mut w)?; + } + SoundId::Reference { id } => VarInt(id.0 + 1).encode(&mut w)?, + } + + Ok(()) + } +} + +impl DecodeBytes for SoundId { + fn decode_bytes(r: &mut Bytes) -> anyhow::Result { + let i = VarInt::decode_bytes(r)?.0; + + if i == 0 { + Ok(SoundId::Direct { + id: Ident::decode_bytes(r)?, + range: >::decode_bytes(r)?, + }) + } else { + Ok(SoundId::Reference { id: VarInt(i - 1) }) + } + } +} diff --git a/vendor/valence/crates/valence_protocol/src/var_int.rs b/vendor/valence/crates/valence_protocol/src/var_int.rs new file mode 100644 index 00000000..acf54307 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/var_int.rs @@ -0,0 +1,155 @@ +use std::io::{Read, Write}; + +use anyhow::bail; +use byteorder::ReadBytesExt; +use derive_more::{Deref, DerefMut, From, Into}; +use serde::{Deserialize, Serialize}; +use thiserror::Error; + +use crate::{Decode, DecodeBytesAuto, Encode}; + +/// An `i32` encoded with variable length. +#[derive( + Clone, + Copy, + Default, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + Debug, + Deref, + DerefMut, + From, + Into, + Serialize, + Deserialize, + DecodeBytesAuto, +)] +#[serde(transparent)] +#[repr(transparent)] +pub struct VarInt(pub i32); + +impl VarInt { + /// The maximum number of bytes a VarInt could occupy when read from and + /// written to the Minecraft protocol. + pub const MAX_SIZE: usize = 5; + + /// Returns the exact number of bytes this varint will write when + /// [`Encode::encode`] is called, assuming no error occurs. + pub const fn written_size(self) -> usize { + match self.0 { + 0 => 1, + n => (31 - n.leading_zeros() as usize) / 7 + 1, + } + } + + pub fn decode_partial(mut r: impl Read) -> Result { + let mut val = 0; + for i in 0..Self::MAX_SIZE { + let byte = r.read_u8().map_err(|_| VarIntDecodeError::Incomplete)?; + val |= (byte as i32 & 0b01111111) << (i * 7); + if byte & 0b10000000 == 0 { + return Ok(val); + } + } + + Err(VarIntDecodeError::TooLarge) + } +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug, Error)] +pub enum VarIntDecodeError { + #[error("incomplete VarInt decode")] + Incomplete, + #[error("VarInt is too large")] + TooLarge, +} + +impl Encode for VarInt { + // Adapted from VarInt-Simd encode + // https://github.com/as-com/varint-simd/blob/0f468783da8e181929b01b9c6e9f741c1fe09825/src/encode/mod.rs#L71 + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + let x = self.0 as u64; + let stage1 = (x & 0x000000000000007f) + | ((x & 0x0000000000003f80) << 1) + | ((x & 0x00000000001fc000) << 2) + | ((x & 0x000000000fe00000) << 3) + | ((x & 0x00000000f0000000) << 4); + + let leading = stage1.leading_zeros(); + + let unused_bytes = (leading - 1) >> 3; + let bytes_needed = 8 - unused_bytes; + + // set all but the last MSBs + let msbs = 0x8080808080808080; + let msbmask = 0xffffffffffffffff >> (((8 - bytes_needed + 1) << 3) - 1); + + let merged = stage1 | (msbs & msbmask); + let bytes = merged.to_le_bytes(); + + w.write_all(unsafe { bytes.get_unchecked(..bytes_needed as usize) })?; + + Ok(()) + } +} + +impl Decode for VarInt { + fn decode(r: &mut &[u8]) -> anyhow::Result { + let mut val = 0; + for i in 0..Self::MAX_SIZE { + let byte = r.read_u8()?; + val |= (byte as i32 & 0b01111111) << (i * 7); + if byte & 0b10000000 == 0 { + return Ok(VarInt(val)); + } + } + bail!("VarInt is too large") + } +} + +#[cfg(test)] +mod tests { + use rand::{thread_rng, Rng}; + + use super::*; + + #[test] + fn varint_written_size() { + let mut rng = thread_rng(); + let mut buf = vec![]; + + for n in (0..100_000) + .map(|_| rng.r#gen()) + .chain([0, i32::MIN, i32::MAX]) + .map(VarInt) + { + buf.clear(); + n.encode(&mut buf).unwrap(); + assert_eq!(buf.len(), n.written_size()); + } + } + + #[test] + fn varint_round_trip() { + let mut rng = thread_rng(); + let mut buf = vec![]; + + for n in (0..1_000_000) + .map(|_| rng.r#gen()) + .chain([0, i32::MIN, i32::MAX]) + { + VarInt(n).encode(&mut buf).unwrap(); + + let mut slice = buf.as_slice(); + assert!(slice.len() <= VarInt::MAX_SIZE); + + assert_eq!(n, VarInt::decode(&mut slice).unwrap().0); + + assert!(slice.is_empty()); + buf.clear(); + } + } +} diff --git a/vendor/valence/crates/valence_protocol/src/var_long.rs b/vendor/valence/crates/valence_protocol/src/var_long.rs new file mode 100644 index 00000000..75ec9091 --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/var_long.rs @@ -0,0 +1,156 @@ +use std::io::Write; + +use anyhow::bail; +use byteorder::ReadBytesExt; +use derive_more::{From, Into}; +use serde::{Deserialize, Serialize}; + +use crate::{Decode, DecodeBytesAuto, Encode}; + +/// An `i64` encoded with variable length. +#[derive( + Clone, + Copy, + Default, + PartialEq, + Eq, + PartialOrd, + Ord, + Hash, + Debug, + From, + Into, + Serialize, + Deserialize, + DecodeBytesAuto, +)] +#[serde(transparent)] +#[repr(transparent)] +pub struct VarLong(pub i64); + +impl VarLong { + /// The maximum number of bytes a `VarLong` can occupy when read from and + /// written to the Minecraft protocol. + pub const MAX_SIZE: usize = 10; + + /// Returns the exact number of bytes this varlong will write when + /// [`Encode::encode`] is called, assuming no error occurs. + pub fn written_size(self) -> usize { + match self.0 { + 0 => 1, + n => (63 - n.leading_zeros() as usize) / 7 + 1, + } + } +} + +impl Encode for VarLong { + // Adapted from VarInt-Simd encode + // https://github.com/as-com/varint-simd/blob/0f468783da8e181929b01b9c6e9f741c1fe09825/src/encode/mod.rs#L71 + #[cfg(all( + any(target_arch = "x86", target_arch = "x86_64"), + not(target_os = "macos") + ))] + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + #[cfg(target_arch = "x86")] + use std::arch::x86::*; + #[cfg(target_arch = "x86_64")] + use std::arch::x86_64::*; + + // Break the number into 7-bit parts and spread them out into a vector + let mut res = [0u64; 2]; + { + let x = self.0 as u64; + + res[0] = unsafe { _pdep_u64(x, 0x7f7f7f7f7f7f7f7f) }; + res[1] = unsafe { _pdep_u64(x >> 56, 0x000000000000017f) }; + } + let stage1: __m128i = unsafe { std::mem::transmute(res) }; + + // Create a mask for where there exist values + // This signed comparison works because all MSBs should be cleared at this point + // Also handle the special case when num == 0 + let minimum = + unsafe { _mm_set_epi8(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xffu8 as i8) }; + let exists = unsafe { _mm_or_si128(_mm_cmpgt_epi8(stage1, _mm_setzero_si128()), minimum) }; + let bits = unsafe { _mm_movemask_epi8(exists) }; + + // Count the number of bytes used + let bytes_needed = 32 - bits.leading_zeros() as u8; // lzcnt on supported CPUs + + // Fill that many bytes into a vector + let ascend = unsafe { _mm_setr_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15) }; + let mask = unsafe { _mm_cmplt_epi8(ascend, _mm_set1_epi8(bytes_needed as i8)) }; + + // Shift it down 1 byte so the last MSB is the only one set, and make sure only + // the MSB is set + let shift = unsafe { _mm_bsrli_si128(mask, 1) }; + let msbmask = unsafe { _mm_and_si128(shift, _mm_set1_epi8(128u8 as i8)) }; + + // Merge the MSB bits into the vector + let merged = unsafe { _mm_or_si128(stage1, msbmask) }; + let bytes = unsafe { std::mem::transmute::<__m128i, [u8; 16]>(merged) }; + + w.write_all(unsafe { bytes.get_unchecked(..bytes_needed as usize) })?; + + Ok(()) + } + + #[cfg(any( + not(any(target_arch = "x86", target_arch = "x86_64")), + target_os = "macos" + ))] + fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { + use byteorder::WriteBytesExt; + + let mut val = self.0 as u64; + loop { + if val & 0b1111111111111111111111111111111111111111111111111111111110000000 == 0 { + w.write_u8(val as u8)?; + return Ok(()); + } + w.write_u8(val as u8 & 0b01111111 | 0b10000000)?; + val >>= 7; + } + } +} + +impl Decode for VarLong { + fn decode(r: &mut &[u8]) -> anyhow::Result { + let mut val = 0; + for i in 0..Self::MAX_SIZE { + let byte = r.read_u8()?; + val |= (byte as i64 & 0b01111111) << (i * 7); + if byte & 0b10000000 == 0 { + return Ok(VarLong(val)); + } + } + bail!("VarInt is too large") + } +} + +#[cfg(test)] +mod tests { + use rand::{thread_rng, Rng}; + + use super::*; + + #[test] + fn encode_decode() { + let mut rng = thread_rng(); + let mut buf = vec![]; + + for n in (0..1_000_000) + .map(|_| rng.r#gen()) + .chain([0, i64::MIN, i64::MAX]) + { + VarLong(n).encode(&mut buf).unwrap(); + + let mut slice = buf.as_slice(); + assert!(slice.len() <= VarLong::MAX_SIZE); + + assert_eq!(n, VarLong::decode(&mut slice).unwrap().0); + assert!(slice.is_empty()); + buf.clear(); + } + } +} diff --git a/vendor/valence/crates/valence_protocol/src/velocity.rs b/vendor/valence/crates/valence_protocol/src/velocity.rs new file mode 100644 index 00000000..42dbfebf --- /dev/null +++ b/vendor/valence/crates/valence_protocol/src/velocity.rs @@ -0,0 +1,54 @@ +use std::fmt; + +use derive_more::{From, Into}; + +use crate::{Decode, DecodeBytesAuto, Encode}; + +/// Quantized entity velocity. +#[derive(Copy, Clone, PartialEq, Eq, Encode, Decode, DecodeBytesAuto, From, Into)] +pub struct Velocity(pub [i16; 3]); + +impl Velocity { + /// From meters/second. + pub fn from_ms_f32(ms: [f32; 3]) -> Self { + Self(ms.map(|v| (8000.0 / 20.0 * v) as i16)) + } + + /// From meters/second. + pub fn from_ms_f64(ms: [f64; 3]) -> Self { + Self(ms.map(|v| (8000.0 / 20.0 * v) as i16)) + } + + /// To meters/second. + pub fn to_ms_f32(self) -> [f32; 3] { + self.0.map(|v| v as f32 / (8000.0 / 20.0)) + } + + /// To meters/second. + pub fn to_ms_f64(self) -> [f64; 3] { + self.0.map(|v| v as f64 / (8000.0 / 20.0)) + } +} + +impl fmt::Debug for Velocity { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt::Display::fmt(self, f) + } +} + +impl fmt::Display for Velocity { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let [x, y, z] = self.to_ms_f32(); + write!(f, "⟨{x},{y},{z}⟩ m/s") + } +} + +#[cfg(test)] +#[test] +fn velocity_from_ms() { + let val_1 = Velocity::from_ms_f32([(); 3].map(|_| -3.3575)).0[0]; + let val_2 = Velocity::from_ms_f64([(); 3].map(|_| -3.3575)).0[0]; + + assert_eq!(val_1, val_2); + assert_eq!(val_1, -1343); +} diff --git a/vendor/valence/crates/valence_protocol_macros/Cargo.toml b/vendor/valence/crates/valence_protocol_macros/Cargo.toml new file mode 100644 index 00000000..5f9bf935 --- /dev/null +++ b/vendor/valence/crates/valence_protocol_macros/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "valence_protocol_macros" +description = "Procedural macros for valence_protocol" +readme = "README.md" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[lib] +proc-macro = true + +[dependencies] +proc-macro2.workspace = true +quote.workspace = true +syn = { workspace = true, features = ["full"] } +heck.workspace = true diff --git a/vendor/valence/crates/valence_protocol_macros/README.md b/vendor/valence/crates/valence_protocol_macros/README.md new file mode 100644 index 00000000..fc74027c --- /dev/null +++ b/vendor/valence/crates/valence_protocol_macros/README.md @@ -0,0 +1,3 @@ +# valence_protocol_macros + +Procedural macros for `valence_protocol` diff --git a/vendor/valence/crates/valence_protocol_macros/src/decode.rs b/vendor/valence/crates/valence_protocol_macros/src/decode.rs new file mode 100644 index 00000000..4d4cbda5 --- /dev/null +++ b/vendor/valence/crates/valence_protocol_macros/src/decode.rs @@ -0,0 +1,337 @@ +use proc_macro2::TokenStream; +use quote::quote; +use syn::punctuated::Punctuated; +use syn::spanned::Spanned; +use syn::{ + parse2, parse_quote, Data, DeriveInput, Error, Fields, PredicateType, Result, Token, + TraitBound, TraitBoundModifier, TypeParamBound, WhereClause, WherePredicate, +}; + +use crate::{add_trait_bounds, pair_variants_with_discriminants}; + +pub(super) fn derive_decode(item: TokenStream) -> Result { + let mut input = parse2::(item)?; + + let input_name = input.ident; + + match input.data { + Data::Struct(struct_) => { + let decode_fields = match struct_.fields { + Fields::Named(fields) => { + let init = fields.named.iter().map(|f| { + let name = f.ident.as_ref().unwrap(); + let ctx = format!("failed to decode field `{name}` in `{input_name}`"); + quote! { + #name: Decode::decode(_r).context(#ctx)?, + } + }); + + quote! { + Self { + #(#init)* + } + } + } + Fields::Unnamed(fields) => { + let init = (0..fields.unnamed.len()) + .map(|i| { + let ctx = format!("failed to decode field `{i}` in `{input_name}`"); + quote! { + Decode::decode(_r).context(#ctx)?, + } + }) + .collect::(); + + quote! { + Self(#init) + } + } + Fields::Unit => quote!(Self), + }; + + add_trait_bounds( + &mut input.generics, + quote!(::valence_protocol::__private::Decode), + ); + + let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl(); + + Ok(quote! { + #[allow(unused_imports)] + impl #impl_generics ::valence_protocol::__private::Decode for #input_name #ty_generics + #where_clause + { + fn decode(_r: &mut &[u8]) -> ::valence_protocol::__private::Result { + use ::valence_protocol::__private::{Decode, Context, ensure}; + + Ok(#decode_fields) + } + } + }) + } + Data::Enum(enum_) => { + let variants = pair_variants_with_discriminants(enum_.variants)?; + + let decode_arms = variants + .iter() + .map(|(disc, variant)| { + let name = &variant.ident; + + match &variant.fields { + Fields::Named(fields) => { + let fields = fields + .named + .iter() + .map(|f| { + let field = f.ident.as_ref().unwrap(); + let ctx = format!( + "failed to decode field `{field}` in variant `{name}` in \ + `{input_name}`", + ); + quote! { + #field: Decode::decode(_r).context(#ctx)?, + } + }) + .collect::(); + + quote! { + #disc => Ok(Self::#name { #fields }), + } + } + Fields::Unnamed(fields) => { + let init = (0..fields.unnamed.len()) + .map(|i| { + let ctx = format!( + "failed to decode field `{i}` in variant `{name}` in \ + `{input_name}`", + ); + quote! { + Decode::decode(_r).context(#ctx)?, + } + }) + .collect::(); + + quote! { + #disc => Ok(Self::#name(#init)), + } + } + Fields::Unit => quote!(#disc => Ok(Self::#name),), + } + }) + .collect::(); + + add_trait_bounds( + &mut input.generics, + quote!(::valence_protocol::__private::Decode), + ); + + let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl(); + + Ok(quote! { + #[allow(unused_imports)] + impl #impl_generics ::valence_protocol::__private::Decode for #input_name #ty_generics + #where_clause + { + fn decode(_r: &mut &[u8]) -> ::valence_protocol::__private::Result { + use ::valence_protocol::__private::{Decode, Context, VarInt, bail}; + + let ctx = concat!("failed to decode enum discriminant in `", stringify!(#input_name), "`"); + let disc = VarInt::decode(_r).context(ctx)?.0; + match disc { + #decode_arms + n => bail!("unexpected enum discriminant {} in `{}`", disc, stringify!(#input_name)), + } + } + } + }) + } + Data::Union(u) => Err(Error::new( + u.union_token.span(), + "cannot derive `Decode` on unions", + )), + } +} + +pub(super) fn derive_decode_bytes(item: TokenStream) -> Result { + let mut input = parse2::(item)?; + + let input_name = input.ident; + + match input.data { + Data::Struct(struct_) => { + let decode_fields = match struct_.fields { + Fields::Named(fields) => { + let init = fields.named.iter().map(|f| { + let name = f.ident.as_ref().unwrap(); + let ctx = format!("failed to decode field `{name}` in `{input_name}`"); + quote! { + #name: DecodeBytes::decode_bytes(_r).context(#ctx)?, + } + }); + + quote! { + Self { + #(#init)* + } + } + } + Fields::Unnamed(fields) => { + let init = (0..fields.unnamed.len()) + .map(|i| { + let ctx = format!("failed to decode field `{i}` in `{input_name}`"); + quote! { + DecodeBytes::decode_bytes(_r).context(#ctx)?, + } + }) + .collect::(); + + quote! { + Self(#init) + } + } + Fields::Unit => quote!(Self), + }; + + add_trait_bounds( + &mut input.generics, + quote!(::valence_protocol::__private::DecodeBytes), + ); + + let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl(); + + Ok(quote! { + #[allow(unused_imports)] + impl #impl_generics ::valence_protocol::__private::DecodeBytes for #input_name #ty_generics + #where_clause + { + fn decode_bytes(_r: &mut ::valence_protocol::__private::Bytes) -> ::valence_protocol::__private::Result { + use ::valence_protocol::__private::{DecodeBytes, Context, ensure}; + + Ok(#decode_fields) + } + } + }) + } + Data::Enum(enum_) => { + let variants = pair_variants_with_discriminants(enum_.variants)?; + + let decode_arms = variants + .iter() + .map(|(disc, variant)| { + let name = &variant.ident; + + match &variant.fields { + Fields::Named(fields) => { + let fields = fields + .named + .iter() + .map(|f| { + let field = f.ident.as_ref().unwrap(); + let ctx = format!( + "failed to decode field `{field}` in variant `{name}` in \ + `{input_name}`", + ); + quote! { + #field: DecodeBytes::decode_bytes(_r).context(#ctx)?, + } + }) + .collect::(); + + quote! { + #disc => Ok(Self::#name { #fields }), + } + } + Fields::Unnamed(fields) => { + let init = (0..fields.unnamed.len()) + .map(|i| { + let ctx = format!( + "failed to decode field `{i}` in variant `{name}` in \ + `{input_name}`", + ); + quote! { + DecodeBytes::decode_bytes(_r).context(#ctx)?, + } + }) + .collect::(); + + quote! { + #disc => Ok(Self::#name(#init)), + } + } + Fields::Unit => quote!(#disc => Ok(Self::#name),), + } + }) + .collect::(); + + add_trait_bounds( + &mut input.generics, + quote!(::valence_protocol::__private::DecodeBytes), + ); + + let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl(); + + Ok(quote! { + #[allow(unused_imports)] + impl #impl_generics ::valence_protocol::__private::DecodeBytes for #input_name #ty_generics + #where_clause + { + fn decode_bytes(_r: &mut ::valence_protocol::__private::Bytes) -> ::valence_protocol::__private::Result { + use ::valence_protocol::__private::{DecodeBytes, Context, VarInt, bail}; + + let ctx = concat!("failed to decode enum discriminant in `", stringify!(#input_name), "`"); + let disc = VarInt::decode_bytes(_r).context(ctx)?.0; + match disc { + #decode_arms + n => bail!("unexpected enum discriminant {} in `{}`", disc, stringify!(#input_name)), + } + } + } + }) + } + Data::Union(u) => Err(Error::new( + u.union_token.span(), + "cannot derive `DecodeBytes` on unions", + )), + } +} + +pub(super) fn derive_decode_bytes_auto(item: TokenStream) -> Result { + let input = parse2::(item)?; + + let input_name = input.ident; + + let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl(); + let mut where_clause = where_clause.cloned().unwrap_or_else(|| WhereClause { + where_token: ::default(), + predicates: Punctuated::new(), + }); + + // Require the type to implement Decode + where_clause + .predicates + .push(WherePredicate::Type(PredicateType { + lifetimes: None, + bounded_ty: parse_quote!(#input_name #ty_generics), + colon_token: ::default(), + bounds: Punctuated::from_iter(std::iter::once(TypeParamBound::Trait(TraitBound { + paren_token: None, + modifier: TraitBoundModifier::None, + lifetimes: None, + path: parse_quote!(::valence_protocol::__private::Decode), + }))), + })); + + Ok(quote! { + impl #impl_generics ::valence_protocol::__private::DecodeBytes for #input_name #ty_generics + #where_clause + { + fn decode_bytes(r: &mut ::valence_protocol::__private::Bytes) -> ::valence_protocol::__private::Result { + ::valence_protocol::__private::decode_bytes_auto(r) + } + + fn decode_from_owned(r: T) -> ::anyhow::Result<(Self, usize)> where T: ::std::convert::AsRef<[u8]> + ::std::marker::Send + 'static { + ::decode_and_len(r.as_ref()) + } + } + }) +} diff --git a/vendor/valence/crates/valence_protocol_macros/src/encode.rs b/vendor/valence/crates/valence_protocol_macros/src/encode.rs new file mode 100644 index 00000000..101048e0 --- /dev/null +++ b/vendor/valence/crates/valence_protocol_macros/src/encode.rs @@ -0,0 +1,165 @@ +use proc_macro2::{Ident, Span, TokenStream}; +use quote::quote; +use syn::spanned::Spanned; +use syn::{parse2, Data, DeriveInput, Error, Fields, LitInt, Result}; + +use crate::{add_trait_bounds, pair_variants_with_discriminants}; + +pub(super) fn derive_encode(item: TokenStream) -> Result { + let mut input = parse2::(item)?; + + let input_name = input.ident; + + add_trait_bounds( + &mut input.generics, + quote!(::valence_protocol::__private::Encode), + ); + + let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl(); + + match input.data { + Data::Struct(struct_) => { + let encode_fields = match &struct_.fields { + Fields::Named(fields) => fields + .named + .iter() + .map(|f| { + let name = &f.ident.as_ref().unwrap(); + let ctx = format!("failed to encode field `{name}` in `{input_name}`"); + quote! { + self.#name.encode(&mut _w).context(#ctx)?; + } + }) + .collect(), + Fields::Unnamed(fields) => (0..fields.unnamed.len()) + .map(|i| { + let lit = LitInt::new(&i.to_string(), Span::call_site()); + let ctx = format!("failed to encode field `{lit}` in `{input_name}`"); + quote! { + self.#lit.encode(&mut _w).context(#ctx)?; + } + }) + .collect(), + Fields::Unit => TokenStream::new(), + }; + + Ok(quote! { + #[allow(unused_imports)] + impl #impl_generics ::valence_protocol::__private::Encode for #input_name #ty_generics + #where_clause + { + fn encode(&self, mut _w: impl ::std::io::Write) -> ::valence_protocol::__private::Result<()> { + use ::valence_protocol::__private::{Encode, Context}; + + #encode_fields + + Ok(()) + } + } + }) + } + Data::Enum(enum_) => { + let variants = pair_variants_with_discriminants(enum_.variants)?; + + let encode_arms = variants + .iter() + .map(|(disc, variant)| { + let variant_name = &variant.ident; + + let disc_ctx = format!( + "failed to encode enum discriminant {disc} for variant `{variant_name}` \ + in `{input_name}`", + ); + + match &variant.fields { + Fields::Named(fields) => { + let field_names = fields + .named + .iter() + .map(|f| f.ident.as_ref().unwrap()) + .collect::>(); + + let encode_fields = field_names + .iter() + .map(|name| { + let ctx = format!( + "failed to encode field `{name}` in variant \ + `{variant_name}` in `{input_name}`", + ); + + quote! { + #name.encode(&mut _w).context(#ctx)?; + } + }) + .collect::(); + + quote! { + Self::#variant_name { #(#field_names,)* } => { + VarInt(#disc).encode(&mut _w).context(#disc_ctx)?; + + #encode_fields + Ok(()) + } + } + } + Fields::Unnamed(fields) => { + let field_names = (0..fields.unnamed.len()) + .map(|i| Ident::new(&format!("_{i}"), Span::call_site())) + .collect::>(); + + let encode_fields = field_names + .iter() + .map(|name| { + let ctx = format!( + "failed to encode field `{name}` in variant \ + `{variant_name}` in `{input_name}`" + ); + + quote! { + #name.encode(&mut _w).context(#ctx)?; + } + }) + .collect::(); + + quote! { + Self::#variant_name(#(#field_names,)*) => { + VarInt(#disc).encode(&mut _w).context(#disc_ctx)?; + + #encode_fields + Ok(()) + } + } + } + Fields::Unit => quote! { + Self::#variant_name => Ok( + VarInt(#disc) + .encode(&mut _w) + .context(#disc_ctx)? + ), + }, + } + }) + .collect::(); + + Ok(quote! { + #[allow(unused_imports, unreachable_code)] + impl #impl_generics ::valence_protocol::__private::Encode for #input_name #ty_generics + #where_clause + { + fn encode(&self, mut _w: impl ::std::io::Write) -> ::valence_protocol::__private::Result<()> { + use ::valence_protocol::__private::{Encode, VarInt, Context}; + + match self { + #encode_arms + _ => unreachable!(), + } + } + } + }) + } + Data::Union(u) => Err(Error::new( + u.union_token.span(), + "cannot derive `Encode` on unions", + )), + } +} diff --git a/vendor/valence/crates/valence_protocol_macros/src/lib.rs b/vendor/valence/crates/valence_protocol_macros/src/lib.rs new file mode 100644 index 00000000..7240f748 --- /dev/null +++ b/vendor/valence/crates/valence_protocol_macros/src/lib.rs @@ -0,0 +1,113 @@ +#![doc = include_str!("../README.md")] +#![deny( + rustdoc::broken_intra_doc_links, + rustdoc::private_intra_doc_links, + rustdoc::missing_crate_level_docs, + rustdoc::invalid_codeblock_attributes, + rustdoc::invalid_rust_codeblocks, + rustdoc::bare_urls, + rustdoc::invalid_html_tags +)] +#![warn( + trivial_casts, + trivial_numeric_casts, + unused_lifetimes, + unused_import_braces, + unreachable_pub, + clippy::dbg_macro +)] + +use proc_macro::TokenStream as StdTokenStream; +use proc_macro2::TokenStream; +use syn::{parse_quote, Attribute, GenericParam, Generics, LitInt, Result, Variant}; + +mod decode; +mod encode; +mod packet; + +#[proc_macro_derive(Encode, attributes(packet))] +pub fn derive_encode(item: StdTokenStream) -> StdTokenStream { + match encode::derive_encode(item.into()) { + Ok(tokens) => tokens.into(), + Err(e) => e.into_compile_error().into(), + } +} + +#[proc_macro_derive(Decode, attributes(packet))] +pub fn derive_decode(item: StdTokenStream) -> StdTokenStream { + match decode::derive_decode(item.into()) { + Ok(tokens) => tokens.into(), + Err(e) => e.into_compile_error().into(), + } +} + +#[proc_macro_derive(DecodeBytes, attributes(packet))] +pub fn derive_decode_bytes(item: StdTokenStream) -> StdTokenStream { + match decode::derive_decode_bytes(item.into()) { + Ok(tokens) => tokens.into(), + Err(e) => e.into_compile_error().into(), + } +} + +#[proc_macro_derive(DecodeBytesAuto, attributes(packet))] +pub fn derive_decode_bytes_auto(item: StdTokenStream) -> StdTokenStream { + match decode::derive_decode_bytes_auto(item.into()) { + Ok(tokens) => tokens.into(), + Err(e) => e.into_compile_error().into(), + } +} + +#[proc_macro_derive(Packet, attributes(packet))] +pub fn derive_packet(item: StdTokenStream) -> StdTokenStream { + match packet::derive_packet(item.into()) { + Ok(tokens) => tokens.into(), + Err(e) => e.into_compile_error().into(), + } +} + +fn pair_variants_with_discriminants( + variants: impl IntoIterator, +) -> Result> { + let mut discriminant = 0; + variants + .into_iter() + .map(|v| { + if let Some(i) = parse_tag_attr(&v.attrs)? { + discriminant = i; + } + + let pair = (discriminant, v); + discriminant += 1; + Ok(pair) + }) + .collect::>() +} + +fn parse_tag_attr(attrs: &[Attribute]) -> Result> { + for attr in attrs { + if attr.path().is_ident("packet") { + let mut res = 0; + + attr.parse_nested_meta(|meta| { + if meta.path.is_ident("tag") { + res = meta.value()?.parse::()?.base10_parse::()?; + Ok(()) + } else { + Err(meta.error("unrecognized argument")) + } + })?; + + return Ok(Some(res)); + } + } + + Ok(None) +} + +fn add_trait_bounds(generics: &mut Generics, trait_: TokenStream) { + for param in &mut generics.params { + if let GenericParam::Type(type_param) = param { + type_param.bounds.push(parse_quote!(#trait_)) + } + } +} diff --git a/vendor/valence/crates/valence_protocol_macros/src/packet.rs b/vendor/valence/crates/valence_protocol_macros/src/packet.rs new file mode 100644 index 00000000..9d2cdd55 --- /dev/null +++ b/vendor/valence/crates/valence_protocol_macros/src/packet.rs @@ -0,0 +1,128 @@ +use heck::ToShoutySnakeCase; +use proc_macro2::{Ident, Span, TokenStream}; +use quote::quote; +use syn::spanned::Spanned; +use syn::{parse2, parse_quote, Attribute, DeriveInput, Error, Expr, LitInt, LitStr, Result}; + +use crate::add_trait_bounds; + +pub(super) fn derive_packet(item: TokenStream) -> Result { + let mut input = parse2::(item)?; + + let packet_attr = parse_packet_helper_attr(&input.attrs)?.unwrap_or_default(); + + let name = input.ident.clone(); + + let name_str = if let Some(attr_name) = packet_attr.name { + attr_name.value() + } else { + name.to_string() + }; + + let packet_id: Expr = match packet_attr.id { + Some(expr) => expr, + None => match syn::parse_str::(&name_str.to_shouty_snake_case()) { + Ok(ident) => parse_quote!(::valence_protocol::packet_id::#ident), + Err(_) => { + return Err(Error::new( + packet_attr.span, + "missing valid `id = ...` value from `packet` attr", + )) + } + }, + }; + + add_trait_bounds(&mut input.generics, quote!(::std::fmt::Debug)); + + let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl(); + + let side = if let Some(side_attr) = packet_attr.side { + side_attr + } else if name_str.to_lowercase().ends_with("s2c") { + parse_quote!(::valence_protocol::PacketSide::Clientbound) + } else if name_str.to_lowercase().ends_with("c2s") { + parse_quote!(::valence_protocol::PacketSide::Serverbound) + } else { + return Err(Error::new( + packet_attr.span, + "missing `side = PacketSide::...` value from `packet` attribute", + )); + }; + + let state = packet_attr + .state + .unwrap_or_else(|| parse_quote!(::valence_protocol::PacketState::Play)); + + Ok(quote! { + impl #impl_generics ::valence_protocol::__private::Packet for #name #ty_generics + #where_clause + { + const ID: i32 = #packet_id; + const NAME: &'static str = #name_str; + const SIDE: ::valence_protocol::PacketSide = #side; + const STATE: ::valence_protocol::PacketState = #state; + } + }) +} + +struct PacketAttr { + span: Span, + id: Option, + tag: Option, + name: Option, + side: Option, + state: Option, +} + +impl Default for PacketAttr { + fn default() -> Self { + Self { + span: Span::call_site(), + id: Default::default(), + tag: Default::default(), + name: Default::default(), + side: Default::default(), + state: Default::default(), + } + } +} + +fn parse_packet_helper_attr(attrs: &[Attribute]) -> Result> { + for attr in attrs { + if attr.path().is_ident("packet") { + let mut res = PacketAttr { + span: attr.span(), + id: None, + tag: None, + name: None, + side: None, + state: None, + }; + + attr.parse_nested_meta(|meta| { + if meta.path.is_ident("id") { + res.id = Some(meta.value()?.parse::()?); + Ok(()) + } else if meta.path.is_ident("tag") { + res.tag = Some(meta.value()?.parse::()?.base10_parse::()?); + Ok(()) + } else if meta.path.is_ident("name") { + res.name = Some(meta.value()?.parse::()?); + Ok(()) + } else if meta.path.is_ident("side") { + res.side = Some(meta.value()?.parse::()?); + Ok(()) + } else if meta.path.is_ident("state") { + res.state = Some(meta.value()?.parse::()?); + Ok(()) + } else { + Err(meta.error("unrecognized packet argument")) + } + })?; + + return Ok(Some(res)); + } + } + + Ok(None) +} diff --git a/vendor/valence/crates/valence_registry/Cargo.toml b/vendor/valence/crates/valence_registry/Cargo.toml new file mode 100644 index 00000000..8d75d1d2 --- /dev/null +++ b/vendor/valence/crates/valence_registry/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "valence_registry" +description = "Dynamic registries for Valence" +readme = "README.md" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[dependencies] +bevy_app.workspace = true +bevy_ecs.workspace = true +indexmap.workspace = true +serde_json.workspace = true +serde.workspace = true +tracing.workspace = true +valence_protocol.workspace = true +anyhow.workspace = true +valence_ident.workspace = true +valence_nbt = { workspace = true, features = ["serde"] } +valence_server_common.workspace = true diff --git a/vendor/valence/crates/valence_registry/README.md b/vendor/valence/crates/valence_registry/README.md new file mode 100644 index 00000000..088afc7c --- /dev/null +++ b/vendor/valence/crates/valence_registry/README.md @@ -0,0 +1,3 @@ +# valence_registry + +Contains Minecraft's networked registries. This includes the registry codec sent to clients during the initial join. diff --git a/vendor/valence/crates/valence_registry/extracted/registry_codec.dat b/vendor/valence/crates/valence_registry/extracted/registry_codec.dat new file mode 100644 index 0000000000000000000000000000000000000000..63e4a3a43cf51257bbbcd22d8ec6751b4b7cc3c9 GIT binary patch literal 39164 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 Yr^_sK27ZRmgwJ4aZxgHcx@;l-ANg5?)c^nh literal 0 HcmV?d00001 diff --git a/vendor/valence/crates/valence_registry/extracted/tags.json b/vendor/valence/crates/valence_registry/extracted/tags.json new file mode 100644 index 00000000..69aadfb4 --- /dev/null +++ b/vendor/valence/crates/valence_registry/extracted/tags.json @@ -0,0 +1,6684 @@ +{ + "minecraft:banner_pattern": { + "minecraft:no_item_required": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34 + ], + "minecraft:pattern_item/creeper": [ + 36 + ], + "minecraft:pattern_item/flower": [ + 38 + ], + "minecraft:pattern_item/globe": [ + 35 + ], + "minecraft:pattern_item/mojang": [ + 39 + ], + "minecraft:pattern_item/piglin": [ + 40 + ], + "minecraft:pattern_item/skull": [ + 37 + ] + }, + "minecraft:block": { + "minecraft:acacia_logs": [ + 50, + 70, + 60, + 78 + ], + "minecraft:all_hanging_signs": [ + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 227, + 228, + 226, + 229 + ], + "minecraft:all_signs": [ + 186, + 187, + 188, + 189, + 191, + 192, + 828, + 829, + 193, + 194, + 190, + 199, + 200, + 201, + 202, + 204, + 205, + 830, + 831, + 206, + 207, + 203, + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 227, + 228, + 226, + 229 + ], + "minecraft:ancient_city_replaceable": [ + 970, + 983, + 979, + 985, + 981, + 984, + 982, + 986, + 971, + 988, + 989, + 137 + ], + "minecraft:animals_spawnable_on": [ + 8 + ], + "minecraft:anvil": [ + 408, + 409, + 410 + ], + "minecraft:axolotls_spawnable_on": [ + 251 + ], + "minecraft:azalea_grows_on": [ + 9, + 8, + 11, + 10, + 323, + 968, + 963, + 969, + 55, + 34, + 36, + 35, + 494, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 249, + 912 + ], + "minecraft:azalea_root_replaceable": [ + 1, + 2, + 4, + 6, + 909, + 970, + 9, + 8, + 11, + 10, + 323, + 968, + 963, + 969, + 55, + 494, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 36, + 251, + 37, + 34, + 249, + 912 + ], + "minecraft:bamboo_blocks": [ + 56, + 65 + ], + "minecraft:bamboo_plantable_on": [ + 34, + 36, + 35, + 9, + 8, + 11, + 10, + 323, + 968, + 963, + 969, + 55, + 727, + 726, + 37, + 38 + ], + "minecraft:banners": [ + 503, + 504, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518, + 519, + 520, + 521, + 522, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 532, + 533, + 534 + ], + "minecraft:base_stone_nether": [ + 256, + 259, + 849 + ], + "minecraft:base_stone_overworld": [ + 1, + 2, + 4, + 6, + 909, + 970 + ], + "minecraft:beacon_base_blocks": [ + 840, + 347, + 181, + 163, + 164 + ], + "minecraft:beds": [ + 117, + 118, + 114, + 115, + 112, + 110, + 116, + 106, + 111, + 108, + 105, + 104, + 109, + 113, + 103, + 107 + ], + "minecraft:bee_growables": [ + 601, + 383, + 384, + 183, + 316, + 315, + 598, + 599, + 788, + 956, + 957 + ], + "minecraft:beehives": [ + 836, + 837 + ], + "minecraft:big_dripleaf_placeable": [ + 251, + 963, + 9, + 8, + 11, + 10, + 323, + 968, + 969, + 55, + 184 + ], + "minecraft:birch_logs": [ + 48, + 68, + 58, + 76 + ], + "c:bookshelves": [ + 167 + ], + "c:budding_blocks": [ + 904 + ], + "c:buds": [ + 908, + 907, + 906 + ], + "minecraft:buttons": [ + 385, + 386, + 387, + 388, + 389, + 391, + 824, + 825, + 392, + 393, + 390, + 246, + 864 + ], + "minecraft:campfires": [ + 786, + 787 + ], + "minecraft:candle_cakes": [ + 886, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 899, + 900, + 901, + 902 + ], + "minecraft:candles": [ + 869, + 870, + 871, + 872, + 873, + 874, + 875, + 876, + 877, + 878, + 879, + 880, + 881, + 882, + 883, + 884, + 885 + ], + "minecraft:cauldrons": [ + 331, + 332, + 333, + 334 + ], + "minecraft:cave_vines": [ + 957, + 956 + ], + "minecraft:ceiling_hanging_signs": [ + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218 + ], + "minecraft:cherry_logs": [ + 51, + 71, + 61, + 79 + ], + "c:chests": [ + 177, + 344, + 411 + ], + "minecraft:climbable": [ + 196, + 317, + 772, + 805, + 806, + 807, + 808, + 956, + 957 + ], + "c:clusters": [ + 905 + ], + "minecraft:coal_ores": [ + 43, + 44 + ], + "minecraft:combination_step_sound_blocks": [ + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 961, + 247, + 797, + 796, + 809 + ], + "minecraft:completes_find_tree_tutorial": [ + 52, + 72, + 62, + 80, + 46, + 66, + 63, + 74, + 50, + 70, + 60, + 78, + 48, + 68, + 58, + 76, + 49, + 69, + 59, + 77, + 47, + 67, + 57, + 75, + 53, + 73, + 64, + 81, + 51, + 71, + 61, + 79, + 798, + 799, + 800, + 801, + 789, + 790, + 791, + 792, + 85, + 82, + 83, + 88, + 86, + 84, + 90, + 91, + 89, + 87, + 608, + 795 + ], + "minecraft:convertable_to_mud": [ + 9, + 10, + 968 + ], + "minecraft:copper_ores": [ + 923, + 924 + ], + "minecraft:coral_blocks": [ + 688, + 689, + 690, + 691, + 692 + ], + "minecraft:coral_plants": [ + 698, + 699, + 700, + 701, + 702 + ], + "minecraft:corals": [ + 698, + 699, + 700, + 701, + 702, + 708, + 709, + 710, + 711, + 712 + ], + "minecraft:crimson_stems": [ + 798, + 799, + 800, + 801 + ], + "minecraft:crops": [ + 601, + 383, + 384, + 183, + 316, + 315, + 598, + 599 + ], + "minecraft:crystal_sound_blocks": [ + 903, + 904 + ], + "minecraft:dampens_vibrations": [ + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493 + ], + "minecraft:dark_oak_logs": [ + 52, + 72, + 62, + 80 + ], + "minecraft:dead_bush_may_place_on": [ + 34, + 36, + 35, + 494, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 9, + 8, + 11, + 10, + 323, + 968, + 963, + 969, + 55 + ], + "minecraft:deepslate_ore_replaceables": [ + 970, + 909 + ], + "minecraft:diamond_ores": [ + 179, + 180 + ], + "minecraft:dirt": [ + 9, + 8, + 11, + 10, + 323, + 968, + 963, + 969, + 55 + ], + "minecraft:doors": [ + 195, + 583, + 584, + 585, + 586, + 588, + 826, + 827, + 589, + 590, + 587, + 232 + ], + "minecraft:dragon_immune": [ + 464, + 31, + 335, + 336, + 603, + 351, + 604, + 605, + 832, + 833, + 146, + 170, + 842, + 337, + 309, + 843, + 1001 + ], + "minecraft:dragon_transparent": [ + 465, + 173, + 174 + ], + "minecraft:dripstone_replaceable_blocks": [ + 1, + 2, + 4, + 6, + 909, + 970 + ], + "minecraft:emerald_ores": [ + 342, + 343 + ], + "minecraft:enchantment_power_provider": [ + 167 + ], + "minecraft:enchantment_power_transmitter": [ + 0, + 32, + 33, + 123, + 124, + 125, + 126, + 127, + 173, + 174, + 247, + 317, + 318, + 465, + 501, + 502, + 611, + 729, + 730, + 731, + 796, + 797, + 809, + 967 + ], + "minecraft:enderman_holdable": [ + 147, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 160, + 159, + 148, + 9, + 8, + 11, + 10, + 323, + 968, + 963, + 969, + 55, + 34, + 36, + 37, + 161, + 162, + 166, + 250, + 251, + 255, + 265, + 312, + 803, + 802, + 809, + 794, + 793, + 796 + ], + "minecraft:fall_damage_resetting": [ + 196, + 317, + 772, + 805, + 806, + 807, + 808, + 956, + 957, + 788, + 122 + ], + "minecraft:features_cannot_replace": [ + 31, + 175, + 177, + 336, + 1001 + ], + "minecraft:fence_gates": [ + 570, + 568, + 572, + 569, + 319, + 567, + 820, + 821, + 573, + 574, + 571 + ], + "minecraft:fences": [ + 254, + 578, + 580, + 575, + 576, + 577, + 816, + 817, + 581, + 582, + 579, + 326 + ], + "minecraft:fire": [ + 173, + 174 + ], + "minecraft:flower_pots": [ + 355, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 366, + 357, + 358, + 359, + 360, + 361, + 363, + 379, + 380, + 381, + 365, + 382, + 376, + 377, + 378, + 728, + 844, + 845, + 846, + 847, + 995, + 996, + 364, + 362, + 356 + ], + "minecraft:flowers": [ + 147, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 160, + 159, + 148, + 497, + 498, + 500, + 499, + 600, + 91, + 960, + 30, + 87, + 962 + ], + "minecraft:foxes_spawnable_on": [ + 8, + 247, + 249, + 11, + 10 + ], + "minecraft:frog_prefer_jump_to": [ + 324, + 964 + ], + "minecraft:frogs_spawnable_on": [ + 8, + 969, + 54, + 55 + ], + "minecraft:geode_invalid_blocks": [ + 31, + 32, + 33, + 248, + 496, + 724 + ], + "c:glass_blocks": [ + 94, + 276, + 284, + 270, + 280, + 281, + 278, + 282, + 272, + 277, + 274, + 271, + 275, + 279, + 283, + 911, + 269, + 273 + ], + "c:glass_panes": [ + 311, + 448, + 456, + 442, + 452, + 453, + 450, + 454, + 444, + 449, + 446, + 443, + 447, + 451, + 455, + 441, + 445 + ], + "minecraft:goats_spawnable_on": [ + 8, + 1, + 247, + 249, + 496, + 37 + ], + "minecraft:gold_ores": [ + 39, + 45, + 40 + ], + "minecraft:guarded_by_piglins": [ + 163, + 774, + 177, + 344, + 860, + 411, + 994, + 613, + 629, + 625, + 626, + 623, + 621, + 627, + 617, + 622, + 619, + 616, + 615, + 620, + 624, + 628, + 614, + 618, + 39, + 45, + 40 + ], + "minecraft:hoglin_repellents": [ + 794, + 845, + 264, + 843 + ], + "minecraft:ice": [ + 248, + 496, + 724, + 606 + ], + "minecraft:impermeable": [ + 94, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 911 + ], + "minecraft:infiniburn_end": [ + 256, + 607, + 31 + ], + "minecraft:infiniburn_nether": [ + 256, + 607 + ], + "minecraft:infiniburn_overworld": [ + 256, + 607 + ], + "minecraft:inside_step_sound_blocks": [ + 912, + 916, + 318, + 324, + 908, + 962 + ], + "minecraft:invalid_spawn_inside": [ + 335, + 603 + ], + "minecraft:iron_ores": [ + 41, + 42 + ], + "minecraft:jungle_logs": [ + 49, + 69, + 59, + 77 + ], + "minecraft:lapis_ores": [ + 95, + 96 + ], + "minecraft:lava_pool_stone_cannot_replace": [ + 31, + 175, + 177, + 336, + 1001, + 85, + 82, + 83, + 88, + 86, + 84, + 90, + 91, + 89, + 87, + 52, + 72, + 62, + 80, + 46, + 66, + 63, + 74, + 50, + 70, + 60, + 78, + 48, + 68, + 58, + 76, + 49, + 69, + 59, + 77, + 47, + 67, + 57, + 75, + 53, + 73, + 64, + 81, + 51, + 71, + 61, + 79, + 798, + 799, + 800, + 801, + 789, + 790, + 791, + 792 + ], + "minecraft:leaves": [ + 85, + 82, + 83, + 88, + 86, + 84, + 90, + 91, + 89, + 87 + ], + "minecraft:logs": [ + 52, + 72, + 62, + 80, + 46, + 66, + 63, + 74, + 50, + 70, + 60, + 78, + 48, + 68, + 58, + 76, + 49, + 69, + 59, + 77, + 47, + 67, + 57, + 75, + 53, + 73, + 64, + 81, + 51, + 71, + 61, + 79, + 798, + 799, + 800, + 801, + 789, + 790, + 791, + 792 + ], + "minecraft:logs_that_burn": [ + 52, + 72, + 62, + 80, + 46, + 66, + 63, + 74, + 50, + 70, + 60, + 78, + 48, + 68, + 58, + 76, + 49, + 69, + 59, + 77, + 47, + 67, + 57, + 75, + 53, + 73, + 64, + 81, + 51, + 71, + 61, + 79 + ], + "minecraft:lush_ground_replaceable": [ + 1, + 2, + 4, + 6, + 909, + 970, + 957, + 956, + 9, + 8, + 11, + 10, + 323, + 968, + 963, + 969, + 55, + 251, + 37, + 34 + ], + "minecraft:maintains_farmland": [ + 315, + 313, + 316, + 314, + 601, + 383, + 384, + 598, + 148, + 599, + 183 + ], + "minecraft:mangrove_logs": [ + 53, + 73, + 64, + 81 + ], + "minecraft:mangrove_logs_can_grow_through": [ + 969, + 55, + 54, + 89, + 53, + 30, + 961, + 317 + ], + "minecraft:mangrove_roots_can_grow_through": [ + 969, + 55, + 54, + 961, + 317, + 30, + 247 + ], + "minecraft:mineable/axe": [ + 102, + 314, + 313, + 959, + 727, + 774, + 836, + 837, + 601, + 965, + 964, + 167, + 306, + 161, + 786, + 383, + 777, + 265, + 957, + 956, + 177, + 593, + 592, + 340, + 834, + 182, + 803, + 415, + 125, + 124, + 778, + 318, + 123, + 967, + 266, + 253, + 196, + 502, + 780, + 324, + 773, + 316, + 312, + 308, + 328, + 384, + 315, + 255, + 307, + 162, + 772, + 966, + 781, + 787, + 958, + 252, + 788, + 501, + 411, + 808, + 807, + 317, + 794, + 806, + 805, + 183, + 503, + 504, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518, + 519, + 520, + 521, + 522, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 532, + 533, + 534, + 570, + 568, + 572, + 569, + 319, + 567, + 820, + 821, + 573, + 574, + 571, + 52, + 72, + 62, + 80, + 46, + 66, + 63, + 74, + 50, + 70, + 60, + 78, + 48, + 68, + 58, + 76, + 49, + 69, + 59, + 77, + 47, + 67, + 57, + 75, + 53, + 73, + 64, + 81, + 51, + 71, + 61, + 79, + 798, + 799, + 800, + 801, + 789, + 790, + 791, + 792, + 13, + 14, + 15, + 16, + 17, + 19, + 810, + 811, + 20, + 21, + 18, + 23, + 24, + 25, + 26, + 27, + 29, + 960, + 30, + 28, + 186, + 187, + 188, + 189, + 191, + 192, + 828, + 829, + 193, + 194, + 190, + 199, + 200, + 201, + 202, + 204, + 205, + 830, + 831, + 206, + 207, + 203, + 385, + 386, + 387, + 388, + 389, + 391, + 824, + 825, + 392, + 393, + 390, + 195, + 583, + 584, + 585, + 586, + 588, + 826, + 827, + 589, + 590, + 587, + 254, + 578, + 580, + 575, + 576, + 577, + 816, + 817, + 581, + 582, + 579, + 233, + 234, + 235, + 236, + 237, + 239, + 814, + 815, + 240, + 241, + 238, + 539, + 540, + 541, + 542, + 543, + 545, + 812, + 813, + 546, + 547, + 544, + 176, + 348, + 349, + 350, + 457, + 459, + 822, + 823, + 460, + 461, + 458, + 289, + 287, + 291, + 288, + 285, + 286, + 818, + 819, + 292, + 293, + 290, + 54, + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 227, + 228, + 226, + 229, + 22, + 548, + 462, + 56, + 65, + 168 + ], + "minecraft:mineable/hoe": [ + 608, + 795, + 477, + 680, + 835, + 804, + 92, + 93, + 85, + 82, + 83, + 88, + 86, + 84, + 90, + 91, + 89, + 913, + 914, + 963, + 961, + 915, + 917, + 916, + 918, + 962, + 87 + ], + "minecraft:mineable/pickaxe": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 12, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 163, + 164, + 165, + 169, + 170, + 175, + 179, + 180, + 181, + 185, + 198, + 231, + 232, + 242, + 243, + 256, + 259, + 260, + 294, + 295, + 296, + 297, + 309, + 310, + 320, + 321, + 325, + 326, + 327, + 329, + 330, + 337, + 341, + 342, + 343, + 344, + 347, + 412, + 413, + 416, + 417, + 418, + 419, + 420, + 421, + 422, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 475, + 494, + 495, + 535, + 536, + 537, + 538, + 549, + 550, + 551, + 552, + 553, + 554, + 555, + 556, + 558, + 559, + 560, + 561, + 562, + 563, + 564, + 565, + 566, + 594, + 595, + 596, + 597, + 607, + 609, + 610, + 612, + 630, + 631, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 703, + 704, + 705, + 706, + 707, + 713, + 714, + 715, + 716, + 717, + 732, + 733, + 734, + 735, + 736, + 737, + 738, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 756, + 757, + 758, + 775, + 776, + 779, + 782, + 783, + 784, + 785, + 793, + 802, + 840, + 841, + 842, + 843, + 848, + 849, + 850, + 852, + 853, + 854, + 855, + 856, + 857, + 858, + 860, + 861, + 862, + 863, + 866, + 867, + 868, + 909, + 910, + 919, + 920, + 921, + 922, + 923, + 924, + 925, + 926, + 927, + 928, + 929, + 930, + 931, + 932, + 933, + 934, + 935, + 936, + 937, + 938, + 939, + 940, + 941, + 942, + 943, + 944, + 945, + 946, + 947, + 948, + 949, + 950, + 951, + 952, + 953, + 954, + 955, + 970, + 971, + 972, + 973, + 975, + 976, + 977, + 979, + 980, + 981, + 983, + 984, + 985, + 987, + 988, + 989, + 991, + 992, + 993, + 994, + 248, + 496, + 724, + 128, + 121, + 129, + 905, + 908, + 907, + 906, + 903, + 904, + 301, + 305, + 304, + 990, + 300, + 303, + 302, + 246, + 864, + 353, + 354, + 759, + 760, + 761, + 762, + 763, + 764, + 766, + 767, + 768, + 769, + 770, + 771, + 851, + 859, + 865, + 974, + 978, + 982, + 986, + 765, + 613, + 629, + 625, + 626, + 623, + 621, + 627, + 617, + 622, + 619, + 616, + 615, + 620, + 624, + 628, + 614, + 618, + 408, + 409, + 410, + 331, + 332, + 333, + 334, + 197, + 119, + 120, + 423, + 725, + 299, + 322, + 557, + 298 + ], + "minecraft:mineable/shovel": [ + 251, + 9, + 10, + 11, + 184, + 8, + 37, + 323, + 34, + 36, + 249, + 247, + 257, + 602, + 662, + 663, + 664, + 665, + 666, + 667, + 668, + 669, + 670, + 671, + 672, + 673, + 674, + 675, + 676, + 677, + 258, + 968, + 55, + 969, + 35, + 38 + ], + "minecraft:mooshrooms_spawnable_on": [ + 323 + ], + "minecraft:moss_replaceable": [ + 1, + 2, + 4, + 6, + 909, + 970, + 957, + 956, + 9, + 8, + 11, + 10, + 323, + 968, + 963, + 969, + 55 + ], + "minecraft:mushroom_grow_block": [ + 323, + 11, + 802, + 793 + ], + "minecraft:needs_diamond_tool": [ + 170, + 842, + 840, + 843, + 841 + ], + "minecraft:needs_iron_tool": [ + 181, + 179, + 180, + 342, + 343, + 347, + 163, + 994, + 39, + 40, + 242, + 243 + ], + "minecraft:needs_stone_tool": [ + 164, + 992, + 41, + 42, + 97, + 95, + 96, + 922, + 993, + 923, + 924, + 936, + 932, + 928, + 920, + 934, + 930, + 926, + 919, + 933, + 929, + 925, + 921, + 935, + 931, + 927, + 937, + 952, + 948, + 944, + 938, + 950, + 946, + 942, + 939, + 951, + 947, + 943, + 940, + 949, + 945, + 941, + 953 + ], + "minecraft:nether_carver_replaceables": [ + 1, + 2, + 4, + 6, + 909, + 970, + 256, + 259, + 849, + 9, + 8, + 11, + 10, + 323, + 968, + 963, + 969, + 55, + 802, + 793, + 608, + 795, + 257, + 258 + ], + "minecraft:nylium": [ + 802, + 793 + ], + "minecraft:oak_logs": [ + 46, + 66, + 63, + 74 + ], + "minecraft:occludes_vibration_signals": [ + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145 + ], + "c:ores": [ + 242, + 243, + 923, + 924, + 39, + 45, + 40, + 41, + 42, + 43, + 44, + 342, + 343, + 95, + 96, + 179, + 180, + 417 + ], + "minecraft:overworld_carver_replaceables": [ + 1, + 2, + 4, + 6, + 909, + 970, + 9, + 8, + 11, + 10, + 323, + 968, + 963, + 969, + 55, + 34, + 36, + 35, + 494, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 41, + 42, + 923, + 924, + 32, + 37, + 38, + 99, + 535, + 910, + 247, + 496, + 992, + 993 + ], + "minecraft:overworld_natural_logs": [ + 50, + 48, + 46, + 49, + 47, + 52, + 53, + 51 + ], + "minecraft:parrots_spawnable_on": [ + 8, + 0, + 85, + 82, + 83, + 88, + 86, + 84, + 90, + 91, + 89, + 87, + 52, + 72, + 62, + 80, + 46, + 66, + 63, + 74, + 50, + 70, + 60, + 78, + 48, + 68, + 58, + 76, + 49, + 69, + 59, + 77, + 47, + 67, + 57, + 75, + 53, + 73, + 64, + 81, + 51, + 71, + 61, + 79, + 798, + 799, + 800, + 801, + 789, + 790, + 791, + 792 + ], + "minecraft:piglin_repellents": [ + 174, + 261, + 785, + 262, + 787 + ], + "minecraft:planks": [ + 13, + 14, + 15, + 16, + 17, + 19, + 810, + 811, + 20, + 21, + 18 + ], + "minecraft:polar_bears_spawnable_on_alternate": [ + 248 + ], + "minecraft:portals": [ + 264, + 335, + 603 + ], + "minecraft:pressure_plates": [ + 412, + 413, + 233, + 234, + 235, + 236, + 237, + 239, + 814, + 815, + 240, + 241, + 238, + 231, + 863 + ], + "minecraft:prevent_mob_spawning_inside": [ + 197, + 119, + 120, + 423 + ], + "c:quartz_ores": [ + 417 + ], + "minecraft:rabbits_spawnable_on": [ + 8, + 247, + 249, + 34 + ], + "minecraft:rails": [ + 197, + 119, + 120, + 423 + ], + "c:red_sandstone_blocks": [ + 535, + 536, + 537, + 566 + ], + "c:red_sandstone_slabs": [ + 560, + 561, + 747 + ], + "c:red_sandstone_stairs": [ + 538, + 733 + ], + "minecraft:redstone_ores": [ + 242, + 243 + ], + "minecraft:replaceable": [ + 0, + 32, + 33, + 123, + 124, + 125, + 126, + 127, + 173, + 174, + 247, + 317, + 318, + 465, + 501, + 502, + 611, + 729, + 730, + 731, + 796, + 797, + 809, + 967 + ], + "minecraft:replaceable_by_trees": [ + 85, + 82, + 83, + 88, + 86, + 84, + 90, + 91, + 89, + 87, + 123, + 124, + 125, + 317, + 318, + 497, + 498, + 499, + 500, + 501, + 502, + 967, + 600, + 32, + 126, + 127, + 796, + 797, + 809 + ], + "minecraft:sand": [ + 34, + 36, + 35 + ], + "c:sandstone_blocks": [ + 99, + 100, + 101, + 564, + 535, + 536, + 537, + 566 + ], + "c:sandstone_slabs": [ + 551, + 552, + 752, + 560, + 561, + 747 + ], + "c:sandstone_stairs": [ + 341, + 739, + 538, + 733 + ], + "minecraft:saplings": [ + 23, + 24, + 25, + 26, + 27, + 29, + 959, + 960, + 30, + 28 + ], + "minecraft:sculk_replaceable": [ + 1, + 2, + 4, + 6, + 909, + 970, + 9, + 8, + 11, + 10, + 323, + 968, + 963, + 969, + 55, + 494, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 802, + 793, + 256, + 259, + 849, + 34, + 36, + 37, + 257, + 258, + 910, + 991, + 251, + 955, + 337, + 535, + 99 + ], + "minecraft:sculk_replaceable_world_gen": [ + 1, + 2, + 4, + 6, + 909, + 970, + 9, + 8, + 11, + 10, + 323, + 968, + 963, + 969, + 55, + 494, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 802, + 793, + 256, + 259, + 849, + 34, + 36, + 37, + 257, + 258, + 910, + 991, + 251, + 955, + 337, + 535, + 99, + 983, + 979, + 971, + 988, + 989, + 975 + ], + "c:shulker_boxes": [ + 613, + 625, + 626, + 623, + 621, + 627, + 617, + 622, + 619, + 616, + 615, + 620, + 624, + 628, + 614, + 618, + 629 + ], + "minecraft:shulker_boxes": [ + 613, + 629, + 625, + 626, + 623, + 621, + 627, + 617, + 622, + 619, + 616, + 615, + 620, + 624, + 628, + 614, + 618 + ], + "minecraft:signs": [ + 186, + 187, + 188, + 189, + 191, + 192, + 828, + 829, + 193, + 194, + 190, + 199, + 200, + 201, + 202, + 204, + 205, + 830, + 831, + 206, + 207, + 203 + ], + "minecraft:slabs": [ + 539, + 540, + 541, + 542, + 543, + 545, + 812, + 813, + 546, + 547, + 544, + 548, + 549, + 550, + 556, + 551, + 562, + 559, + 560, + 555, + 554, + 558, + 553, + 473, + 474, + 475, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 756, + 757, + 758, + 552, + 561, + 852, + 857, + 862, + 973, + 977, + 981, + 985, + 950, + 951, + 952, + 933, + 934, + 935, + 936, + 949, + 557 + ], + "minecraft:small_dripleaf_placeable": [ + 251, + 963 + ], + "minecraft:small_flowers": [ + 147, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 160, + 159, + 148 + ], + "minecraft:smelts_to_glass": [ + 34, + 36 + ], + "minecraft:snaps_goat_horn": [ + 50, + 48, + 46, + 49, + 47, + 52, + 53, + 51, + 1, + 496, + 41, + 43, + 923, + 342 + ], + "minecraft:sniffer_diggable_block": [ + 9, + 8, + 11, + 10, + 968, + 963, + 969, + 55 + ], + "minecraft:sniffer_egg_hatch_boost": [ + 963 + ], + "minecraft:snow": [ + 247, + 249, + 912 + ], + "minecraft:snow_layer_can_survive_on": [ + 838, + 257, + 969 + ], + "minecraft:snow_layer_cannot_survive_on": [ + 248, + 496, + 464 + ], + "minecraft:soul_fire_base_blocks": [ + 257, + 258 + ], + "minecraft:soul_speed_blocks": [ + 257, + 258 + ], + "minecraft:spruce_logs": [ + 47, + 67, + 57, + 75 + ], + "minecraft:stairs": [ + 176, + 348, + 349, + 350, + 457, + 459, + 822, + 823, + 460, + 461, + 458, + 462, + 198, + 341, + 327, + 321, + 320, + 596, + 422, + 538, + 471, + 470, + 472, + 732, + 733, + 734, + 735, + 736, + 737, + 738, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 850, + 858, + 861, + 972, + 976, + 980, + 984, + 929, + 930, + 931, + 932, + 946, + 947, + 948, + 945, + 322 + ], + "minecraft:standing_signs": [ + 186, + 187, + 188, + 189, + 191, + 192, + 828, + 829, + 193, + 194, + 190 + ], + "minecraft:stone_bricks": [ + 294, + 295, + 296, + 297 + ], + "minecraft:stone_buttons": [ + 246, + 864 + ], + "minecraft:stone_ore_replaceables": [ + 1, + 2, + 4, + 6 + ], + "minecraft:stone_pressure_plates": [ + 231, + 863 + ], + "minecraft:strider_warm_blocks": [ + 33 + ], + "minecraft:sword_efficient": [ + 85, + 82, + 83, + 88, + 86, + 84, + 90, + 91, + 89, + 87, + 23, + 24, + 25, + 26, + 27, + 29, + 959, + 960, + 30, + 28, + 147, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 160, + 159, + 148, + 601, + 383, + 384, + 183, + 316, + 315, + 598, + 599, + 123, + 124, + 125, + 317, + 318, + 497, + 498, + 499, + 500, + 501, + 502, + 967, + 600, + 161, + 162, + 252, + 255, + 265, + 266, + 312, + 313, + 314, + 324, + 340, + 788, + 956, + 957, + 958, + 961, + 962, + 964, + 965, + 966, + 328, + 794, + 796, + 797, + 803, + 805, + 806, + 807, + 808, + 809, + 592, + 593 + ], + "minecraft:tall_flowers": [ + 497, + 498, + 500, + 499, + 600 + ], + "minecraft:terracotta": [ + 494, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440 + ], + "minecraft:trail_ruins_replaceable": [ + 37 + ], + "minecraft:trapdoors": [ + 289, + 287, + 291, + 288, + 285, + 286, + 818, + 819, + 292, + 293, + 290, + 466 + ], + "c:uncolored_sandstone_blocks": [ + 99, + 100, + 101, + 564 + ], + "c:uncolored_sandstone_slabs": [ + 551, + 552, + 752 + ], + "c:uncolored_sandstone_stairs": [ + 341, + 739 + ], + "minecraft:underwater_bonemeals": [ + 126, + 698, + 699, + 700, + 701, + 702, + 708, + 709, + 710, + 711, + 712, + 718, + 719, + 720, + 721, + 722 + ], + "minecraft:unstable_bottom_center": [ + 570, + 568, + 572, + 569, + 319, + 567, + 820, + 821, + 573, + 574, + 571 + ], + "minecraft:valid_spawn": [ + 8, + 11 + ], + "minecraft:vibration_resonators": [ + 903 + ], + "c:villager_job_sites": [ + 774, + 776, + 330, + 777, + 331, + 333, + 332, + 334, + 834, + 778, + 779, + 780, + 773, + 781, + 775, + 782 + ], + "minecraft:wall_corals": [ + 718, + 719, + 720, + 721, + 722 + ], + "minecraft:wall_hanging_signs": [ + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 227, + 228, + 226, + 229 + ], + "minecraft:wall_post_override": [ + 171, + 261, + 244, + 346, + 186, + 187, + 188, + 189, + 191, + 192, + 828, + 829, + 193, + 194, + 190, + 199, + 200, + 201, + 202, + 204, + 205, + 830, + 831, + 206, + 207, + 203, + 503, + 504, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518, + 519, + 520, + 521, + 522, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 532, + 533, + 534, + 412, + 413, + 233, + 234, + 235, + 236, + 237, + 239, + 814, + 815, + 240, + 241, + 238, + 231, + 863 + ], + "minecraft:wall_signs": [ + 199, + 200, + 201, + 202, + 204, + 205, + 830, + 831, + 206, + 207, + 203 + ], + "minecraft:walls": [ + 353, + 354, + 759, + 760, + 761, + 762, + 763, + 764, + 766, + 767, + 768, + 769, + 770, + 771, + 851, + 859, + 865, + 974, + 978, + 982, + 986, + 765 + ], + "minecraft:warped_stems": [ + 789, + 790, + 791, + 792 + ], + "minecraft:wart_blocks": [ + 608, + 795 + ], + "minecraft:wither_immune": [ + 464, + 31, + 335, + 336, + 603, + 351, + 604, + 605, + 832, + 833, + 146, + 465, + 1001 + ], + "minecraft:wither_summon_base_blocks": [ + 257, + 258 + ], + "minecraft:wolves_spawnable_on": [ + 8, + 247, + 249 + ], + "c:wooden_barrels": [ + 774 + ], + "minecraft:wooden_buttons": [ + 385, + 386, + 387, + 388, + 389, + 391, + 824, + 825, + 392, + 393, + 390 + ], + "minecraft:wooden_doors": [ + 195, + 583, + 584, + 585, + 586, + 588, + 826, + 827, + 589, + 590, + 587 + ], + "minecraft:wooden_fences": [ + 254, + 578, + 580, + 575, + 576, + 577, + 816, + 817, + 581, + 582, + 579 + ], + "minecraft:wooden_pressure_plates": [ + 233, + 234, + 235, + 236, + 237, + 239, + 814, + 815, + 240, + 241, + 238 + ], + "minecraft:wooden_slabs": [ + 539, + 540, + 541, + 542, + 543, + 545, + 812, + 813, + 546, + 547, + 544 + ], + "minecraft:wooden_stairs": [ + 176, + 348, + 349, + 350, + 457, + 459, + 822, + 823, + 460, + 461, + 458 + ], + "minecraft:wooden_trapdoors": [ + 289, + 287, + 291, + 288, + 285, + 286, + 818, + 819, + 292, + 293, + 290 + ], + "minecraft:wool": [ + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145 + ], + "minecraft:wool_carpets": [ + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493 + ] + }, + "minecraft:cat_variant": { + "minecraft:default_spawns": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9 + ], + "minecraft:full_moon_spawns": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10 + ] + }, + "minecraft:damage_type": { + "minecraft:always_hurts_ender_dragons": [ + 13, + 7, + 32, + 1 + ], + "minecraft:always_most_significant_fall": [ + 29 + ], + "minecraft:always_triggers_silverfish": [ + 24 + ], + "minecraft:avoids_guardian_thorns": [ + 24, + 38, + 13, + 7, + 32, + 1 + ], + "minecraft:burns_armor_stands": [ + 28 + ], + "minecraft:bypasses_armor": [ + 28, + 20, + 3, + 5, + 14, + 16, + 42, + 4, + 35, + 8, + 15, + 34, + 24, + 21, + 29, + 17, + 33, + 30 + ], + "minecraft:bypasses_effects": [ + 35 + ], + "minecraft:bypasses_enchantments": [ + 33 + ], + "minecraft:bypasses_invulnerability": [ + 29, + 17 + ], + "minecraft:bypasses_resistance": [ + 29, + 17 + ], + "minecraft:bypasses_shield": [ + 28, + 20, + 3, + 5, + 14, + 16, + 42, + 4, + 35, + 8, + 15, + 34, + 24, + 21, + 29, + 17, + 33, + 30, + 9, + 11 + ], + "minecraft:damages_helmet": [ + 9, + 10, + 11 + ], + "minecraft:ignites_armor_stands": [ + 19 + ], + "minecraft:is_drowning": [ + 5 + ], + "minecraft:is_explosion": [ + 13, + 7, + 32, + 1 + ], + "minecraft:is_fall": [ + 8, + 34 + ], + "minecraft:is_fire": [ + 19, + 28, + 22, + 18, + 41, + 12 + ], + "minecraft:is_freezing": [ + 15 + ], + "minecraft:is_lightning": [ + 23 + ], + "minecraft:is_projectile": [ + 0, + 40, + 27, + 41, + 12, + 43, + 39 + ], + "minecraft:no_anger": [ + 26 + ], + "minecraft:no_impact": [ + 5 + ], + "minecraft:witch_resistant_to": [ + 24, + 21, + 33, + 38 + ], + "minecraft:wither_immune_to": [ + 5 + ] + }, + "minecraft:enchantment": { + "c:entity_defense_enhancement": [ + 2, + 0, + 3, + 4, + 1, + 5 + ], + "c:entity_movement_enhancement": [ + 12, + 8, + 11 + ], + "c:fortune": [ + 23 + ], + "c:looting": [ + 18 + ], + "c:weapon_damage_enhancement": [ + 15, + 31, + 14, + 24, + 13 + ] + }, + "minecraft:entity_type": { + "minecraft:arrows": [ + 3, + 94 + ], + "minecraft:axolotl_always_hostiles": [ + 23, + 46, + 25 + ], + "minecraft:axolotl_hunt_targets": [ + 105, + 78, + 81, + 16, + 96, + 44, + 99 + ], + "minecraft:beehive_inhabitors": [ + 6 + ], + "c:boats": [ + 9, + 13 + ], + "c:bosses": [ + 27, + 113 + ], + "minecraft:dismounts_underwater": [ + 10, + 15, + 21, + 49, + 60, + 66, + 72, + 80, + 95, + 98, + 103, + 119 + ], + "minecraft:fall_damage_immune": [ + 53, + 91, + 83, + 0, + 5, + 6, + 7, + 11, + 15, + 41, + 71, + 62, + 67, + 70, + 113 + ], + "minecraft:freeze_hurts_extra_types": [ + 98, + 7, + 62 + ], + "minecraft:freeze_immune_entity_types": [ + 97, + 76, + 91, + 113 + ], + "minecraft:frog_food": [ + 88, + 62 + ], + "minecraft:impact_projectiles": [ + 3, + 94, + 92, + 57, + 89, + 24, + 104, + 22, + 115 + ], + "c:minecarts": [ + 64, + 102, + 14, + 40, + 17, + 48, + 93 + ], + "minecraft:powder_snow_walkable_mobs": [ + 79, + 30, + 85, + 38 + ], + "minecraft:raiders": [ + 31, + 75, + 80, + 109, + 51, + 112 + ], + "minecraft:skeletons": [ + 86, + 97, + 114 + ] + }, + "minecraft:fluid": { + "c:lava": [ + 4, + 3 + ], + "minecraft:lava": [ + 4, + 3 + ], + "c:water": [ + 2, + 1 + ], + "minecraft:water": [ + 2, + 1 + ] + }, + "minecraft:game_event": { + "minecraft:allay_can_listen": [ + 34 + ], + "minecraft:ignore_vibrations_sneaking": [ + 27, + 37, + 42, + 43, + 30, + 29 + ], + "minecraft:shrieker_can_listen": [ + 38 + ], + "minecraft:vibrations": [ + 1, + 2, + 3, + 5, + 6, + 7, + 8, + 0, + 4, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 25, + 26, + 27, + 28, + 29, + 33, + 34, + 35, + 36, + 37, + 39, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 24 + ], + "minecraft:warden_can_listen": [ + 1, + 2, + 3, + 5, + 6, + 7, + 8, + 0, + 4, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 25, + 26, + 27, + 28, + 29, + 33, + 34, + 35, + 36, + 37, + 39, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 40, + 38 + ] + }, + "minecraft:instrument": { + "minecraft:goat_horns": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "minecraft:regular_goat_horns": [ + 0, + 1, + 2, + 3 + ], + "minecraft:screaming_goat_horns": [ + 4, + 5, + 6, + 7 + ] + }, + "minecraft:item": { + "minecraft:acacia_logs": [ + 114, + 148, + 127, + 137 + ], + "minecraft:anvil": [ + 397, + 398, + 399 + ], + "minecraft:arrows": [ + 761, + 1114, + 1113 + ], + "c:axes": [ + 800, + 790, + 780, + 785, + 795, + 805 + ], + "minecraft:axes": [ + 800, + 785, + 790, + 805, + 780, + 795 + ], + "minecraft:axolotl_tempt_items": [ + 878 + ], + "minecraft:bamboo_blocks": [ + 122, + 143 + ], + "minecraft:banners": [ + 1087, + 1088, + 1089, + 1090, + 1091, + 1092, + 1093, + 1094, + 1095, + 1096, + 1097, + 1098, + 1099, + 1100, + 1101, + 1102 + ], + "minecraft:beacon_payment_items": [ + 775, + 765, + 764, + 774, + 770 + ], + "minecraft:beds": [ + 938, + 939, + 935, + 936, + 933, + 931, + 937, + 927, + 932, + 929, + 926, + 925, + 930, + 934, + 924, + 928 + ], + "minecraft:birch_logs": [ + 112, + 146, + 125, + 135 + ], + "c:black_dyes": [ + 919 + ], + "c:blue_dyes": [ + 915 + ], + "minecraft:boats": [ + 736, + 738, + 740, + 742, + 744, + 748, + 750, + 752, + 746, + 737, + 739, + 741, + 743, + 745, + 749, + 751, + 753, + 747 + ], + "minecraft:bookshelf_books": [ + 885, + 1047, + 1068, + 1046, + 1120 + ], + "c:bookshelves": [ + 264 + ], + "c:bows": [ + 1143, + 760 + ], + "minecraft:breaks_decorated_pots": [ + 797, + 782, + 787, + 802, + 777, + 792, + 800, + 785, + 790, + 805, + 780, + 795, + 799, + 784, + 789, + 804, + 779, + 794, + 798, + 783, + 788, + 803, + 778, + 793, + 801, + 786, + 791, + 806, + 781, + 796, + 1139 + ], + "c:brown_dyes": [ + 916 + ], + "c:budding_blocks": [ + 73 + ], + "c:buds": [ + 1207, + 1208, + 1209 + ], + "minecraft:buttons": [ + 662, + 663, + 664, + 665, + 666, + 668, + 671, + 672, + 669, + 670, + 667, + 660, + 661 + ], + "minecraft:candles": [ + 1190, + 1191, + 1192, + 1193, + 1194, + 1195, + 1196, + 1197, + 1198, + 1199, + 1200, + 1201, + 1202, + 1203, + 1204, + 1205, + 1206 + ], + "minecraft:cherry_logs": [ + 115, + 149, + 128, + 138 + ], + "minecraft:chest_boats": [ + 737, + 739, + 741, + 743, + 745, + 749, + 751, + 753, + 747 + ], + "c:chests": [ + 277, + 359, + 656 + ], + "minecraft:cluster_max_harvestables": [ + 799, + 789, + 794, + 804, + 784, + 779 + ], + "c:clusters": [ + 1210 + ], + "c:coal": [ + 762, + 763 + ], + "minecraft:coal_ores": [ + 49, + 50 + ], + "minecraft:coals": [ + 762, + 763 + ], + "minecraft:compasses": [ + 888, + 889 + ], + "minecraft:completes_find_tree_tutorial": [ + 116, + 150, + 129, + 139, + 110, + 144, + 123, + 133, + 114, + 148, + 127, + 137, + 112, + 146, + 125, + 135, + 113, + 147, + 126, + 136, + 111, + 145, + 124, + 134, + 117, + 151, + 130, + 140, + 115, + 149, + 128, + 138, + 120, + 131, + 152, + 141, + 121, + 132, + 153, + 142, + 157, + 154, + 155, + 160, + 158, + 156, + 162, + 163, + 161, + 159, + 495, + 496 + ], + "c:copper_ingots": [ + 772 + ], + "minecraft:copper_ores": [ + 53, + 54 + ], + "minecraft:creeper_drop_music_discs": [ + 1122, + 1123, + 1124, + 1125, + 1126, + 1127, + 1128, + 1129, + 1130, + 1131, + 1132, + 1133 + ], + "minecraft:creeper_igniters": [ + 758, + 1045 + ], + "minecraft:crimson_stems": [ + 120, + 131, + 152, + 141 + ], + "c:cyan_dyes": [ + 913 + ], + "minecraft:dampens_vibrations": [ + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439 + ], + "minecraft:dark_oak_logs": [ + 116, + 150, + 129, + 139 + ], + "minecraft:decorated_pot_ingredients": [ + 881, + 1235, + 1236, + 1237, + 1238, + 1239, + 1240, + 1241, + 1242, + 1243, + 1244, + 1245, + 1246, + 1247, + 1248, + 1249, + 1250, + 1251, + 1252, + 1253, + 1254 + ], + "minecraft:decorated_pot_sherds": [ + 1235, + 1236, + 1237, + 1238, + 1239, + 1240, + 1241, + 1242, + 1243, + 1244, + 1245, + 1246, + 1247, + 1248, + 1249, + 1250, + 1251, + 1252, + 1253, + 1254 + ], + "minecraft:diamond_ores": [ + 63, + 64 + ], + "c:diamonds": [ + 764 + ], + "minecraft:dirt": [ + 15, + 14, + 17, + 16, + 342, + 18, + 225, + 19, + 119 + ], + "minecraft:doors": [ + 689, + 690, + 691, + 692, + 693, + 695, + 698, + 699, + 696, + 697, + 694, + 688 + ], + "c:dusts": [ + 894, + 635 + ], + "c:dyes": [ + 919, + 915, + 916, + 917, + 918, + 904, + 908, + 912, + 907, + 909, + 906, + 905, + 910, + 913, + 911, + 914 + ], + "minecraft:emerald_ores": [ + 59, + 60 + ], + "c:emeralds": [ + 765 + ], + "c:empty_buckets": [ + 868 + ], + "c:entity_water_buckets": [ + 879, + 877, + 875, + 878, + 876, + 880 + ], + "minecraft:fence_gates": [ + 716, + 714, + 718, + 715, + 712, + 713, + 721, + 722, + 719, + 720, + 717 + ], + "minecraft:fences": [ + 289, + 293, + 295, + 290, + 291, + 292, + 298, + 299, + 296, + 297, + 294, + 347 + ], + "minecraft:fishes": [ + 895, + 899, + 896, + 900, + 898, + 897 + ], + "minecraft:flowers": [ + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 443, + 444, + 446, + 445, + 210, + 163, + 176, + 42, + 159, + 224 + ], + "c:foods": [ + 759, + 809, + 815, + 841, + 842, + 844, + 845, + 895, + 896, + 897, + 898, + 899, + 900, + 940, + 943, + 944, + 947, + 948, + 949, + 950, + 951, + 959, + 1051, + 1052, + 1053, + 1054, + 1056, + 1065, + 1072, + 1073, + 1074, + 1085, + 1086, + 1104, + 1108, + 1110, + 1144, + 1165, + 1166, + 1173 + ], + "minecraft:fox_food": [ + 1165, + 1166 + ], + "minecraft:freeze_immune_wearables": [ + 819, + 818, + 817, + 816, + 1081 + ], + "c:gems": [ + 764, + 765, + 768, + 766 + ], + "c:glass_blocks": [ + 166, + 456, + 464, + 450, + 460, + 461, + 458, + 462, + 452, + 457, + 454, + 451, + 455, + 459, + 463, + 167, + 449, + 453 + ], + "c:glass_panes": [ + 335, + 472, + 480, + 466, + 476, + 477, + 474, + 478, + 468, + 473, + 470, + 467, + 471, + 475, + 479, + 465, + 469 + ], + "c:gold_ingots": [ + 774 + ], + "minecraft:gold_ores": [ + 55, + 65, + 56 + ], + "c:gray_dyes": [ + 911 + ], + "c:green_dyes": [ + 917 + ], + "minecraft:hanging_signs": [ + 857, + 858, + 859, + 861, + 862, + 860, + 863, + 866, + 867, + 864, + 865 + ], + "c:hoes": [ + 801, + 791, + 781, + 786, + 796, + 806 + ], + "minecraft:hoes": [ + 801, + 786, + 791, + 806, + 781, + 796 + ], + "minecraft:ignored_by_piglin_babies": [ + 873 + ], + "c:ingots": [ + 772, + 774, + 770, + 775 + ], + "c:iron_ingots": [ + 770 + ], + "minecraft:iron_ores": [ + 51, + 52 + ], + "minecraft:jungle_logs": [ + 113, + 147, + 126, + 136 + ], + "c:lapis": [ + 766 + ], + "minecraft:lapis_ores": [ + 61, + 62 + ], + "c:lava_buckets": [ + 870 + ], + "minecraft:leaves": [ + 157, + 154, + 155, + 160, + 158, + 156, + 162, + 163, + 161, + 159 + ], + "minecraft:lectern_books": [ + 1047, + 1046 + ], + "c:light_blue_dyes": [ + 907 + ], + "c:light_gray_dyes": [ + 912 + ], + "c:lime_dyes": [ + 909 + ], + "minecraft:logs": [ + 116, + 150, + 129, + 139, + 110, + 144, + 123, + 133, + 114, + 148, + 127, + 137, + 112, + 146, + 125, + 135, + 113, + 147, + 126, + 136, + 111, + 145, + 124, + 134, + 117, + 151, + 130, + 140, + 115, + 149, + 128, + 138, + 120, + 131, + 152, + 141, + 121, + 132, + 153, + 142 + ], + "minecraft:logs_that_burn": [ + 116, + 150, + 129, + 139, + 110, + 144, + 123, + 133, + 114, + 148, + 127, + 137, + 112, + 146, + 125, + 135, + 113, + 147, + 126, + 136, + 111, + 145, + 124, + 134, + 117, + 151, + 130, + 140, + 115, + 149, + 128, + 138 + ], + "c:magenta_dyes": [ + 906 + ], + "minecraft:mangrove_logs": [ + 117, + 151, + 130, + 140 + ], + "c:milk_buckets": [ + 874 + ], + "minecraft:music_discs": [ + 1122, + 1123, + 1124, + 1125, + 1126, + 1127, + 1128, + 1129, + 1130, + 1131, + 1132, + 1133, + 1137, + 1134, + 1136, + 1135 + ], + "c:netherite_ingots": [ + 775 + ], + "minecraft:non_flammable_wood": [ + 121, + 132, + 153, + 142, + 120, + 131, + 152, + 141, + 32, + 33, + 240, + 241, + 686, + 687, + 298, + 299, + 710, + 711, + 721, + 722, + 371, + 372, + 671, + 672, + 698, + 699, + 855, + 856, + 867, + 866 + ], + "minecraft:noteblock_top_instruments": [ + 1060, + 1057, + 1061, + 1062, + 1058, + 1063, + 1059 + ], + "c:nuggets": [ + 955, + 1119 + ], + "minecraft:oak_logs": [ + 110, + 144, + 123, + 133 + ], + "c:orange_dyes": [ + 905 + ], + "c:ores": [ + 57, + 58, + 53, + 54, + 55, + 65, + 56, + 51, + 52, + 49, + 50, + 59, + 60, + 61, + 62, + 63, + 64, + 66 + ], + "c:pickaxes": [ + 799, + 789, + 779, + 784, + 794, + 804 + ], + "minecraft:pickaxes": [ + 799, + 784, + 789, + 804, + 779, + 794 + ], + "minecraft:piglin_food": [ + 841, + 842 + ], + "minecraft:piglin_loved": [ + 55, + 65, + 56, + 76, + 1180, + 675, + 774, + 1162, + 892, + 1056, + 966, + 844, + 845, + 832, + 833, + 834, + 835, + 1079, + 787, + 789, + 788, + 790, + 791, + 773, + 71 + ], + "minecraft:piglin_repellents": [ + 309, + 1164, + 1168 + ], + "c:pink_dyes": [ + 910 + ], + "minecraft:planks": [ + 23, + 24, + 25, + 26, + 27, + 29, + 32, + 33, + 30, + 31, + 28 + ], + "c:potions": [ + 1115, + 1112, + 957 + ], + "c:purple_dyes": [ + 914 + ], + "c:quartz": [ + 767 + ], + "c:quartz_ores": [ + 66 + ], + "minecraft:rails": [ + 725, + 723, + 724, + 726 + ], + "c:raw_copper_blocks": [ + 70 + ], + "c:raw_copper_ores": [ + 771 + ], + "c:raw_gold_blocks": [ + 71 + ], + "c:raw_gold_ores": [ + 773 + ], + "c:raw_iron_blocks": [ + 69 + ], + "c:raw_iron_ores": [ + 769 + ], + "c:raw_ores": [ + 769, + 771, + 773 + ], + "c:red_dyes": [ + 918 + ], + "c:red_sandstone_blocks": [ + 488, + 489, + 490, + 260 + ], + "c:red_sandstone_slabs": [ + 253, + 254, + 618 + ], + "c:red_sandstone_stairs": [ + 491, + 600 + ], + "c:redstone_dusts": [ + 635 + ], + "minecraft:redstone_ores": [ + 57, + 58 + ], + "minecraft:sand": [ + 44, + 47, + 45 + ], + "c:sandstone_blocks": [ + 169, + 170, + 171, + 261, + 488, + 489, + 490, + 260 + ], + "c:sandstone_slabs": [ + 244, + 245, + 623, + 253, + 254, + 618 + ], + "c:sandstone_stairs": [ + 358, + 606, + 491, + 600 + ], + "minecraft:saplings": [ + 35, + 36, + 37, + 38, + 39, + 41, + 175, + 176, + 42, + 40 + ], + "c:shears": [ + 942 + ], + "c:shields": [ + 1116 + ], + "c:shovels": [ + 798, + 788, + 778, + 783, + 793, + 803 + ], + "minecraft:shovels": [ + 798, + 783, + 788, + 803, + 778, + 793 + ], + "c:shulker_boxes": [ + 500, + 512, + 513, + 510, + 508, + 514, + 504, + 509, + 506, + 503, + 502, + 507, + 511, + 515, + 501, + 505, + 516 + ], + "minecraft:signs": [ + 846, + 847, + 848, + 850, + 849, + 852, + 855, + 856, + 853, + 854, + 851 + ], + "minecraft:slabs": [ + 230, + 231, + 232, + 233, + 234, + 236, + 240, + 241, + 237, + 238, + 235, + 239, + 242, + 243, + 249, + 244, + 255, + 252, + 253, + 248, + 247, + 251, + 246, + 256, + 257, + 258, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 624, + 625, + 626, + 627, + 628, + 629, + 245, + 254, + 1178, + 1186, + 1182, + 630, + 631, + 633, + 632, + 108, + 107, + 106, + 93, + 92, + 91, + 90, + 109, + 250 + ], + "minecraft:small_flowers": [ + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209 + ], + "minecraft:smelts_to_glass": [ + 44, + 47 + ], + "minecraft:sniffer_food": [ + 1106 + ], + "minecraft:soul_fire_base_blocks": [ + 304, + 305 + ], + "c:spears": [ + 1139 + ], + "minecraft:spruce_logs": [ + 111, + 145, + 124, + 134 + ], + "minecraft:stairs": [ + 361, + 362, + 363, + 364, + 365, + 367, + 371, + 372, + 368, + 369, + 366, + 370, + 282, + 358, + 348, + 340, + 339, + 275, + 404, + 491, + 485, + 484, + 486, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 1179, + 1187, + 1183, + 613, + 614, + 616, + 615, + 89, + 88, + 87, + 86, + 104, + 103, + 102, + 105, + 341 + ], + "minecraft:stone_bricks": [ + 318, + 319, + 320, + 321 + ], + "minecraft:stone_buttons": [ + 660, + 661 + ], + "minecraft:stone_crafting_materials": [ + 22, + 1177, + 9 + ], + "minecraft:stone_tool_materials": [ + 22, + 1177, + 9 + ], + "c:swords": [ + 797, + 787, + 777, + 782, + 792, + 802 + ], + "minecraft:swords": [ + 797, + 782, + 787, + 802, + 777, + 792 + ], + "minecraft:tall_flowers": [ + 443, + 444, + 446, + 445, + 210 + ], + "minecraft:terracotta": [ + 440, + 405, + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 419, + 420 + ], + "minecraft:tools": [ + 797, + 782, + 787, + 802, + 777, + 792, + 800, + 785, + 790, + 805, + 780, + 795, + 799, + 784, + 789, + 804, + 779, + 794, + 798, + 783, + 788, + 803, + 778, + 793, + 801, + 786, + 791, + 806, + 781, + 796, + 1139 + ], + "minecraft:trapdoors": [ + 705, + 703, + 707, + 704, + 701, + 702, + 710, + 711, + 708, + 709, + 706, + 700 + ], + "minecraft:trim_materials": [ + 770, + 772, + 774, + 766, + 765, + 764, + 775, + 635, + 767, + 768 + ], + "minecraft:trim_templates": [ + 1223, + 1229, + 1221, + 1224, + 1220, + 1222, + 1228, + 1226, + 1219, + 1225, + 1227, + 1230, + 1231, + 1232, + 1233, + 1234 + ], + "minecraft:trimmable_armor": [ + 836, + 837, + 838, + 839, + 828, + 829, + 830, + 831, + 832, + 833, + 834, + 835, + 824, + 825, + 826, + 827, + 820, + 821, + 822, + 823, + 816, + 817, + 818, + 819, + 756 + ], + "c:uncolored_sandstone_blocks": [ + 169, + 170, + 171, + 261 + ], + "c:uncolored_sandstone_slabs": [ + 244, + 245, + 623 + ], + "c:uncolored_sandstone_stairs": [ + 358, + 606 + ], + "c:villager_job_sites": [ + 1154, + 1156, + 963, + 1157, + 964, + 1153, + 1158, + 1159, + 648, + 1145, + 1160, + 1155, + 1161 + ], + "minecraft:villager_plantable_seeds": [ + 813, + 1052, + 1051, + 1109, + 1106, + 1107 + ], + "minecraft:walls": [ + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 392, + 391, + 393, + 394, + 396, + 395, + 383 + ], + "minecraft:warped_stems": [ + 121, + 132, + 153, + 142 + ], + "minecraft:wart_blocks": [ + 495, + 496 + ], + "c:water_buckets": [ + 869 + ], + "c:white_dyes": [ + 904 + ], + "c:wooden_barrels": [ + 1154 + ], + "minecraft:wooden_buttons": [ + 662, + 663, + 664, + 665, + 666, + 668, + 671, + 672, + 669, + 670, + 667 + ], + "minecraft:wooden_doors": [ + 689, + 690, + 691, + 692, + 693, + 695, + 698, + 699, + 696, + 697, + 694 + ], + "minecraft:wooden_fences": [ + 289, + 293, + 295, + 290, + 291, + 292, + 298, + 299, + 296, + 297, + 294 + ], + "minecraft:wooden_pressure_plates": [ + 677, + 678, + 679, + 680, + 681, + 683, + 686, + 687, + 684, + 685, + 682 + ], + "minecraft:wooden_slabs": [ + 230, + 231, + 232, + 233, + 234, + 236, + 240, + 241, + 237, + 238, + 235 + ], + "minecraft:wooden_stairs": [ + 361, + 362, + 363, + 364, + 365, + 367, + 371, + 372, + 368, + 369, + 366 + ], + "minecraft:wooden_trapdoors": [ + 705, + 703, + 707, + 704, + 701, + 702, + 710, + 711, + 708, + 709, + 706 + ], + "minecraft:wool": [ + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195 + ], + "minecraft:wool_carpets": [ + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439 + ], + "c:yellow_dyes": [ + 908 + ] + }, + "minecraft:painting_variant": { + "minecraft:placeable": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 29 + ] + }, + "minecraft:point_of_interest_type": { + "minecraft:acquirable_job_site": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12 + ], + "minecraft:bee_home": [ + 15, + 16 + ], + "minecraft:village": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14 + ] + }, + "minecraft:worldgen/biome": { + "minecraft:allows_surface_slime_spawns": [ + 53, + 31 + ], + "minecraft:allows_tropical_fish_spawns_at_any_height": [ + 30 + ], + "c:aquatic": [ + 11, + 12, + 9, + 13, + 35, + 29, + 22, + 6, + 57, + 40, + 24 + ], + "c:aquatic_icy": [ + 24, + 11, + 22 + ], + "c:badlands": [ + 63, + 19, + 0 + ], + "c:beach": [ + 3, + 44, + 51 + ], + "c:birch_forest": [ + 4, + 36 + ], + "c:caves": [ + 10, + 15, + 30 + ], + "c:climate_cold": [ + 45, + 25, + 27, + 54, + 47, + 38, + 37, + 23, + 26 + ], + "c:climate_dry": [ + 34, + 48, + 7, + 58, + 2, + 63, + 19, + 0, + 14, + 41, + 42, + 62 + ], + "c:climate_hot": [ + 1, + 28, + 49, + 41, + 42, + 62, + 14, + 63, + 19, + 0, + 50, + 33, + 34, + 48, + 7, + 58, + 2 + ], + "c:climate_temperate": [ + 21, + 52, + 53, + 51, + 8, + 59, + 4, + 36, + 32, + 39 + ], + "c:climate_wet": [ + 11, + 12, + 9, + 13, + 35, + 29, + 22, + 6, + 57, + 40, + 24, + 31, + 53, + 30, + 1, + 28, + 49 + ], + "c:dead": [], + "c:deep_ocean": [ + 11, + 12, + 9, + 13 + ], + "c:desert": [ + 14 + ], + "c:end_islands": [], + "c:extreme_hills": [ + 60, + 61 + ], + "c:floral": [ + 52, + 32, + 20 + ], + "c:flower_forests": [ + 20 + ], + "c:forest": [ + 21, + 20, + 4, + 36, + 8, + 25 + ], + "minecraft:has_closer_water_fog": [ + 53, + 31 + ], + "minecraft:has_structure/ancient_city": [ + 10 + ], + "minecraft:has_structure/bastion_remnant": [ + 7, + 34, + 48, + 58 + ], + "minecraft:has_structure/buried_treasure": [ + 3, + 44 + ], + "minecraft:has_structure/desert_pyramid": [ + 14 + ], + "minecraft:has_structure/end_city": [ + 17, + 18 + ], + "minecraft:has_structure/igloo": [ + 47, + 45, + 46 + ], + "minecraft:has_structure/jungle_temple": [ + 1, + 28 + ], + "minecraft:has_structure/mineshaft": [ + 11, + 9, + 13, + 12, + 22, + 35, + 6, + 29, + 57, + 40, + 24, + 3, + 44, + 32, + 23, + 27, + 50, + 46, + 5, + 61, + 59, + 60, + 54, + 47, + 37, + 38, + 1, + 28, + 49, + 21, + 20, + 4, + 36, + 8, + 25, + 51, + 33, + 26, + 62, + 14, + 41, + 45, + 39, + 52, + 53, + 31, + 42, + 15, + 30 + ], + "minecraft:has_structure/mineshaft_mesa": [ + 0, + 19, + 63 + ], + "minecraft:has_structure/nether_fortress": [ + 34, + 48, + 7, + 58, + 2 + ], + "minecraft:has_structure/nether_fossil": [ + 48 + ], + "minecraft:has_structure/ocean_monument": [ + 11, + 9, + 13, + 12 + ], + "minecraft:has_structure/ocean_ruin_cold": [ + 22, + 6, + 35, + 11, + 9, + 13 + ], + "minecraft:has_structure/ocean_ruin_warm": [ + 29, + 57, + 12 + ], + "minecraft:has_structure/pillager_outpost": [ + 14, + 39, + 41, + 45, + 54, + 32, + 23, + 27, + 50, + 46, + 5, + 25 + ], + "minecraft:has_structure/ruined_portal_desert": [ + 14 + ], + "minecraft:has_structure/ruined_portal_jungle": [ + 1, + 28, + 49 + ], + "minecraft:has_structure/ruined_portal_mountain": [ + 0, + 19, + 63, + 61, + 59, + 60, + 42, + 62, + 51, + 32, + 23, + 27, + 50, + 46, + 5 + ], + "minecraft:has_structure/ruined_portal_nether": [ + 34, + 48, + 7, + 58, + 2 + ], + "minecraft:has_structure/ruined_portal_ocean": [ + 11, + 9, + 13, + 12, + 22, + 35, + 6, + 29, + 57 + ], + "minecraft:has_structure/ruined_portal_standard": [ + 3, + 44, + 40, + 24, + 54, + 47, + 37, + 38, + 21, + 20, + 4, + 36, + 8, + 25, + 33, + 26, + 15, + 30, + 41, + 45, + 39, + 52 + ], + "minecraft:has_structure/ruined_portal_swamp": [ + 53, + 31 + ], + "minecraft:has_structure/shipwreck": [ + 11, + 9, + 13, + 12, + 22, + 35, + 6, + 29, + 57 + ], + "minecraft:has_structure/shipwreck_beached": [ + 3, + 44 + ], + "minecraft:has_structure/stronghold": [ + 33, + 11, + 22, + 9, + 6, + 13, + 35, + 12, + 29, + 57, + 51, + 53, + 31, + 46, + 45, + 44, + 60, + 25, + 61, + 47, + 59, + 54, + 39, + 32, + 3, + 21, + 38, + 20, + 4, + 8, + 42, + 41, + 28, + 0, + 14, + 63, + 27, + 50, + 24, + 40, + 26, + 37, + 52, + 36, + 49, + 1, + 19, + 62, + 5, + 23, + 15, + 30, + 10 + ], + "minecraft:has_structure/swamp_hut": [ + 53 + ], + "minecraft:has_structure/trail_ruins": [ + 54, + 47, + 37, + 38, + 36, + 28 + ], + "minecraft:has_structure/village_desert": [ + 14 + ], + "minecraft:has_structure/village_plains": [ + 39, + 32 + ], + "minecraft:has_structure/village_savanna": [ + 41 + ], + "minecraft:has_structure/village_snowy": [ + 45 + ], + "minecraft:has_structure/village_taiga": [ + 54 + ], + "minecraft:has_structure/woodland_mansion": [ + 8 + ], + "c:icy": [ + 23, + 26 + ], + "c:in_nether": [ + 34, + 48, + 7, + 58, + 2 + ], + "c:in_overworld": [ + 33, + 11, + 22, + 9, + 6, + 13, + 35, + 12, + 29, + 57, + 51, + 53, + 31, + 46, + 45, + 44, + 60, + 25, + 61, + 47, + 59, + 54, + 39, + 32, + 3, + 21, + 38, + 20, + 4, + 8, + 42, + 41, + 28, + 0, + 14, + 63, + 27, + 50, + 24, + 40, + 26, + 37, + 52, + 36, + 49, + 1, + 19, + 62, + 5, + 23, + 15, + 30, + 10 + ], + "c:in_the_end": [ + 55, + 17, + 18, + 43, + 16 + ], + "minecraft:increased_fire_burnout": [ + 1, + 33, + 31, + 46, + 23, + 27, + 53, + 28 + ], + "minecraft:is_badlands": [ + 0, + 19, + 63 + ], + "minecraft:is_beach": [ + 3, + 44 + ], + "minecraft:is_deep_ocean": [ + 11, + 9, + 13, + 12 + ], + "minecraft:is_end": [ + 55, + 17, + 18, + 43, + 16 + ], + "minecraft:is_forest": [ + 21, + 20, + 4, + 36, + 8, + 25 + ], + "minecraft:is_hill": [ + 61, + 59, + 60 + ], + "minecraft:is_jungle": [ + 1, + 28, + 49 + ], + "minecraft:is_mountain": [ + 32, + 23, + 27, + 50, + 46, + 5 + ], + "minecraft:is_nether": [ + 34, + 48, + 7, + 58, + 2 + ], + "minecraft:is_ocean": [ + 11, + 9, + 13, + 12, + 22, + 35, + 6, + 29, + 57 + ], + "minecraft:is_overworld": [ + 33, + 11, + 22, + 9, + 6, + 13, + 35, + 12, + 29, + 57, + 51, + 53, + 31, + 46, + 45, + 44, + 60, + 25, + 61, + 47, + 59, + 54, + 39, + 32, + 3, + 21, + 38, + 20, + 4, + 8, + 42, + 41, + 28, + 0, + 14, + 63, + 27, + 50, + 24, + 40, + 26, + 37, + 52, + 36, + 49, + 1, + 19, + 62, + 5, + 23, + 15, + 30, + 10 + ], + "minecraft:is_river": [ + 40, + 24 + ], + "minecraft:is_savanna": [ + 41, + 42, + 62 + ], + "minecraft:is_taiga": [ + 54, + 47, + 37, + 38 + ], + "c:jungle": [ + 1, + 28, + 49 + ], + "c:mesa": [ + 63, + 19, + 0 + ], + "minecraft:mineshaft_blocking": [ + 10 + ], + "minecraft:more_frequent_drowned_spawns": [ + 40, + 24 + ], + "c:mountain": [ + 32, + 23, + 27, + 50, + 46, + 5 + ], + "c:mountain_peak": [ + 23, + 27, + 50 + ], + "c:mountain_slope": [ + 46 + ], + "c:mushroom": [ + 33 + ], + "c:nether_forests": [ + 58, + 7 + ], + "c:ocean": [ + 11, + 12, + 9, + 13, + 35, + 29, + 22, + 6, + 57 + ], + "c:plains": [ + 52, + 39 + ], + "minecraft:plays_underwater_music": [ + 11, + 9, + 13, + 12, + 22, + 35, + 6, + 29, + 57, + 40, + 24 + ], + "minecraft:polar_bears_spawn_on_alternate_blocks": [ + 22, + 11 + ], + "minecraft:produces_corals_from_bonemeal": [ + 57 + ], + "minecraft:reduce_water_ambient_spawns": [ + 40, + 24 + ], + "minecraft:required_ocean_monument_surrounding": [ + 11, + 9, + 13, + 12, + 22, + 35, + 6, + 29, + 57, + 40, + 24 + ], + "c:river": [ + 40, + 24 + ], + "c:savanna": [ + 41, + 42, + 62 + ], + "c:shallow_ocean": [ + 35, + 29, + 22, + 6, + 57 + ], + "minecraft:snow_golem_melts": [ + 0, + 2, + 7, + 14, + 19, + 34, + 41, + 42, + 48, + 58, + 62, + 63 + ], + "c:snowy": [ + 44, + 45, + 46, + 47 + ], + "c:snowy_plains": [ + 45 + ], + "minecraft:spawns_cold_variant_frogs": [ + 45, + 26, + 23, + 27, + 46, + 22, + 11, + 25, + 10, + 24, + 47, + 44, + 55, + 17, + 18, + 43, + 16 + ], + "minecraft:spawns_gold_rabbits": [ + 14 + ], + "minecraft:spawns_snow_foxes": [ + 45, + 26, + 22, + 47, + 24, + 44, + 23, + 27, + 46, + 25 + ], + "minecraft:spawns_warm_variant_frogs": [ + 14, + 57, + 1, + 28, + 49, + 41, + 42, + 62, + 34, + 48, + 7, + 58, + 2, + 0, + 19, + 63, + 31 + ], + "minecraft:spawns_white_rabbits": [ + 45, + 26, + 22, + 47, + 24, + 44, + 23, + 27, + 46, + 25 + ], + "c:stony_shores": [ + 51 + ], + "minecraft:stronghold_biased_to": [ + 39, + 52, + 45, + 26, + 14, + 21, + 20, + 4, + 8, + 36, + 37, + 38, + 54, + 47, + 41, + 42, + 61, + 60, + 59, + 62, + 28, + 49, + 1, + 0, + 19, + 63, + 32, + 25, + 46, + 23, + 27, + 50, + 33, + 15, + 30 + ], + "c:swamp": [ + 31, + 53 + ], + "c:taiga": [ + 54, + 47, + 37, + 38 + ], + "c:tree_coniferous": [ + 25, + 54, + 47, + 37, + 38 + ], + "c:tree_deciduous": [ + 21, + 59, + 20, + 4, + 8, + 36 + ], + "c:tree_jungle": [ + 1, + 28, + 49 + ], + "c:tree_savanna": [ + 41, + 42, + 62 + ], + "c:underground": [ + 10, + 15, + 30 + ], + "c:vegetation_dense": [ + 1, + 28, + 49, + 52 + ], + "c:vegetation_sparse": [ + 41, + 42, + 62, + 14, + 30 + ], + "c:void": [ + 56 + ], + "c:wasteland": [], + "minecraft:water_on_map_outlines": [ + 11, + 9, + 13, + 12, + 22, + 35, + 6, + 29, + 57, + 40, + 24, + 53, + 31 + ], + "c:windswept": [ + 61, + 60, + 59, + 62 + ], + "minecraft:without_patrol_spawns": [ + 33 + ], + "minecraft:without_wandering_trader_spawns": [ + 56 + ], + "minecraft:without_zombie_sieges": [ + 33 + ] + } +} \ No newline at end of file diff --git a/vendor/valence/crates/valence_registry/src/biome.rs b/vendor/valence/crates/valence_registry/src/biome.rs new file mode 100644 index 00000000..a20b7502 --- /dev/null +++ b/vendor/valence/crates/valence_registry/src/biome.rs @@ -0,0 +1,154 @@ +//! Contains biomes and the biome registry. Minecraft's default biomes are added +//! to the registry by default. +//! +//! ### **NOTE:** +//! - Modifying the biome registry after the server has started can +//! break invariants within instances and clients! Make sure there are no +//! instances or clients spawned before mutating. +//! - A biome named "minecraft:plains" must exist. Otherwise, vanilla clients +//! will be disconnected. + +use std::ops::{Deref, DerefMut}; + +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use serde::{Deserialize, Serialize}; +use tracing::error; +use valence_ident::{ident, Ident}; +use valence_nbt::serde::CompoundSerializer; + +use crate::codec::{RegistryCodec, RegistryValue}; +use crate::{Registry, RegistryIdx, RegistrySet}; + +pub struct BiomePlugin; + +impl Plugin for BiomePlugin { + fn build(&self, app: &mut App) { + app.init_resource::() + .add_systems(PreStartup, load_default_biomes) + .add_systems(PostUpdate, update_biome_registry.before(RegistrySet)); + } +} + +fn load_default_biomes(mut reg: ResMut, codec: Res) { + let mut helper = move || -> anyhow::Result<()> { + for value in codec.registry(BiomeRegistry::KEY) { + let biome = Biome::deserialize(value.element.clone())?; + + reg.insert(value.name.clone(), biome); + } + + // Move "plains" to the front so that `BiomeId::default()` is the ID of plains. + reg.swap_to_front(ident!("plains")); + + Ok(()) + }; + + if let Err(e) = helper() { + error!("failed to load default biomes from registry codec: {e:#}"); + } +} + +fn update_biome_registry(reg: Res, mut codec: ResMut) { + if reg.is_changed() { + let biomes = codec.registry_mut(BiomeRegistry::KEY); + + biomes.clear(); + + biomes.extend(reg.iter().map(|(_, name, biome)| { + RegistryValue { + name: name, + element: biome + .serialize(CompoundSerializer) + .expect("failed to serialize biome"), + } + })); + } +} + +#[derive(Resource, Default, Debug)] +pub struct BiomeRegistry { + reg: Registry, +} + +impl BiomeRegistry { + pub const KEY: Ident = ident!("worldgen/biome"); +} + +impl Deref for BiomeRegistry { + type Target = Registry; + + fn deref(&self) -> &Self::Target { + &self.reg + } +} + +impl DerefMut for BiomeRegistry { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.reg + } +} + +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default, Debug)] +pub struct BiomeId(u32); + +impl BiomeId { + pub const DEFAULT: Self = BiomeId(0); +} + +impl RegistryIdx for BiomeId { + const MAX: usize = u32::MAX as _; + + #[inline] + fn to_index(self) -> usize { + self.0 as _ + } + + #[inline] + fn from_index(idx: usize) -> Self { + Self(idx as _) + } +} + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct Biome { + pub downfall: f32, + pub effects: BiomeEffects, + pub has_precipitation: bool, + pub temperature: f32, + // TODO: more stuff. +} + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct BiomeEffects { + pub fog_color: u32, + pub sky_color: u32, + pub water_color: u32, + pub water_fog_color: u32, + #[serde(skip_serializing_if = "Option::is_none")] + pub grass_color: Option, + // TODO: more stuff. +} + +impl Default for Biome { + fn default() -> Self { + Self { + downfall: 0.4, + effects: BiomeEffects::default(), + has_precipitation: true, + temperature: 0.8, + } + } +} + +impl Default for BiomeEffects { + fn default() -> Self { + Self { + fog_color: 12638463, + sky_color: 7907327, + water_color: 4159204, + water_fog_color: 329011, + grass_color: None, + } + } +} diff --git a/vendor/valence/crates/valence_registry/src/codec.rs b/vendor/valence/crates/valence_registry/src/codec.rs new file mode 100644 index 00000000..bd73185e --- /dev/null +++ b/vendor/valence/crates/valence_registry/src/codec.rs @@ -0,0 +1,137 @@ +use std::collections::BTreeMap; + +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use tracing::error; +use valence_ident::Ident; +use valence_nbt::{compound, Compound, List, Value}; + +use crate::RegistrySet; + +pub(super) fn build(app: &mut App) { + app.init_resource::() + .add_systems(PostUpdate, cache_registry_codec.in_set(RegistrySet)); +} + +/// Contains the registry codec sent to all players while joining. This contains +/// information for biomes and dimensions among other things. +/// +/// Generally, end users should not manipulate the registry codec directly. Use +/// one of the other registry resources instead. +#[derive(Resource, Debug)] +pub struct RegistryCodec { + pub registries: BTreeMap>, + // TODO: store this in binary form? + cached_codec: Compound, +} + +#[derive(Clone, Debug)] +pub struct RegistryValue { + pub name: Ident, + pub element: Compound, +} + +impl RegistryCodec { + pub fn cached_codec(&self) -> &Compound { + &self.cached_codec + } + + pub fn registry(&self, registry_key: Ident) -> &Vec { + self.registries + .get(registry_key.as_str()) + .unwrap_or_else(|| panic!("missing registry for {registry_key}")) + } + + pub fn registry_mut(&mut self, registry_key: Ident) -> &mut Vec { + self.registries + .get_mut(registry_key.as_str()) + .unwrap_or_else(|| panic!("missing registry for {registry_key}")) + } +} + +impl Default for RegistryCodec { + fn default() -> Self { + let codec = include_bytes!("../extracted/registry_codec.dat"); + let compound = valence_nbt::from_binary(&mut codec.as_slice()) + .expect("failed to decode vanilla registry codec") + .0; + + let mut registries = BTreeMap::new(); + + for (k, v) in compound { + let reg_name: Ident = Ident::new(k).expect("invalid registry name"); + let mut reg_values = vec![]; + + let Value::Compound(mut outer) = v else { + error!("registry {reg_name} is not a compound"); + continue; + }; + + let values = match outer.remove("value") { + Some(Value::List(List::Compound(values))) => values, + Some(Value::List(List::End)) => continue, + _ => { + error!("missing \"value\" compound in {reg_name}"); + continue; + } + }; + + for mut value in values { + let Some(Value::String(name)) = value.remove("name") else { + error!("missing \"name\" string in value for {reg_name}"); + continue; + }; + + let name = match Ident::new(name) { + Ok(n) => n, + Err(e) => { + error!("invalid registry value name \"{}\"", e.0); + continue; + } + }; + + let Some(Value::Compound(element)) = value.remove("element") else { + error!("missing \"element\" compound in value for {reg_name}"); + continue; + }; + + reg_values.push(RegistryValue { name, element }); + } + + registries.insert(reg_name, reg_values); + } + + Self { + registries, + // Cache will be created later. + cached_codec: Compound::new(), + } + } +} + +fn cache_registry_codec(codec: ResMut) { + if codec.is_changed() { + let codec = codec.into_inner(); + + codec.cached_codec.clear(); + + for (reg_name, reg) in &codec.registries { + let mut value = vec![]; + + for (id, v) in reg.iter().enumerate() { + value.push(compound! { + "id" => id as i32, + "name" => v.name.as_str(), + "element" => v.element.clone(), + }); + } + + let registry = compound! { + "type" => reg_name.as_str(), + "value" => List::Compound(value), + }; + + codec.cached_codec.insert(reg_name.as_str(), registry); + } + } +} diff --git a/vendor/valence/crates/valence_registry/src/dimension_type.rs b/vendor/valence/crates/valence_registry/src/dimension_type.rs new file mode 100644 index 00000000..ba7a7f5c --- /dev/null +++ b/vendor/valence/crates/valence_registry/src/dimension_type.rs @@ -0,0 +1,196 @@ +//! Contains dimension types and the dimension type registry. Minecraft's +//! default dimensions are added to the registry by default. +//! +//! ### **NOTE:** +//! - Modifying the dimension type registry after the server has started can +//! break invariants within instances and clients! Make sure there are no +//! instances or clients spawned before mutating. + +use std::ops::{Deref, DerefMut}; + +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use serde::{Deserialize, Serialize}; +use tracing::error; +use valence_ident::{ident, Ident}; +use valence_nbt::serde::CompoundSerializer; + +use crate::codec::{RegistryCodec, RegistryValue}; +use crate::{Registry, RegistryIdx, RegistrySet}; +pub struct DimensionTypePlugin; + +impl Plugin for DimensionTypePlugin { + fn build(&self, app: &mut App) { + app.init_resource::() + .add_systems(PreStartup, load_default_dimension_types) + .add_systems( + PostUpdate, + update_dimension_type_registry.before(RegistrySet), + ); + } +} + +/// Loads the default dimension types from the registry codec. +fn load_default_dimension_types(mut reg: ResMut, codec: Res) { + let mut helper = move || -> anyhow::Result<()> { + for value in codec.registry(DimensionTypeRegistry::KEY) { + let mut dimension_type = DimensionType::deserialize(value.element.clone())?; + + // HACK: We don't have a lighting engine implemented. To avoid shrouding the + // world in darkness, give all dimensions the max ambient light. + dimension_type.ambient_light = 1.0; + + reg.insert(value.name.clone(), dimension_type); + } + + Ok(()) + }; + + if let Err(e) = helper() { + error!("failed to load default dimension types from registry codec: {e:#}"); + } +} + +/// Updates the registry codec as the dimension type registry is modified by +/// users. +fn update_dimension_type_registry( + reg: Res, + mut codec: ResMut, +) { + if reg.is_changed() { + let dimension_types = codec.registry_mut(DimensionTypeRegistry::KEY); + + dimension_types.clear(); + + dimension_types.extend(reg.iter().map(|(_, name, dim)| { + RegistryValue { + name: name, + element: dim + .serialize(CompoundSerializer) + .expect("failed to serialize dimension type"), + } + })); + } +} + +#[derive(Resource, Default, Debug)] +pub struct DimensionTypeRegistry { + reg: Registry, +} + +impl DimensionTypeRegistry { + pub const KEY: Ident = ident!("dimension_type"); +} + +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default, Debug)] +pub struct DimensionTypeId(u16); + +impl RegistryIdx for DimensionTypeId { + const MAX: usize = u16::MAX as _; + + fn to_index(self) -> usize { + self.0 as _ + } + + fn from_index(idx: usize) -> Self { + Self(idx as _) + } +} + +impl Deref for DimensionTypeRegistry { + type Target = Registry; + + fn deref(&self) -> &Self::Target { + &self.reg + } +} + +impl DerefMut for DimensionTypeRegistry { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.reg + } +} + +#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)] +#[serde(deny_unknown_fields)] +pub struct DimensionType { + pub ambient_light: f32, + pub bed_works: bool, + pub coordinate_scale: f64, + pub effects: DimensionEffects, + #[serde(skip_serializing_if = "Option::is_none")] + pub fixed_time: Option, + pub has_ceiling: bool, + pub has_raids: bool, + pub has_skylight: bool, + pub height: i32, + pub infiniburn: String, + pub logical_height: i32, + pub min_y: i32, + pub monster_spawn_block_light_limit: i32, + pub monster_spawn_light_level: MonsterSpawnLightLevel, + pub natural: bool, + pub piglin_safe: bool, + pub respawn_anchor_works: bool, + pub ultrawarm: bool, +} + +impl Default for DimensionType { + fn default() -> Self { + Self { + ambient_light: 0.0, + bed_works: true, + coordinate_scale: 1.0, + effects: DimensionEffects::default(), + fixed_time: None, + has_ceiling: false, + has_raids: true, + has_skylight: true, + height: 384, + infiniburn: "#minecraft:infiniburn_overworld".into(), + logical_height: 384, + min_y: -64, + monster_spawn_block_light_limit: 0, + monster_spawn_light_level: MonsterSpawnLightLevel::Int(7), + natural: true, + piglin_safe: false, + respawn_anchor_works: false, + ultrawarm: false, + } + } +} + +/// Determines what skybox/fog effects to use in dimensions. +#[derive(Serialize, Deserialize, Clone, Copy, PartialEq, Eq, Default, Debug)] +pub enum DimensionEffects { + #[serde(rename = "minecraft:overworld")] + #[default] + Overworld, + #[serde(rename = "minecraft:the_nether")] + TheNether, + #[serde(rename = "minecraft:the_end")] + TheEnd, +} + +#[derive(Copy, Clone, PartialEq, Debug, Serialize, Deserialize)] +#[serde(untagged)] +pub enum MonsterSpawnLightLevel { + Int(i32), + Tagged(MonsterSpawnLightLevelTagged), +} + +#[derive(Copy, Clone, PartialEq, Debug, Serialize, Deserialize)] +#[serde(tag = "type", content = "value")] +pub enum MonsterSpawnLightLevelTagged { + #[serde(rename = "minecraft:uniform")] + Uniform { + min_inclusive: i32, + max_inclusive: i32, + }, +} + +impl From for MonsterSpawnLightLevel { + fn from(value: i32) -> Self { + Self::Int(value) + } +} diff --git a/vendor/valence/crates/valence_registry/src/lib.rs b/vendor/valence/crates/valence_registry/src/lib.rs new file mode 100644 index 00000000..028fabd6 --- /dev/null +++ b/vendor/valence/crates/valence_registry/src/lib.rs @@ -0,0 +1,189 @@ +#![doc = include_str!("../README.md")] +#![deny( + rustdoc::broken_intra_doc_links, + rustdoc::private_intra_doc_links, + rustdoc::missing_crate_level_docs, + rustdoc::invalid_codeblock_attributes, + rustdoc::invalid_rust_codeblocks, + rustdoc::bare_urls, + rustdoc::invalid_html_tags +)] +#![warn( + trivial_casts, + trivial_numeric_casts, + unused_lifetimes, + unused_import_braces, + unreachable_pub, + clippy::dbg_macro +)] + +pub mod biome; +pub mod codec; +pub mod dimension_type; +pub mod tags; + +use std::fmt::Debug; +use std::hash::Hash; +use std::marker::PhantomData; +use std::ops::{Index, IndexMut}; + +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +pub use biome::BiomeRegistry; +pub use codec::RegistryCodec; +pub use dimension_type::DimensionTypeRegistry; +use indexmap::map::Entry; +use indexmap::IndexMap; +pub use tags::TagsRegistry; +use valence_ident::Ident; + +pub struct RegistryPlugin; + +/// The [`SystemSet`] where the [`RegistryCodec`] and [`TagsRegistry`] caches +/// are rebuilt. Systems that modify the registry codec or tags registry should +/// run _before_ this. +/// +/// This set lives in [`PostUpdate`]. +#[derive(SystemSet, Copy, Clone, PartialEq, Eq, Hash, Debug)] +pub struct RegistrySet; + +impl Plugin for RegistryPlugin { + fn build(&self, app: &mut App) { + app.configure_sets(PostUpdate, RegistrySet); + + codec::build(app); + tags::build(app); + } +} + +#[derive(Clone, Debug)] +pub struct Registry { + items: IndexMap, + _marker: PhantomData, +} + +impl Registry { + pub fn new() -> Self { + Self { + items: IndexMap::new(), + _marker: PhantomData, + } + } + + pub fn insert(&mut self, name: impl Into, item: V) -> Option { + if self.items.len() >= I::MAX { + // Too many items in the registry. + return None; + } + + let len = self.items.len(); + + match self.items.entry(name.into()) { + Entry::Occupied(_) => None, + Entry::Vacant(ve) => { + ve.insert(item); + Some(I::from_index(len)) + } + } + } + + pub fn swap_to_front(&mut self, name: Ident) { + if let Some(idx) = self.items.get_index_of(name.as_str()) { + self.items.swap_indices(0, idx); + } + } + + pub fn remove(&mut self, name: Ident) -> Option { + self.items.shift_remove(name.as_str()) + } + + pub fn clear(&mut self) { + self.items.clear(); + } + + pub fn get(&self, name: Ident) -> Option<&V> { + self.items.get(name.as_str()) + } + + pub fn get_mut(&mut self, name: Ident) -> Option<&mut V> { + self.items.get_mut(name.as_str()) + } + + pub fn index_of(&self, name: Ident) -> Option { + self.items.get_index_of(name.as_str()).map(I::from_index) + } + + pub fn iter(&self) -> impl DoubleEndedIterator + ExactSizeIterator + '_ { + self.items + .iter() + .enumerate() + .map(|(i, (k, v))| (I::from_index(i), k.clone(), v)) + } + + pub fn iter_mut( + &mut self, + ) -> impl DoubleEndedIterator + ExactSizeIterator + '_ { + self.items + .iter_mut() + .enumerate() + .map(|(i, (k, v))| (I::from_index(i), k.clone(), v)) + } +} + +impl Index for Registry { + type Output = V; + + fn index(&self, index: I) -> &Self::Output { + self.items + .get_index(index.to_index()) + .unwrap_or_else(|| panic!("out of bounds registry index of {}", index.to_index())) + .1 + } +} + +impl IndexMut for Registry { + fn index_mut(&mut self, index: I) -> &mut Self::Output { + self.items + .get_index_mut(index.to_index()) + .unwrap_or_else(|| panic!("out of bounds registry index of {}", index.to_index())) + .1 + } +} + +impl Index for Registry { + type Output = V; + + fn index(&self, index: Ident) -> &Self::Output { + if let Some(item) = self.items.get(index.as_str()) { + item + } else { + panic!("missing registry item with name '{index}'") + } + } +} + +impl IndexMut for Registry { + fn index_mut(&mut self, index: Ident) -> &mut Self::Output { + if let Some(item) = self.items.get_mut(index.as_str()) { + item + } else { + panic!("missing registry item with name '{index}'") + } + } +} + +impl Default for Registry { + fn default() -> Self { + Self { + items: IndexMap::new(), + _marker: PhantomData, + } + } +} + +pub trait RegistryIdx: Copy + Clone + PartialEq + Eq + PartialOrd + Ord + Hash + Debug { + const MAX: usize; + + fn to_index(self) -> usize; + fn from_index(idx: usize) -> Self; +} diff --git a/vendor/valence/crates/valence_registry/src/tags.rs b/vendor/valence/crates/valence_registry/src/tags.rs new file mode 100644 index 00000000..abcd9b92 --- /dev/null +++ b/vendor/valence/crates/valence_registry/src/tags.rs @@ -0,0 +1,72 @@ +use std::borrow::Cow; + +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use valence_protocol::encode::{PacketWriter, WritePacket}; +pub use valence_protocol::packets::play::synchronize_tags_s2c::RegistryMap; +use valence_protocol::packets::play::SynchronizeTagsS2c; +use valence_server_common::Server; + +use crate::RegistrySet; + +#[derive(Debug, Resource, Default)] +pub struct TagsRegistry { + pub registries: RegistryMap, + cached_packet: Vec, +} + +pub(super) fn build(app: &mut App) { + app.init_resource::() + .add_systems(PreStartup, init_tags_registry) + .add_systems(PostUpdate, cache_tags_packet.in_set(RegistrySet)); +} + +impl TagsRegistry { + fn build_synchronize_tags(&self) -> SynchronizeTagsS2c { + SynchronizeTagsS2c { + groups: Cow::Borrowed(&self.registries), + } + } + + /// Returns bytes of the cached [`SynchronizeTagsS2c`] packet. + pub fn sync_tags_packet(&self) -> &[u8] { + &self.cached_packet + } +} + +fn init_tags_registry(mut tags: ResMut) { + let registries = serde_json::from_str::(include_str!("../extracted/tags.json")) + .expect("tags.json must have expected structure"); + + tags.registries = registries; +} + +pub(crate) fn cache_tags_packet(server: Res, tags: ResMut) { + if tags.is_changed() { + let tags = tags.into_inner(); + let packet = tags.build_synchronize_tags(); + let mut bytes = vec![]; + let mut writer = PacketWriter::new(&mut bytes, server.compression_threshold()); + + writer.write_packet(&packet); + tags.cached_packet = bytes; + } +} + +#[cfg(test)] +mod tests { + /* TODO: move this to src/tests/ + #[test] + fn smoke_test() { + let mut app = bevy_app::App::new(); + app.add_plugins(RegistryPlugin); + // app.insert_resource(Server::default()); + app.update(); + + let tags_registry = app.world.get_resource::().unwrap(); + let packet = tags_registry.build_synchronize_tags(); + assert!(!packet.registries.is_empty()); + assert!(!tags_registry.cached_packet.is_empty()); + } + */ +} diff --git a/vendor/valence/crates/valence_scoreboard/Cargo.toml b/vendor/valence/crates/valence_scoreboard/Cargo.toml new file mode 100644 index 00000000..93c25fb2 --- /dev/null +++ b/vendor/valence/crates/valence_scoreboard/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "valence_scoreboard" +description = "Scoreboard support for Valence" +readme = "README.md" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[dependencies] +bevy_app.workspace = true +bevy_ecs.workspace = true +derive_more.workspace = true +valence_server.workspace = true +tracing.workspace = true diff --git a/vendor/valence/crates/valence_scoreboard/README.md b/vendor/valence/crates/valence_scoreboard/README.md new file mode 100644 index 00000000..886df9e3 --- /dev/null +++ b/vendor/valence/crates/valence_scoreboard/README.md @@ -0,0 +1,23 @@ +# valence_scoreboard + +This crate provides functionality for creating and managing scoreboards. In Minecraft, a scoreboard references an [`Objective`], which is a mapping from strings to scores. Typically, the string is a player name, and the score is a number of points, but the string can be any arbitrary string <= 40 chars, and the score can be any integer. + +In Valence, scoreboards obey the rules implied by [`EntityLayer`]s, meaning that every Objective must have an [`EntityLayerId`] associated with it. Scoreboards are only transmitted to clients if the [`EntityLayer`] is visible to the client. + +To create a scoreboard, spawn an [`ObjectiveBundle`]. The [`Objective`] component represents the identifier that the client uses to reference the scoreboard. + +Example: + +```rust +# use bevy_ecs::prelude::*; +use valence_scoreboard::*; +use valence_server::protocol::text::IntoText; + +fn spawn_scoreboard(mut commands: Commands) { + commands.spawn(ObjectiveBundle { + name: Objective::new("foo"), + display: ObjectiveDisplay("Foo".bold()), + ..Default::default() + }); +} +``` diff --git a/vendor/valence/crates/valence_scoreboard/src/components.rs b/vendor/valence/crates/valence_scoreboard/src/components.rs new file mode 100644 index 00000000..46974782 --- /dev/null +++ b/vendor/valence/crates/valence_scoreboard/src/components.rs @@ -0,0 +1,121 @@ +use std::collections::HashMap; + +use bevy_ecs::prelude::*; +use derive_more::{Deref, DerefMut}; +use valence_server::entity::EntityLayerId; +use valence_server::protocol::packets::play::scoreboard_display_s2c::ScoreboardPosition; +use valence_server::protocol::packets::play::scoreboard_objective_update_s2c::ObjectiveRenderType; +use valence_server::text::IntoText; +use valence_server::Text; + +/// A string that identifies an objective. There is one scoreboard per +/// objective.It's generally not safe to modify this after it's been created. +/// Limited to 16 characters. +/// +/// Directly analogous to an Objective's Name. +#[derive(Debug, Clone, PartialEq, Eq, Hash, Component, Deref)] +pub struct Objective(pub(crate) String); + +impl Objective { + pub fn new(name: impl Into) -> Self { + let name = name.into(); + debug_assert!( + name.len() <= 16, + "Objective name {} is too long ({} > 16)", + name, + name.len() + ); + Self(name) + } + + pub fn name(&self) -> &str { + &self.0 + } +} + +/// Optional display name for an objective. If not present, the objective's name +/// is used. +#[derive(Debug, Clone, PartialEq, Component, Deref, DerefMut)] +pub struct ObjectiveDisplay(pub Text); + +/// A mapping of keys to their scores. +#[derive(Debug, Clone, Component, Default)] +pub struct ObjectiveScores(pub(crate) HashMap); + +impl ObjectiveScores { + pub fn new() -> Self { + Default::default() + } + + pub fn with_map(map: impl Into>) -> Self { + Self(map.into()) + } + + pub fn get(&self, key: &str) -> Option<&i32> { + self.0.get(key) + } + + pub fn get_mut(&mut self, key: &str) -> Option<&mut i32> { + self.0.get_mut(key) + } + + pub fn insert(&mut self, key: impl Into, value: i32) -> Option { + self.0.insert(key.into(), value) + } +} + +#[derive(Debug, Clone, Default, PartialEq, Component)] +pub struct OldObjectiveScores(pub(crate) HashMap); + +impl OldObjectiveScores { + pub fn diff<'a>(&'a self, scores: &'a ObjectiveScores) -> Vec<&'a str> { + let mut diff = Vec::new(); + + for (key, value) in &self.0 { + if scores.0.get(key) != Some(value) { + diff.push(key.as_str()); + } + } + + let new_keys = scores + .0 + .keys() + .filter(|key| !self.0.contains_key(key.as_str())) + .map(|key| key.as_str()); + + let removed_keys = self + .0 + .keys() + .filter(|key| !scores.0.contains_key(key.as_str())) + .map(|key| key.as_str()); + + diff.extend(new_keys); + diff.extend(removed_keys); + diff + } +} + +#[derive(Bundle)] +pub struct ObjectiveBundle { + pub name: Objective, + pub display: ObjectiveDisplay, + pub render_type: ObjectiveRenderType, + pub scores: ObjectiveScores, + pub old_scores: OldObjectiveScores, + pub position: ScoreboardPosition, + pub layer: EntityLayerId, +} + +impl Default for ObjectiveBundle { + fn default() -> Self { + Self { + name: Objective::new(""), + display: ObjectiveDisplay("".into_text()), + render_type: Default::default(), + scores: Default::default(), + old_scores: Default::default(), + position: Default::default(), + layer: Default::default(), + } + } +} diff --git a/vendor/valence/crates/valence_scoreboard/src/lib.rs b/vendor/valence/crates/valence_scoreboard/src/lib.rs new file mode 100644 index 00000000..6dee4416 --- /dev/null +++ b/vendor/valence/crates/valence_scoreboard/src/lib.rs @@ -0,0 +1,292 @@ +#![doc = include_str!("../README.md")] +#![deny( + rustdoc::broken_intra_doc_links, + rustdoc::private_intra_doc_links, + rustdoc::missing_crate_level_docs, + rustdoc::invalid_codeblock_attributes, + rustdoc::invalid_rust_codeblocks, + rustdoc::bare_urls, + rustdoc::invalid_html_tags +)] +#![warn( + trivial_casts, + trivial_numeric_casts, + unused_lifetimes, + unused_import_braces, + unreachable_pub, + clippy::dbg_macro +)] +#![allow(clippy::type_complexity)] + +mod components; +use std::collections::BTreeSet; + +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +pub use components::*; +use tracing::{debug, warn}; +use valence_server::client::{Client, OldVisibleEntityLayers, VisibleEntityLayers}; +use valence_server::entity::EntityLayerId; +use valence_server::layer::UpdateLayersPreClientSet; +use valence_server::protocol::packets::play::scoreboard_display_s2c::ScoreboardPosition; +use valence_server::protocol::packets::play::scoreboard_objective_update_s2c::{ + ObjectiveMode, ObjectiveRenderType, +}; +use valence_server::protocol::packets::play::scoreboard_player_update_s2c::ScoreboardPlayerUpdateAction; +use valence_server::protocol::packets::play::{ + ScoreboardDisplayS2c, ScoreboardObjectiveUpdateS2c, ScoreboardPlayerUpdateS2c, +}; +use valence_server::protocol::{VarInt, WritePacket}; +use valence_server::text::IntoText; +use valence_server::{Despawned, EntityLayer}; + +/// Provides all necessary systems to manage scoreboards. +pub struct ScoreboardPlugin; + +impl Plugin for ScoreboardPlugin { + fn build(&self, app: &mut App) { + app.configure_sets(PostUpdate, ScoreboardSet.before(UpdateLayersPreClientSet)); + + app.add_systems( + PostUpdate, + ( + create_or_update_objectives, + display_objectives.after(create_or_update_objectives), + ) + .in_set(ScoreboardSet), + ) + .add_systems( + PostUpdate, + remove_despawned_objectives.in_set(ScoreboardSet), + ) + .add_systems(PostUpdate, handle_new_clients.in_set(ScoreboardSet)) + .add_systems( + PostUpdate, + update_scores + .after(create_or_update_objectives) + .after(handle_new_clients) + .in_set(ScoreboardSet), + ); + } +} + +#[derive(SystemSet, Copy, Clone, PartialEq, Eq, Hash, Debug)] +pub struct ScoreboardSet; + +fn create_or_update_objectives( + objectives: Query< + ( + Ref, + &ObjectiveDisplay, + &ObjectiveRenderType, + &EntityLayerId, + ), + Or<(Changed, Changed)>, + >, + mut layers: Query<&mut EntityLayer>, +) { + for (objective, display, render_type, entity_layer) in objectives.iter() { + if objective.name().is_empty() { + warn!("Objective name is empty"); + } + let mode = if objective.is_added() { + ObjectiveMode::Create { + objective_display_name: (&display.0).into_cow_text(), + render_type: *render_type, + } + } else { + ObjectiveMode::Update { + objective_display_name: (&display.0).into_cow_text(), + render_type: *render_type, + } + }; + + let Ok(mut layer) = layers.get_mut(entity_layer.0) else { + warn!( + "No layer found for entity layer ID {:?}, can't update scoreboard objective", + entity_layer + ); + continue; + }; + + layer.write_packet(&ScoreboardObjectiveUpdateS2c { + objective_name: &objective.0, + mode, + }); + } +} + +/// Must occur after `create_or_update_objectives`. +fn display_objectives( + objectives: Query< + (&Objective, Ref, &EntityLayerId), + Changed, + >, + mut layers: Query<&mut EntityLayer>, +) { + for (objective, position, entity_layer) in objectives.iter() { + let packet = ScoreboardDisplayS2c { + score_name: &objective.0, + position: *position, + }; + + let Ok(mut layer) = layers.get_mut(entity_layer.0) else { + warn!( + "No layer found for entity layer ID {:?}, can't update scoreboard display", + entity_layer + ); + continue; + }; + + layer.write_packet(&packet); + } +} + +fn remove_despawned_objectives( + mut commands: Commands, + objectives: Query<(Entity, &Objective, &EntityLayerId), With>, + mut layers: Query<&mut EntityLayer>, +) { + for (entity, objective, entity_layer) in objectives.iter() { + commands.entity(entity).despawn(); + let Ok(mut layer) = layers.get_mut(entity_layer.0) else { + warn!( + "No layer found for entity layer ID {:?}, can't remove scoreboard objective", + entity_layer + ); + continue; + }; + + layer.write_packet(&ScoreboardObjectiveUpdateS2c { + objective_name: &objective.0, + mode: ObjectiveMode::Remove, + }); + } +} + +fn handle_new_clients( + mut clients: Query< + (&mut Client, &VisibleEntityLayers, &OldVisibleEntityLayers), + Or<(Added, Changed)>, + >, + objectives: Query< + ( + &Objective, + &ObjectiveDisplay, + &ObjectiveRenderType, + &ScoreboardPosition, + &ObjectiveScores, + &EntityLayerId, + ), + Without, + >, +) { + // Remove objectives from the old visible layers that are not in the new visible + // layers. + for (mut client, visible_layers, old_visible_layers) in clients.iter_mut() { + let removed_layers: BTreeSet<_> = old_visible_layers + .get() + .difference(&visible_layers.0) + .collect(); + + for (objective, _, _, _, _, layer) in objectives.iter() { + if !removed_layers.contains(&layer.0) { + continue; + } + client.write_packet(&ScoreboardObjectiveUpdateS2c { + objective_name: &objective.0, + mode: ObjectiveMode::Remove, + }); + } + } + + // Add objectives from the new visible layers that are not in the old visible + // layers, or send all objectives if the client is new. + for (mut client, visible_layers, old_visible_layers) in clients.iter_mut() { + // not sure how to avoid the clone here + let added_layers = if client.is_added() { + debug!("client is new, sending all objectives"); + visible_layers.0.clone() + } else { + visible_layers + .0 + .difference(old_visible_layers.get()) + .copied() + .collect::>() + }; + + for (objective, display, render_type, position, scores, layer) in objectives.iter() { + if !added_layers.contains(&layer.0) { + continue; + } + + client.write_packet(&ScoreboardObjectiveUpdateS2c { + objective_name: &objective.0, + mode: ObjectiveMode::Create { + objective_display_name: (&display.0).into_cow_text(), + render_type: *render_type, + }, + }); + client.write_packet(&ScoreboardDisplayS2c { + score_name: &objective.0, + position: *position, + }); + + for (key, score) in &scores.0 { + let packet = ScoreboardPlayerUpdateS2c { + entity_name: key, + action: ScoreboardPlayerUpdateAction::Update { + objective_name: &objective.0, + objective_score: VarInt(*score), + }, + }; + + client.write_packet(&packet); + } + } + } +} + +fn update_scores( + mut objectives: Query< + ( + &Objective, + &ObjectiveScores, + &mut OldObjectiveScores, + &EntityLayerId, + ), + (Changed, Without), + >, + mut layers: Query<&mut EntityLayer>, +) { + for (objective, scores, mut old_scores, entity_layer) in objectives.iter_mut() { + let Ok(mut layer) = layers.get_mut(entity_layer.0) else { + warn!( + "No layer found for entity layer ID {:?}, can't update scores", + entity_layer + ); + continue; + }; + + for changed_key in old_scores.diff(scores) { + let action = match scores.0.get(changed_key) { + Some(score) => ScoreboardPlayerUpdateAction::Update { + objective_name: &objective.0, + objective_score: VarInt(*score), + }, + None => ScoreboardPlayerUpdateAction::Remove { + objective_name: &objective.0, + }, + }; + + let packet = ScoreboardPlayerUpdateS2c { + entity_name: changed_key, + action, + }; + + layer.write_packet(&packet); + } + + old_scores.0 = scores.0.clone(); + } +} diff --git a/vendor/valence/crates/valence_server/Cargo.toml b/vendor/valence/crates/valence_server/Cargo.toml new file mode 100644 index 00000000..25189c36 --- /dev/null +++ b/vendor/valence/crates/valence_server/Cargo.toml @@ -0,0 +1,33 @@ +[package] +name = "valence_server" +description = "The core of the Valence server" +readme = "README.md" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[dependencies] +anyhow.workspace = true +bevy_app.workspace = true +bevy_ecs.workspace = true +bevy_utils.workspace = true # Needed for `ScheduleLabel` derive macro. +bitfield-struct.workspace = true +bytes.workspace = true +derive_more = { workspace = true, features = ["deref", "deref_mut", "from", "into"] } +valence_math.workspace = true +rand.workspace = true +tracing.workspace = true +uuid.workspace = true +byteorder.workspace = true +valence_bytes.workspace = true +valence_server_common.workspace = true +valence_entity.workspace = true +valence_nbt.workspace = true +valence_registry.workspace = true +valence_protocol.workspace = true +valence_generated.workspace = true +rustc-hash.workspace = true +parking_lot.workspace = true +arrayvec.workspace = true diff --git a/vendor/valence/crates/valence_server/README.md b/vendor/valence/crates/valence_server/README.md new file mode 100644 index 00000000..13c1fdc9 --- /dev/null +++ b/vendor/valence/crates/valence_server/README.md @@ -0,0 +1,5 @@ +# valence_server + +Defines the "core" of the Valence server that plugins depend on. If a plugin module here is large enough, it may be split off into its own crate to reduce compile times. + +The contents of `valence_server` are re-exported from the main `valence` crate, so end users should not interact with this crate directly. diff --git a/vendor/valence/crates/valence_server/src/abilities.rs b/vendor/valence/crates/valence_server/src/abilities.rs new file mode 100644 index 00000000..c1bff07f --- /dev/null +++ b/vendor/valence/crates/valence_server/src/abilities.rs @@ -0,0 +1,175 @@ +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use derive_more::{Deref, DerefMut}; +pub use valence_protocol::packets::play::player_abilities_s2c::PlayerAbilitiesFlags; +use valence_protocol::packets::play::{PlayerAbilitiesS2c, UpdatePlayerAbilitiesC2s}; +use valence_protocol::{GameMode, WritePacket}; + +use crate::client::{update_game_mode, Client, UpdateClientsSet}; +use crate::event_loop::{EventLoopPreUpdate, PacketEvent}; + +/// [`Component`] that stores the player's flying speed ability. +/// +/// [`Default`] value: `0.05`. +#[derive(Component, Deref, DerefMut)] +pub struct FlyingSpeed(pub f32); + +impl Default for FlyingSpeed { + fn default() -> Self { + Self(0.05) + } +} + +/// [`Component`] that stores the player's field of view modifier ability. +/// The lower the value, the higher the field of view. +/// +/// [`Default`] value: `0.1`. +#[derive(Component, Deref, DerefMut)] +pub struct FovModifier(pub f32); + +impl Default for FovModifier { + fn default() -> Self { + Self(0.1) + } +} + +/// Send if the client sends [`UpdatePlayerAbilitiesC2s::StartFlying`] +#[derive(Event)] +pub struct PlayerStartFlyingEvent { + pub client: Entity, +} + +/// Send if the client sends [`UpdatePlayerAbilitiesC2s::StopFlying`] +#[derive(Event)] +pub struct PlayerStopFlyingEvent { + pub client: Entity, +} + +/// Order of execution: +/// 1. `update_game_mode`: Watch [`GameMode`] changes => Send +/// `GameStateChangeS2c` to update the client's gamemode +/// +/// 2. `update_client_player_abilities`: Watch [`PlayerAbilitiesFlags`], +/// [`FlyingSpeed`] and [`FovModifier`] changes => Send [`PlayerAbilitiesS2c`] +/// to update the client's abilities +/// +/// 3. `update_player_abilities`: Watch +/// [`GameMode`] changes => Update [`PlayerAbilitiesFlags`] according to the +/// [`GameMode`] +/// +/// 4. `update_server_player_abilities`: Watch +/// [`UpdatePlayerAbilitiesC2s`] packets => Update [`PlayerAbilitiesFlags`] +/// according to the packet +pub struct AbilitiesPlugin; + +impl Plugin for AbilitiesPlugin { + fn build(&self, app: &mut App) { + app.add_event::() + .add_event::() + .add_systems( + PostUpdate, + ( + update_client_player_abilities, + update_player_abilities.before(update_client_player_abilities), + ) + .in_set(UpdateClientsSet) + .after(update_game_mode), + ) + .add_systems(EventLoopPreUpdate, update_server_player_abilities); + } +} + +fn update_client_player_abilities( + mut clients_query: Query< + ( + &mut Client, + &PlayerAbilitiesFlags, + &FlyingSpeed, + &FovModifier, + ), + Or<( + Changed, + Changed, + Changed, + )>, + >, +) { + for (mut client, flags, flying_speed, fov_modifier) in clients_query.iter_mut() { + client.write_packet(&PlayerAbilitiesS2c { + flags: *flags, + flying_speed: flying_speed.0, + fov_modifier: fov_modifier.0, + }) + } +} + +/// /!\ This system does not trigger change detection on +/// [`PlayerAbilitiesFlags`] +fn update_player_abilities( + mut player_start_flying_event_writer: EventWriter, + mut player_stop_flying_event_writer: EventWriter, + mut client_query: Query<(Entity, &mut PlayerAbilitiesFlags, &GameMode), Changed>, +) { + for (entity, mut mut_flags, gamemode) in client_query.iter_mut() { + let flags = mut_flags.bypass_change_detection(); + match gamemode { + GameMode::Creative => { + flags.set_invulnerable(true); + flags.set_allow_flying(true); + flags.set_instant_break(true); + } + GameMode::Spectator => { + flags.set_invulnerable(true); + flags.set_allow_flying(true); + flags.set_instant_break(false); + flags.set_flying(true); + player_start_flying_event_writer.send(PlayerStartFlyingEvent { client: entity }); + } + GameMode::Survival => { + flags.set_invulnerable(false); + flags.set_allow_flying(false); + flags.set_instant_break(false); + flags.set_flying(false); + player_stop_flying_event_writer.send(PlayerStopFlyingEvent { client: entity }); + } + GameMode::Adventure => { + flags.set_invulnerable(false); + flags.set_allow_flying(false); + flags.set_instant_break(false); + flags.set_flying(false); + player_stop_flying_event_writer.send(PlayerStopFlyingEvent { client: entity }); + } + } + } +} + +/// /!\ This system does not trigger change detection on +/// [`PlayerAbilitiesFlags`] +fn update_server_player_abilities( + mut packet_events: EventReader, + mut player_start_flying_event_writer: EventWriter, + mut player_stop_flying_event_writer: EventWriter, + mut client_query: Query<&mut PlayerAbilitiesFlags>, +) { + for packets in packet_events.read() { + if let Some(pkt) = packets.decode::() { + if let Ok(mut mut_flags) = client_query.get_mut(packets.client) { + let flags = mut_flags.bypass_change_detection(); + match pkt { + UpdatePlayerAbilitiesC2s::StartFlying => { + flags.set_flying(true); + player_start_flying_event_writer.send(PlayerStartFlyingEvent { + client: packets.client, + }); + } + UpdatePlayerAbilitiesC2s::StopFlying => { + flags.set_flying(false); + player_stop_flying_event_writer.send(PlayerStopFlyingEvent { + client: packets.client, + }); + } + } + } + } + } +} diff --git a/vendor/valence/crates/valence_server/src/action.rs b/vendor/valence/crates/valence_server/src/action.rs new file mode 100644 index 00000000..b0f462c6 --- /dev/null +++ b/vendor/valence/crates/valence_server/src/action.rs @@ -0,0 +1,106 @@ +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use derive_more::Deref; +use valence_protocol::packets::play::player_action_c2s::PlayerAction; +use valence_protocol::packets::play::{PlayerActionC2s, PlayerActionResponseS2c}; +use valence_protocol::{BlockPos, Direction, VarInt, WritePacket}; + +use crate::client::{Client, UpdateClientsSet}; +use crate::event_loop::{EventLoopPreUpdate, PacketEvent}; + +pub struct ActionPlugin; + +impl Plugin for ActionPlugin { + fn build(&self, app: &mut App) { + app.add_event::() + .add_systems(EventLoopPreUpdate, handle_player_action) + .add_systems( + PostUpdate, + acknowledge_player_actions.in_set(UpdateClientsSet), + ); + } +} + +#[derive(Event, Copy, Clone, Debug)] +pub struct DiggingEvent { + pub client: Entity, + pub position: BlockPos, + pub direction: Direction, + pub state: DiggingState, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug)] +pub enum DiggingState { + Start, + Abort, + Stop, +} + +#[derive(Component, Copy, Clone, PartialEq, Eq, Default, Debug, Deref)] +pub struct ActionSequence(i32); + +impl ActionSequence { + pub fn update(&mut self, val: i32) { + self.0 = self.0.max(val); + } + + pub fn get(&self) -> i32 { + self.0 + } +} + +fn handle_player_action( + mut clients: Query<&mut ActionSequence>, + mut packets: EventReader, + mut digging_events: EventWriter, +) { + for packet in packets.read() { + if let Some(pkt) = packet.decode::() { + if let Ok(mut seq) = clients.get_mut(packet.client) { + seq.update(pkt.sequence.0); + } + + // TODO: check that digging is happening within configurable distance to client. + // TODO: check that blocks are being broken at the appropriate speeds. + + match pkt.action { + PlayerAction::StartDestroyBlock => digging_events.send(DiggingEvent { + client: packet.client, + position: pkt.position, + direction: pkt.direction, + state: DiggingState::Start, + }), + PlayerAction::AbortDestroyBlock => digging_events.send(DiggingEvent { + client: packet.client, + position: pkt.position, + direction: pkt.direction, + state: DiggingState::Abort, + }), + PlayerAction::StopDestroyBlock => digging_events.send(DiggingEvent { + client: packet.client, + position: pkt.position, + direction: pkt.direction, + state: DiggingState::Stop, + }), + PlayerAction::DropAllItems => {} + PlayerAction::DropItem => {} + PlayerAction::ReleaseUseItem => {} + PlayerAction::SwapItemWithOffhand => {} + } + } + } +} + +fn acknowledge_player_actions( + mut clients: Query<(&mut Client, &mut ActionSequence), Changed>, +) { + for (mut client, mut action_seq) in &mut clients { + if action_seq.0 != 0 { + client.write_packet(&PlayerActionResponseS2c { + sequence: VarInt(action_seq.0), + }); + + action_seq.0 = 0; + } + } +} diff --git a/vendor/valence/crates/valence_server/src/brand.rs b/vendor/valence/crates/valence_server/src/brand.rs new file mode 100644 index 00000000..e0c2f64a --- /dev/null +++ b/vendor/valence/crates/valence_server/src/brand.rs @@ -0,0 +1,29 @@ +use valence_bytes::CowUtf8Bytes; +use valence_protocol::packets::play::CustomPayloadS2c; +use valence_protocol::{ident, Bounded, Encode, VarInt, WritePacket}; + +pub trait SetBrand { + /// Sets the brand of the server. + /// + /// The Brand is displayed to the client in the F3 screen + /// and is often used to display the server name. + /// Any valid &str can be used. + /// + /// However, the legacy formatting codes are used, + /// which means that while color and other formatting can technically be + /// used, it needs to use the § character, which needs to be encoded as + /// 0xC2, 0xA7. + fn set_brand(&mut self, brand: &str); +} + +impl SetBrand for T { + fn set_brand(&mut self, brand: &str) { + let mut buf = vec![]; + let _ = VarInt(brand.len() as _).encode(&mut buf); + buf.extend_from_slice(brand.as_bytes()); + self.write_packet(&CustomPayloadS2c { + channel: ident!("minecraft:brand"), + data: Bounded(buf.into()), + }); + } +} diff --git a/vendor/valence/crates/valence_server/src/chunk_view.rs b/vendor/valence/crates/valence_server/src/chunk_view.rs new file mode 100644 index 00000000..134949fa --- /dev/null +++ b/vendor/valence/crates/valence_server/src/chunk_view.rs @@ -0,0 +1,102 @@ +use valence_generated::chunk_view::{CHUNK_VIEW_LUT, EXTRA_VIEW_RADIUS, MAX_VIEW_DIST}; +use valence_protocol::ChunkPos; + +/// Represents the set of all chunk positions that a client can see, defined by +/// a center chunk position `pos` and view distance `dist`. +#[derive(Copy, Clone, PartialEq, Eq, Default, Debug)] +pub struct ChunkView { + /// The center position of this chunk view. + pub pos: ChunkPos, + dist: u8, +} + +impl ChunkView { + /// Creates a new chunk view. `dist` is clamped to the range + /// 0..[MAX_VIEW_DIST]. + pub const fn new(pos: ChunkPos, dist: u8) -> Self { + Self { + pos, + dist: if dist > MAX_VIEW_DIST { + MAX_VIEW_DIST + } else { + dist + }, + } + } + + pub const fn with_dist(self, dist: u8) -> Self { + Self::new(self.pos, dist) + } + + pub const fn dist(self) -> u8 { + self.dist + } + + pub const fn contains(self, pos: ChunkPos) -> bool { + let true_dist = self.dist as u64 + EXTRA_VIEW_RADIUS as u64; + self.pos.distance_squared(pos) <= true_dist * true_dist + } + + /// Returns an iterator over all the chunk positions in this view. Positions + /// are sorted by the distance to [`pos`](Self::pos) in ascending order. + pub fn iter(self) -> impl DoubleEndedIterator + ExactSizeIterator + Clone { + CHUNK_VIEW_LUT[self.dist as usize] + .iter() + .map(move |&(x, z)| ChunkPos { + x: self.pos.x + x as i32, + z: self.pos.z + z as i32, + }) + } + + /// Returns an iterator over all the chunk positions in `self`, excluding + /// the positions that overlap with `other`. Positions are sorted by the + /// distance to [`pos`](Self::pos) in ascending order. + pub fn diff(self, other: Self) -> impl DoubleEndedIterator + Clone { + self.iter().filter(move |&p| !other.contains(p)) + } + + /// Returns a `(min, max)` tuple describing the tight axis-aligned bounding + /// box for this view. All chunk positions in the view are contained in the + /// bounding box. + /// + /// # Examples + /// + /// ``` + /// use valence_server::{ChunkPos, ChunkView}; + /// + /// let view = ChunkView::new(ChunkPos::new(5, -4), 16); + /// let (min, max) = view.bounding_box(); + /// + /// for pos in view.iter() { + /// assert!(pos.x >= min.x && pos.x <= max.x && pos.z >= min.z && pos.z <= max.z); + /// } + /// ``` + pub fn bounding_box(self) -> (ChunkPos, ChunkPos) { + let r = self.dist as i32 + EXTRA_VIEW_RADIUS; + + ( + ChunkPos::new(self.pos.x - r, self.pos.z - r), + ChunkPos::new(self.pos.x + r, self.pos.z + r), + ) + } +} + +#[cfg(test)] +mod tests { + use std::collections::BTreeSet; + + use super::*; + + #[test] + fn chunk_view_contains() { + let view = ChunkView::new(ChunkPos::new(0, 0), 32); + let positions = BTreeSet::from_iter(view.iter()); + + for z in -64..64 { + for x in -64..64 { + let p = ChunkPos::new(x, z); + assert_eq!(view.contains(p), positions.contains(&p), "{p:?}"); + } + } + } +} diff --git a/vendor/valence/crates/valence_server/src/client.rs b/vendor/valence/crates/valence_server/src/client.rs new file mode 100644 index 00000000..d48b9bc9 --- /dev/null +++ b/vendor/valence/crates/valence_server/src/client.rs @@ -0,0 +1,1208 @@ +use std::borrow::Cow; +use std::collections::BTreeSet; +use std::fmt; +use std::net::IpAddr; +use std::time::Instant; + +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use bevy_ecs::query::WorldQuery; +use bevy_ecs::system::Command; +use byteorder::{NativeEndian, ReadBytesExt}; +use bytes::{Bytes, BytesMut}; +use derive_more::{Deref, DerefMut, From, Into}; +use tracing::warn; +use uuid::Uuid; +use valence_entity::attributes::{EntityAttributes, TrackedEntityAttributes}; +use valence_entity::living::Health; +use valence_entity::player::{Food, PlayerEntityBundle, Saturation}; +use valence_entity::query::EntityInitQuery; +use valence_entity::tracked_data::TrackedData; +use valence_entity::{ + ClearEntityChangesSet, EntityId, EntityStatus, OldPosition, Position, Velocity, +}; +use valence_math::{DVec3, Vec3}; +use valence_protocol::encode::{PacketEncoder, WritePacket}; +use valence_protocol::packets::play::chunk_biome_data_s2c::ChunkBiome; +use valence_protocol::packets::play::game_state_change_s2c::GameEventKind; +use valence_protocol::packets::play::particle_s2c::Particle; +use valence_protocol::packets::play::{ + ChunkBiomeDataS2c, ChunkLoadDistanceS2c, ChunkRenderDistanceCenterS2c, DeathMessageS2c, + DisconnectS2c, EntitiesDestroyS2c, EntityAttributesS2c, EntityStatusS2c, + EntityTrackerUpdateS2c, EntityVelocityUpdateS2c, GameStateChangeS2c, HealthUpdateS2c, + ParticleS2c, PlaySoundS2c, UnloadChunkS2c, +}; +use valence_protocol::profile::Property; +use valence_protocol::sound::{Sound, SoundCategory, SoundId}; +use valence_protocol::text::{IntoText, Text}; +use valence_protocol::var_int::VarInt; +use valence_protocol::{BlockPos, ChunkPos, Encode, GameMode, Packet}; +use valence_registry::RegistrySet; +use valence_server_common::{Despawned, UniqueId}; + +use crate::layer::{ChunkLayer, EntityLayer, UpdateLayersPostClientSet, UpdateLayersPreClientSet}; +use crate::ChunkView; + +pub struct ClientPlugin; + +/// The [`SystemSet`] in [`PostUpdate`] where clients have their packet buffer +/// flushed. Any system that writes packets to clients should happen _before_ +/// this. Otherwise, the data will arrive one tick late. +#[derive(SystemSet, Copy, Clone, PartialEq, Eq, Hash, Debug)] +pub struct FlushPacketsSet; + +/// The [`SystemSet`] in [`PreUpdate`] where new clients should be +/// spawned. Systems that need to perform initialization work on clients before +/// users get access to it should run _after_ this set. +#[derive(SystemSet, Copy, Clone, PartialEq, Eq, Hash, Debug)] +pub struct SpawnClientsSet; + +/// The system set where various facets of the client are updated. Systems that +/// modify layers should run _before_ this. +#[derive(SystemSet, Copy, Clone, PartialEq, Eq, Hash, Debug)] +pub struct UpdateClientsSet; + +impl Plugin for ClientPlugin { + fn build(&self, app: &mut App) { + app.add_systems( + PostUpdate, + ( + ( + crate::spawn::initial_join.after(RegistrySet), + update_chunk_load_dist, + handle_layer_messages.after(update_chunk_load_dist), + update_view_and_layers + .after(crate::spawn::initial_join) + .after(handle_layer_messages), + cleanup_chunks_after_client_despawn.after(update_view_and_layers), + crate::spawn::update_respawn_position.after(update_view_and_layers), + crate::spawn::respawn.after(crate::spawn::update_respawn_position), + update_old_view_dist.after(update_view_and_layers), + update_game_mode, + update_food_saturation_health, + update_tracked_data, + init_tracked_data, + update_tracked_attributes, + init_tracked_attributes, + ) + .in_set(UpdateClientsSet), + flush_packets.in_set(FlushPacketsSet), + ), + ) + .configure_sets(PreUpdate, SpawnClientsSet) + .configure_sets( + PostUpdate, + ( + UpdateClientsSet + .after(UpdateLayersPreClientSet) + .before(UpdateLayersPostClientSet) + .before(FlushPacketsSet), + ClearEntityChangesSet.after(UpdateClientsSet), + FlushPacketsSet, + ), + ); + } +} + +/// The bundle of components needed for clients to function. All components are +/// required unless otherwise stated. +#[derive(Bundle)] +pub struct ClientBundle { + pub marker: ClientMarker, + pub client: Client, + pub settings: crate::client_settings::ClientSettings, + pub entity_remove_buf: EntityRemoveBuf, + pub username: Username, + pub ip: Ip, + pub properties: Properties, + pub respawn_pos: crate::spawn::RespawnPosition, + pub op_level: crate::op_level::OpLevel, + pub action_sequence: crate::action::ActionSequence, + pub view_distance: ViewDistance, + pub old_view_distance: OldViewDistance, + pub visible_chunk_layer: VisibleChunkLayer, + pub old_visible_chunk_layer: OldVisibleChunkLayer, + pub visible_entity_layers: VisibleEntityLayers, + pub old_visible_entity_layers: OldVisibleEntityLayers, + pub keepalive_state: crate::keepalive::KeepaliveState, + pub ping: crate::keepalive::Ping, + pub teleport_state: crate::teleport::TeleportState, + pub game_mode: GameMode, + pub prev_game_mode: crate::spawn::PrevGameMode, + pub death_location: crate::spawn::DeathLocation, + pub is_hardcore: crate::spawn::IsHardcore, + pub hashed_seed: crate::spawn::HashedSeed, + pub reduced_debug_info: crate::spawn::ReducedDebugInfo, + pub has_respawn_screen: crate::spawn::HasRespawnScreen, + pub is_debug: crate::spawn::IsDebug, + pub is_flat: crate::spawn::IsFlat, + pub portal_cooldown: crate::spawn::PortalCooldown, + pub flying_speed: crate::abilities::FlyingSpeed, + pub fov_modifier: crate::abilities::FovModifier, + pub player_abilities_flags: crate::abilities::PlayerAbilitiesFlags, + pub player: PlayerEntityBundle, +} + +impl ClientBundle { + pub fn new(args: ClientBundleArgs) -> Self { + Self { + marker: ClientMarker, + client: Client { + conn: args.conn, + enc: args.enc, + }, + settings: Default::default(), + entity_remove_buf: Default::default(), + username: Username(args.username), + ip: Ip(args.ip), + properties: Properties(args.properties), + respawn_pos: Default::default(), + op_level: Default::default(), + action_sequence: Default::default(), + view_distance: Default::default(), + old_view_distance: OldViewDistance(2), + visible_chunk_layer: Default::default(), + old_visible_chunk_layer: OldVisibleChunkLayer(Entity::PLACEHOLDER), + visible_entity_layers: Default::default(), + old_visible_entity_layers: OldVisibleEntityLayers(BTreeSet::new()), + keepalive_state: crate::keepalive::KeepaliveState::new(), + ping: Default::default(), + teleport_state: crate::teleport::TeleportState::new(), + game_mode: GameMode::default(), + prev_game_mode: Default::default(), + death_location: Default::default(), + is_hardcore: Default::default(), + is_flat: Default::default(), + has_respawn_screen: Default::default(), + hashed_seed: Default::default(), + reduced_debug_info: Default::default(), + is_debug: Default::default(), + portal_cooldown: Default::default(), + flying_speed: Default::default(), + fov_modifier: Default::default(), + player_abilities_flags: Default::default(), + player: PlayerEntityBundle { + uuid: UniqueId(args.uuid), + ..Default::default() + }, + } + } +} + +/// Arguments for [`ClientBundle::new`]. +pub struct ClientBundleArgs { + /// The username for the client. + pub username: String, + /// UUID of the client. + pub uuid: Uuid, + /// IP address of the client. + pub ip: IpAddr, + /// Properties of this client from the game profile. + pub properties: Vec, + /// The abstract socket connection. + pub conn: Box, + /// The packet encoder to use. This should be in sync with [`Self::conn`]. + pub enc: PacketEncoder, +} + +/// Marker [`Component`] for client entities. This component should exist even +/// if the client is disconnected. +#[derive(Component, Copy, Clone)] +pub struct ClientMarker; + +/// The main client component. Contains the underlying network connection and +/// packet buffer. +/// +/// The component is removed when the client is disconnected. You are allowed to +/// remove the component yourself. +#[derive(Component)] +pub struct Client { + conn: Box, + pub(crate) enc: PacketEncoder, +} + +/// Represents the bidirectional packet channel between the server and a client +/// in the "play" state. +pub trait ClientConnection: Send + Sync + 'static { + /// Sends encoded clientbound packet data. This function must not block and + /// the data should be sent as soon as possible. + fn try_send(&mut self, bytes: BytesMut) -> anyhow::Result<()>; + /// Receives the next pending serverbound packet. This must return + /// immediately without blocking. + fn try_recv(&mut self) -> anyhow::Result>; + /// The number of pending packets waiting to be received via + /// [`Self::try_recv`]. + fn len(&self) -> usize; + + fn is_empty(&self) -> bool { + self.len() == 0 + } +} + +#[derive(Clone, Debug)] +pub struct ReceivedPacket { + /// The moment in time this packet arrived. This is _not_ the instant this + /// packet was returned from [`ClientConnection::try_recv`]. + pub timestamp: Instant, + /// This packet's ID. + pub id: i32, + /// The content of the packet, excluding the leading varint packet ID. + pub body: Bytes, +} + +impl Drop for Client { + fn drop(&mut self) { + _ = self.flush_packets(); + } +} + +/// Writes packets into this client's packet buffer. The buffer is flushed at +/// the end of the tick. +impl WritePacket for Client { + fn write_packet_fallible

(&mut self, packet: &P) -> anyhow::Result<()> + where + P: Packet + Encode, + { + self.enc.write_packet_fallible(packet) + } + + fn write_packet_bytes(&mut self, bytes: &[u8]) { + self.enc.write_packet_bytes(bytes) + } +} + +impl Client { + pub fn connection(&self) -> &dyn ClientConnection { + self.conn.as_ref() + } + + pub fn connection_mut(&mut self) -> &mut dyn ClientConnection { + self.conn.as_mut() + } + + /// Flushes the packet queue to the underlying connection. + /// + /// This is called automatically at the end of the tick and when the client + /// is dropped. Unless you're in a hurry, there's usually no reason to + /// call this method yourself. + /// + /// Returns an error if flushing was unsuccessful. + pub fn flush_packets(&mut self) -> anyhow::Result<()> { + let bytes = self.enc.take(); + if !bytes.is_empty() { + self.conn.try_send(bytes) + } else { + Ok(()) + } + } + + /// Kills the client and shows `message` on the death screen. If an entity + /// killed the player, you should supply it as `killer`. + pub fn kill<'a>(&mut self, message: impl IntoText<'a>) { + self.write_packet(&DeathMessageS2c { + player_id: VarInt(0), + message: message.into_cow_text(), + }); + } + + /// Respawns client. Optionally can roll the credits before respawning. + pub fn win_game(&mut self, show_credits: bool) { + self.write_packet(&GameStateChangeS2c { + kind: GameEventKind::WinGame, + value: if show_credits { 1.0 } else { 0.0 }, + }); + } + + /// Puts a particle effect at the given position, only for this client. + pub fn play_particle( + &mut self, + particle: &Particle, + long_distance: bool, + position: impl Into, + offset: impl Into, + max_speed: f32, + count: i32, + ) { + self.write_packet(&ParticleS2c { + particle: Cow::Borrowed(particle), + long_distance, + position: position.into(), + offset: offset.into(), + max_speed, + count, + }) + } + + /// Plays a sound effect at the given position, only for this client. + pub fn play_sound( + &mut self, + sound: Sound, + category: SoundCategory, + position: impl Into, + volume: f32, + pitch: f32, + ) { + let position = position.into(); + + self.write_packet(&PlaySoundS2c { + id: SoundId::Direct { + id: sound.to_ident().into(), + range: None, + }, + category, + position: (position * 8.0).as_ivec3(), + volume, + pitch, + seed: rand::random(), + }); + } + + /// `velocity` is in m/s. + pub fn set_velocity(&mut self, velocity: impl Into) { + self.write_packet(&EntityVelocityUpdateS2c { + entity_id: VarInt(0), + velocity: Velocity(velocity.into()).to_packet_units(), + }); + } + + /// Triggers an [`EntityStatus`]. + /// + /// The status is only visible to this client. + pub fn trigger_status(&mut self, status: EntityStatus) { + self.write_packet(&EntityStatusS2c { + entity_id: 0, + entity_status: status as u8, + }); + } +} + +/// A [`Command`] to disconnect a [`Client`] with a displayed reason. +#[derive(Clone, PartialEq, Debug)] +pub struct DisconnectClient { + pub client: Entity, + pub reason: Text, +} + +impl Command for DisconnectClient { + fn apply(self, world: &mut World) { + if let Some(mut entity) = world.get_entity_mut(self.client) { + if let Some(mut client) = entity.get_mut::() { + client.write_packet(&DisconnectS2c { + reason: self.reason.into(), + }); + + // Despawned will be removed at the end of the tick, this way, the packets have + // time to be sent. + entity.insert(Despawned); + } + } + } +} + +/// Contains a list of Minecraft entities that need to be despawned. Entity IDs +/// in this list will be despawned all at once at the end of the tick. +/// +/// You should not need to use this directly under normal circumstances. +#[derive(Component, Default, Debug)] +pub struct EntityRemoveBuf(Vec); + +impl EntityRemoveBuf { + pub fn push(&mut self, entity_id: i32) { + debug_assert!( + entity_id != 0, + "removing entity with protocol ID 0 (which should be reserved for clients)" + ); + + self.0.push(VarInt(entity_id)); + } + + /// Sends the entity remove packet and clears the buffer. Does nothing if + /// the buffer is empty. + pub fn send_and_clear(&mut self, mut w: impl WritePacket) { + if !self.0.is_empty() { + w.write_packet(&EntitiesDestroyS2c { + entity_ids: Cow::Borrowed(&self.0), + }); + + self.0.clear(); + } + } +} + +#[derive(Component, Clone, PartialEq, Eq, Default, Debug, Deref)] +pub struct Username(pub String); + +impl fmt::Display for Username { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + self.0.fmt(f) + } +} + +/// Player properties from the game profile. +#[derive(Component, Clone, PartialEq, Eq, Default, Debug, Deref, DerefMut, From, Into)] +pub struct Properties(pub Vec); + +impl Properties { + /// Finds the property with the name "textures". + pub fn textures(&self) -> Option<&Property> { + self.0.iter().find(|p| p.name == "textures") + } + + /// Finds the property with the name "textures" mutably. + pub fn textures_mut(&mut self) -> Option<&mut Property> { + self.0.iter_mut().find(|p| p.name == "textures") + } + + /// Returns the value of the "textures" property. It's a base64-encoded + /// JSON string that contains the skin and cape URLs. + pub fn skin(&self) -> Option<&str> { + self.textures().map(|p| p.value.as_str()) + } + + /// Sets the value of the "textures" property, or adds it if it does not + /// exist. Can be used for custom skins on player entities. + /// + /// `signature` is the Yggdrasil signature for the texture data. It is + /// required if you want the skin to show up on vanilla Notchian + /// clients. You can't sign skins yourself, so you'll have to get it from + /// Mojang. + pub fn set_skin(&mut self, skin: impl Into, signature: impl Into) { + if let Some(prop) = self.textures_mut() { + prop.value = skin.into(); + prop.signature = Some(signature.into()); + } else { + self.0.push(Property { + name: "textures".to_owned(), + value: skin.into(), + signature: Some(signature.into()), + }); + } + } +} + +#[derive(Clone, PartialEq, Eq, Debug)] +pub struct PropertyValue { + pub value: String, + pub signature: Option, +} + +#[derive(Component, Clone, PartialEq, Eq, Debug, Deref)] +pub struct Ip(pub IpAddr); + +#[derive(Component, Clone, PartialEq, Eq, Debug, Deref)] +pub struct ViewDistance(u8); + +impl ViewDistance { + pub fn new(dist: u8) -> Self { + let mut new = Self(0); + new.set(dist); + new + } + + pub fn get(&self) -> u8 { + self.0 + } + + /// `dist` is clamped to `2..=32`. + pub fn set(&mut self, dist: u8) { + self.0 = dist.clamp(2, 32); + } +} + +impl Default for ViewDistance { + fn default() -> Self { + Self(2) + } +} + +/// The [`ViewDistance`] at the end of the previous tick. Automatically updated +/// as [`ViewDistance`] is changed. +#[derive(Component, Clone, PartialEq, Eq, Default, Debug, Deref)] +pub struct OldViewDistance(u8); + +impl OldViewDistance { + pub fn get(&self) -> u8 { + self.0 + } +} + +#[derive(WorldQuery, Copy, Clone, Debug)] +pub struct View { + pub pos: &'static Position, + pub view_dist: &'static ViewDistance, +} + +impl ViewItem<'_> { + pub fn get(&self) -> ChunkView { + ChunkView::new(self.pos.0.into(), self.view_dist.0) + } +} + +#[derive(WorldQuery, Copy, Clone, Debug)] +pub struct OldView { + pub old_pos: &'static OldPosition, + pub old_view_dist: &'static OldViewDistance, +} + +impl OldViewItem<'_> { + pub fn get(&self) -> ChunkView { + ChunkView::new(self.old_pos.get().into(), self.old_view_dist.0) + } +} + +/// A [`Component`] containing a handle to the [`ChunkLayer`] a client can +/// see. +/// +/// A client can only see one chunk layer at a time. Mutating this component +/// will cause the client to respawn in the new chunk layer. +#[derive(Component, Copy, Clone, PartialEq, Eq, Debug, Deref, DerefMut)] +pub struct VisibleChunkLayer(pub Entity); + +impl Default for VisibleChunkLayer { + fn default() -> Self { + Self(Entity::PLACEHOLDER) + } +} + +/// The value of [`VisibleChunkLayer`] from the end of the previous tick. +#[derive(Component, PartialEq, Eq, Debug, Deref)] +pub struct OldVisibleChunkLayer(Entity); + +impl OldVisibleChunkLayer { + pub fn get(&self) -> Entity { + self.0 + } +} + +/// A [`Component`] containing the set of [`EntityLayer`]s a client can see. +/// All Minecraft entities from all layers in this set are potentially visible +/// to the client. +/// +/// This set can be mutated at any time to change which entity layers are +/// visible to the client. [`Despawned`] entity layers are automatically +/// removed. +#[derive(Component, Default, Debug)] +pub struct VisibleEntityLayers(pub BTreeSet); + +/// The value of [`VisibleEntityLayers`] from the end of the previous tick. +#[derive(Component, Default, Debug, Deref)] +pub struct OldVisibleEntityLayers(BTreeSet); + +impl OldVisibleEntityLayers { + pub fn get(&self) -> &BTreeSet { + &self.0 + } +} + +/// A system for adding [`Despawned`] components to disconnected clients. This +/// works by listening for removed [`Client`] components. +pub fn despawn_disconnected_clients( + mut commands: Commands, + mut disconnected_clients: RemovedComponents, +) { + for entity in disconnected_clients.read() { + if let Some(mut entity) = commands.get_entity(entity) { + entity.insert(Despawned); + } + } +} + +fn update_chunk_load_dist( + mut clients: Query<(&mut Client, &ViewDistance, &OldViewDistance), Changed>, +) { + for (mut client, dist, old_dist) in &mut clients { + if client.is_added() { + // Join game packet includes the view distance. + continue; + } + + if dist.0 != old_dist.0 { + // Note: This packet is just aesthetic. + client.write_packet(&ChunkLoadDistanceS2c { + view_distance: VarInt(dist.0.into()), + }); + } + } +} + +fn handle_layer_messages( + mut clients: Query<( + Entity, + &EntityId, + &mut Client, + &mut EntityRemoveBuf, + OldView, + &OldVisibleChunkLayer, + &mut VisibleEntityLayers, + &OldVisibleEntityLayers, + )>, + chunk_layers: Query<&ChunkLayer>, + entity_layers: Query<&EntityLayer>, + entities: Query<(EntityInitQuery, &OldPosition)>, +) { + clients.par_iter_mut().for_each( + |( + self_entity, + self_entity_id, + mut client, + mut remove_buf, + old_view, + old_visible_chunk_layer, + mut visible_entity_layers, + old_visible_entity_layers, + )| { + let block_pos = BlockPos::from(old_view.old_pos.get()); + let old_view = old_view.get(); + + fn in_radius(p0: BlockPos, p1: BlockPos, radius_squared: u32) -> bool { + let dist_squared = + (p1.x - p0.x).pow(2) + (p1.y - p0.y).pow(2) + (p1.z - p0.z).pow(2); + + dist_squared as u32 <= radius_squared + } + + // Chunk layer messages + if let Ok(chunk_layer) = chunk_layers.get(old_visible_chunk_layer.get()) { + let messages = chunk_layer.messages(); + let bytes = messages.bytes(); + + // Global messages + for (msg, range) in messages.iter_global() { + match msg { + crate::layer::chunk::GlobalMsg::Packet => { + client.write_packet_bytes(&bytes[range]); + } + crate::layer::chunk::GlobalMsg::PacketExcept { except } => { + if self_entity != except { + client.write_packet_bytes(&bytes[range]); + } + } + } + } + + let mut chunk_biome_buf = vec![]; + + // Local messages + messages.query_local(old_view, |msg, range| match msg { + crate::layer::chunk::LocalMsg::PacketAt { .. } => { + client.write_packet_bytes(&bytes[range]); + } + crate::layer::chunk::LocalMsg::PacketAtExcept { except, .. } => { + if self_entity != except { + client.write_packet_bytes(&bytes[range]); + } + } + crate::layer::chunk::LocalMsg::RadiusAt { + center, + radius_squared, + } => { + if in_radius(block_pos, center, radius_squared) { + client.write_packet_bytes(&bytes[range]); + } + } + crate::layer::chunk::LocalMsg::RadiusAtExcept { + center, + radius_squared, + except, + } => { + if self_entity != except && in_radius(block_pos, center, radius_squared) { + client.write_packet_bytes(&bytes[range]); + } + } + crate::layer::chunk::LocalMsg::ChangeBiome { pos } => { + chunk_biome_buf.push(ChunkBiome { + pos, + data: &bytes[range], + }); + } + crate::layer::chunk::LocalMsg::ChangeChunkState { pos } => { + match &bytes[range] { + [ChunkLayer::LOAD, .., ChunkLayer::UNLOAD] => { + // Chunk is being loaded and unloaded on the + // same tick, so there's no need to do anything. + debug_assert!(chunk_layer.chunk(pos).is_none()); + } + [.., ChunkLayer::LOAD | ChunkLayer::OVERWRITE] => { + // Load chunk. + let chunk = chunk_layer.chunk(pos).expect("chunk must exist"); + chunk.write_init_packets(&mut *client, pos, chunk_layer.info()); + chunk.inc_viewer_count(); + } + [.., ChunkLayer::UNLOAD] => { + // Unload chunk. + client.write_packet(&UnloadChunkS2c { pos }); + debug_assert!(chunk_layer.chunk(pos).is_none()); + } + _ => unreachable!("invalid message data while changing chunk state"), + } + } + }); + + if !chunk_biome_buf.is_empty() { + client.write_packet(&ChunkBiomeDataS2c { + chunks: chunk_biome_buf.into(), + }); + } + } + + // Entity layer messages + for &layer_id in &old_visible_entity_layers.0 { + if let Ok(layer) = entity_layers.get(layer_id) { + let messages = layer.messages(); + let bytes = messages.bytes(); + + // Global messages + for (msg, range) in messages.iter_global() { + match msg { + crate::layer::entity::GlobalMsg::Packet => { + client.write_packet_bytes(&bytes[range]); + } + crate::layer::entity::GlobalMsg::PacketExcept { except } => { + if self_entity != except { + client.write_packet_bytes(&bytes[range]); + } + } + crate::layer::entity::GlobalMsg::DespawnLayer => { + // Remove this entity layer. The changes to the visible entity layer + // set will be detected by the `update_view_and_layers` system and + // despawning of entities will happen there. + visible_entity_layers.0.remove(&layer_id); + } + } + } + + // Local messages + messages.query_local(old_view, |msg, range| match msg { + crate::layer::entity::LocalMsg::DespawnEntity { pos: _, dest_layer } => { + if !old_visible_entity_layers.0.contains(&dest_layer) { + let mut bytes = &bytes[range]; + + while let Ok(id) = bytes.read_i32::() { + if self_entity_id.get() != id { + remove_buf.push(id); + } + } + } + } + crate::layer::entity::LocalMsg::DespawnEntityTransition { + pos: _, + dest_pos, + } => { + if !old_view.contains(dest_pos) { + let mut bytes = &bytes[range]; + + while let Ok(id) = bytes.read_i32::() { + if self_entity_id.get() != id { + remove_buf.push(id); + } + } + } + } + crate::layer::entity::LocalMsg::SpawnEntity { pos: _, src_layer } => { + if !old_visible_entity_layers.0.contains(&src_layer) { + let mut bytes = &bytes[range]; + + while let Ok(u64) = bytes.read_u64::() { + let entity = Entity::from_bits(u64); + + if self_entity != entity { + if let Ok((init, old_pos)) = entities.get(entity) { + remove_buf.send_and_clear(&mut *client); + + // Spawn at the entity's old position since we may get a + // relative movement packet for this entity in a later + // iteration of the loop. + init.write_init_packets(old_pos.get(), &mut *client); + } + } + } + } + } + crate::layer::entity::LocalMsg::SpawnEntityTransition { + pos: _, + src_pos, + } => { + if !old_view.contains(src_pos) { + let mut bytes = &bytes[range]; + + while let Ok(u64) = bytes.read_u64::() { + let entity = Entity::from_bits(u64); + + if self_entity != entity { + if let Ok((init, old_pos)) = entities.get(entity) { + remove_buf.send_and_clear(&mut *client); + + // Spawn at the entity's old position since we may get a + // relative movement packet for this entity in a later + // iteration of the loop. + init.write_init_packets(old_pos.get(), &mut *client); + } + } + } + } + } + crate::layer::entity::LocalMsg::PacketAt { pos: _ } => { + client.write_packet_bytes(&bytes[range]); + } + crate::layer::entity::LocalMsg::PacketAtExcept { pos: _, except } => { + if self_entity != except { + client.write_packet_bytes(&bytes[range]); + } + } + crate::layer::entity::LocalMsg::RadiusAt { + center, + radius_squared, + } => { + if in_radius(block_pos, center, radius_squared) { + client.write_packet_bytes(&bytes[range]); + } + } + crate::layer::entity::LocalMsg::RadiusAtExcept { + center, + radius_squared, + except, + } => { + if self_entity != except && in_radius(block_pos, center, radius_squared) + { + client.write_packet_bytes(&bytes[range]); + } + } + }); + + remove_buf.send_and_clear(&mut *client); + } + } + }, + ); +} + +pub(crate) fn update_view_and_layers( + mut clients: Query< + ( + Entity, + &mut Client, + &mut EntityRemoveBuf, + &VisibleChunkLayer, + &mut OldVisibleChunkLayer, + Ref, + &mut OldVisibleEntityLayers, + &Position, + &OldPosition, + &ViewDistance, + &OldViewDistance, + ), + Or<( + Changed, + Changed, + Changed, + Changed, + )>, + >, + chunk_layers: Query<&ChunkLayer>, + entity_layers: Query<&EntityLayer>, + entity_ids: Query<&EntityId>, + entity_init: Query<(EntityInitQuery, &Position)>, +) { + clients.par_iter_mut().for_each( + |( + self_entity, + mut client, + mut remove_buf, + chunk_layer, + mut old_chunk_layer, + visible_entity_layers, + mut old_visible_entity_layers, + pos, + old_pos, + view_dist, + old_view_dist, + )| { + let view = ChunkView::new(ChunkPos::from(pos.0), view_dist.0); + let old_view = ChunkView::new(ChunkPos::from(old_pos.get()), old_view_dist.0); + + // Make sure the center chunk is set before loading chunks! Otherwise the client + // may ignore the chunk. + if old_view.pos != view.pos { + client.write_packet(&ChunkRenderDistanceCenterS2c { + chunk_x: VarInt(view.pos.x), + chunk_z: VarInt(view.pos.z), + }); + } + + // Was the client's chunk layer changed? + if old_chunk_layer.0 != chunk_layer.0 { + // Unload all chunks in the old view. + // TODO: can we skip this step if old dimension != new dimension? + if let Ok(layer) = chunk_layers.get(old_chunk_layer.0) { + for pos in old_view.iter() { + if let Some(chunk) = layer.chunk(pos) { + client.write_packet(&UnloadChunkS2c { pos }); + chunk.dec_viewer_count(); + } + } + } + + // Load all chunks in the new view. + if let Ok(layer) = chunk_layers.get(chunk_layer.0) { + for pos in view.iter() { + if let Some(chunk) = layer.chunk(pos) { + chunk.write_init_packets(&mut *client, pos, layer.info()); + chunk.inc_viewer_count(); + } + } + } + + // Unload all entities from the old view in all old visible entity layers. + // TODO: can we skip this step if old dimension != new dimension? + for &layer in &old_visible_entity_layers.0 { + if let Ok(layer) = entity_layers.get(layer) { + for pos in old_view.iter() { + for entity in layer.entities_at(pos) { + if self_entity != entity { + if let Ok(id) = entity_ids.get(entity) { + remove_buf.push(id.get()); + } + } + } + } + } + } + + remove_buf.send_and_clear(&mut *client); + + // Load all entities in the new view from all new visible entity layers. + for &layer in &visible_entity_layers.0 { + if let Ok(layer) = entity_layers.get(layer) { + for pos in view.iter() { + for entity in layer.entities_at(pos) { + if self_entity != entity { + if let Ok((init, pos)) = entity_init.get(entity) { + init.write_init_packets(pos.get(), &mut *client); + } + } + } + } + } + } + } else { + // Update the client's visible entity layers. + if visible_entity_layers.is_changed() { + // Unload all entity layers that are no longer visible in the old view. + for &layer in old_visible_entity_layers + .0 + .difference(&visible_entity_layers.0) + { + if let Ok(layer) = entity_layers.get(layer) { + for pos in old_view.iter() { + for entity in layer.entities_at(pos) { + if self_entity != entity { + if let Ok(id) = entity_ids.get(entity) { + remove_buf.push(id.get()); + } + } + } + } + } + } + + remove_buf.send_and_clear(&mut *client); + + // Load all entity layers that are newly visible in the old view. + for &layer in visible_entity_layers + .0 + .difference(&old_visible_entity_layers.0) + { + if let Ok(layer) = entity_layers.get(layer) { + for pos in old_view.iter() { + for entity in layer.entities_at(pos) { + if self_entity != entity { + if let Ok((init, pos)) = entity_init.get(entity) { + init.write_init_packets(pos.get(), &mut *client); + } + } + } + } + } + } + } + + // Update the client's view (chunk position and view distance) + if old_view != view { + // Unload chunks and entities in the old view and load chunks and entities in + // the new view. We don't need to do any work where the old and new view + // overlap. + + // Unload chunks in the old view. + if let Ok(layer) = chunk_layers.get(chunk_layer.0) { + for pos in old_view.diff(view) { + if let Some(chunk) = layer.chunk(pos) { + client.write_packet(&UnloadChunkS2c { pos }); + chunk.dec_viewer_count(); + } + } + } + + // Load chunks in the new view. + if let Ok(layer) = chunk_layers.get(chunk_layer.0) { + for pos in view.diff(old_view) { + if let Some(chunk) = layer.chunk(pos) { + chunk.write_init_packets(&mut *client, pos, layer.info()); + chunk.inc_viewer_count(); + } + } + } + + // Unload entities from the new visible layers (since we updated it above). + for &layer in &visible_entity_layers.0 { + if let Ok(layer) = entity_layers.get(layer) { + for pos in old_view.diff(view) { + for entity in layer.entities_at(pos) { + if self_entity != entity { + if let Ok(id) = entity_ids.get(entity) { + remove_buf.push(id.get()); + } + } + } + } + } + } + + // Load entities from the new visible layers. + for &layer in &visible_entity_layers.0 { + if let Ok(layer) = entity_layers.get(layer) { + for pos in view.diff(old_view) { + for entity in layer.entities_at(pos) { + if self_entity != entity { + if let Ok((init, pos)) = entity_init.get(entity) { + init.write_init_packets(pos.get(), &mut *client); + } + } + } + } + } + } + } + } + + // Update the old layers. + + old_chunk_layer.0 = chunk_layer.0; + + if visible_entity_layers.is_changed() { + old_visible_entity_layers + .0 + .clone_from(&visible_entity_layers.0); + } + }, + ); +} + +pub(crate) fn update_game_mode(mut clients: Query<(&mut Client, &GameMode), Changed>) { + for (mut client, game_mode) in &mut clients { + if client.is_added() { + // Game join packet includes the initial game mode. + continue; + } + + client.write_packet(&GameStateChangeS2c { + kind: GameEventKind::ChangeGameMode, + value: *game_mode as i32 as f32, + }) + } +} + +fn update_food_saturation_health( + mut clients: Query< + (&mut Client, &Food, &Saturation, &Health), + Or<(Changed, Changed, Changed)>, + >, +) { + for (mut client, food, saturation, health) in &mut clients { + client.write_packet(&HealthUpdateS2c { + health: health.0, + food: VarInt(food.0), + food_saturation: saturation.0, + }); + } +} + +fn update_old_view_dist( + mut clients: Query<(&mut OldViewDistance, &ViewDistance), Changed>, +) { + for (mut old_dist, dist) in &mut clients { + old_dist.0 = dist.0; + } +} + +fn flush_packets( + mut clients: Query<(Entity, &mut Client), Changed>, + mut commands: Commands, +) { + for (entity, mut client) in &mut clients { + if let Err(e) = client.flush_packets() { + warn!("Failed to flush packet queue for client {entity:?}: {e:#}."); + commands.entity(entity).remove::(); + } + } +} + +fn init_tracked_data(mut clients: Query<(&mut Client, &TrackedData), Added>) { + for (mut client, tracked_data) in &mut clients { + if let Some(init_data) = tracked_data.init_data() { + client.write_packet(&EntityTrackerUpdateS2c { + entity_id: VarInt(0), + tracked_values: init_data.into(), + }); + } + } +} + +fn update_tracked_data(mut clients: Query<(&mut Client, &TrackedData)>) { + for (mut client, tracked_data) in &mut clients { + if let Some(update_data) = tracked_data.update_data() { + client.write_packet(&EntityTrackerUpdateS2c { + entity_id: VarInt(0), + tracked_values: update_data.into(), + }); + } + } +} + +fn init_tracked_attributes( + mut clients: Query<(&mut Client, &EntityAttributes), Added>, +) { + for (mut client, attributes) in &mut clients { + client.write_packet(&EntityAttributesS2c { + entity_id: VarInt(0), + properties: attributes.to_properties(), + }); + } +} + +fn update_tracked_attributes(mut clients: Query<(&mut Client, &TrackedEntityAttributes)>) { + for (mut client, attributes) in &mut clients { + let properties = attributes.get_properties(); + if !properties.is_empty() { + client.write_packet(&EntityAttributesS2c { + entity_id: VarInt(0), + properties, + }); + } + } +} + +/// Decrement viewer count of chunks when the client is despawned. +fn cleanup_chunks_after_client_despawn( + mut clients: Query<(View, &VisibleChunkLayer), (With, With)>, + chunk_layers: Query<&ChunkLayer>, +) { + for (view, layer) in &mut clients { + if let Ok(layer) = chunk_layers.get(layer.0) { + for pos in view.get().iter() { + if let Some(chunk) = layer.chunk(pos) { + chunk.dec_viewer_count(); + } + } + } + } +} diff --git a/vendor/valence/crates/valence_server/src/client_command.rs b/vendor/valence/crates/valence_server/src/client_command.rs new file mode 100644 index 00000000..05f08433 --- /dev/null +++ b/vendor/valence/crates/valence_server/src/client_command.rs @@ -0,0 +1,147 @@ +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use valence_entity::entity::Flags; +use valence_entity::{entity, Pose}; +pub use valence_protocol::packets::play::client_command_c2s::ClientCommand; +use valence_protocol::packets::play::ClientCommandC2s; + +use crate::event_loop::{EventLoopPreUpdate, PacketEvent}; + +pub struct ClientCommandPlugin; + +impl Plugin for ClientCommandPlugin { + fn build(&self, app: &mut App) { + app.add_event::() + .add_event::() + .add_event::() + .add_event::() + .add_systems(EventLoopPreUpdate, handle_client_command); + } +} + +#[derive(Event, Copy, Clone, PartialEq, Eq, Debug)] +pub struct SprintEvent { + pub client: Entity, + pub state: SprintState, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug)] +pub enum SprintState { + Start, + Stop, +} + +#[derive(Event, Copy, Clone, PartialEq, Eq, Debug)] +pub struct SneakEvent { + pub client: Entity, + pub state: SneakState, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug)] +pub enum SneakState { + Start, + Stop, +} + +#[derive(Event, Copy, Clone, PartialEq, Eq, Debug)] +pub struct JumpWithHorseEvent { + pub client: Entity, + pub state: JumpWithHorseState, +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug)] +pub enum JumpWithHorseState { + Start { + /// The power of the horse jump in `0..=100`. + power: u8, + }, + Stop, +} + +#[derive(Event, Copy, Clone, PartialEq, Eq, Debug)] +pub struct LeaveBedEvent { + pub client: Entity, +} + +fn handle_client_command( + mut packets: EventReader, + mut clients: Query<(&mut entity::Pose, &mut Flags)>, + mut sprinting_events: EventWriter, + mut sneaking_events: EventWriter, + mut jump_with_horse_events: EventWriter, + mut leave_bed_events: EventWriter, +) { + for packet in packets.read() { + if let Some(pkt) = packet.decode::() { + match pkt.action { + ClientCommand::StartSneaking => { + if let Ok((mut pose, mut flags)) = clients.get_mut(packet.client) { + pose.0 = Pose::Sneaking; + flags.set_sneaking(true); + } + + sneaking_events.send(SneakEvent { + client: packet.client, + state: SneakState::Start, + }) + } + ClientCommand::StopSneaking => { + if let Ok((mut pose, mut flags)) = clients.get_mut(packet.client) { + pose.0 = Pose::Standing; + flags.set_sneaking(false); + } + + sneaking_events.send(SneakEvent { + client: packet.client, + state: SneakState::Stop, + }) + } + ClientCommand::LeaveBed => leave_bed_events.send(LeaveBedEvent { + client: packet.client, + }), + ClientCommand::StartSprinting => { + if let Ok((_, mut flags)) = clients.get_mut(packet.client) { + flags.set_sprinting(true); + } + + sprinting_events.send(SprintEvent { + client: packet.client, + state: SprintState::Start, + }); + } + ClientCommand::StopSprinting => { + if let Ok((_, mut flags)) = clients.get_mut(packet.client) { + flags.set_sprinting(false); + } + + sprinting_events.send(SprintEvent { + client: packet.client, + state: SprintState::Stop, + }) + } + ClientCommand::StartJumpWithHorse => { + jump_with_horse_events.send(JumpWithHorseEvent { + client: packet.client, + state: JumpWithHorseState::Start { + power: pkt.jump_boost.0 as u8, + }, + }) + } + ClientCommand::StopJumpWithHorse => { + jump_with_horse_events.send(JumpWithHorseEvent { + client: packet.client, + state: JumpWithHorseState::Stop, + }) + } + ClientCommand::OpenHorseInventory => {} // TODO + ClientCommand::StartFlyingWithElytra => { + if let Ok((mut pose, _)) = clients.get_mut(packet.client) { + pose.0 = Pose::FallFlying; + } + + // TODO. + } + } + } + } +} diff --git a/vendor/valence/crates/valence_server/src/client_settings.rs b/vendor/valence/crates/valence_server/src/client_settings.rs new file mode 100644 index 00000000..3e5322ed --- /dev/null +++ b/vendor/valence/crates/valence_server/src/client_settings.rs @@ -0,0 +1,55 @@ +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use valence_entity::player::{self, PlayerModelParts}; +use valence_protocol::packets::play::client_settings_c2s::ChatMode; +use valence_protocol::packets::play::ClientSettingsC2s; + +use crate::client::ViewDistance; +use crate::event_loop::{EventLoopPreUpdate, PacketEvent}; + +pub struct ClientSettingsPlugin; + +impl Plugin for ClientSettingsPlugin { + fn build(&self, app: &mut App) { + app.add_systems(EventLoopPreUpdate, handle_client_settings); + } +} + +/// Component containing client-controlled settings about a client. +#[derive(Component, Default, Debug)] +pub struct ClientSettings { + pub locale: Box, + pub chat_mode: ChatMode, + pub chat_colors: bool, + pub enable_text_filtering: bool, + pub allow_server_listings: bool, +} + +fn handle_client_settings( + mut packets: EventReader, + mut clients: Query<( + &mut ViewDistance, + &mut ClientSettings, + &mut PlayerModelParts, + &mut player::MainArm, + )>, +) { + for packet in packets.read() { + if let Some(pkt) = packet.decode::() { + if let Ok((mut view_dist, mut settings, mut model_parts, mut main_arm)) = + clients.get_mut(packet.client) + { + view_dist.set_if_neq(ViewDistance::new(pkt.view_distance)); + + settings.locale = pkt.locale.into(); + settings.chat_mode = pkt.chat_mode; + settings.chat_colors = pkt.chat_colors; + settings.enable_text_filtering = pkt.enable_text_filtering; + settings.allow_server_listings = pkt.allow_server_listings; + + model_parts.set_if_neq(PlayerModelParts(u8::from(pkt.displayed_skin_parts) as i8)); + main_arm.set_if_neq(player::MainArm(pkt.main_arm as i8)); + } + } + } +} diff --git a/vendor/valence/crates/valence_server/src/custom_payload.rs b/vendor/valence/crates/valence_server/src/custom_payload.rs new file mode 100644 index 00000000..b92f79e4 --- /dev/null +++ b/vendor/valence/crates/valence_server/src/custom_payload.rs @@ -0,0 +1,47 @@ +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use valence_protocol::packets::play::{CustomPayloadC2s, CustomPayloadS2c}; +use valence_protocol::{Bounded, Ident, WritePacket}; + +use crate::client::Client; +use crate::event_loop::{EventLoopPreUpdate, PacketEvent}; + +pub struct CustomPayloadPlugin; + +impl Plugin for CustomPayloadPlugin { + fn build(&self, app: &mut App) { + app.add_event::() + .add_systems(EventLoopPreUpdate, handle_custom_payload); + } +} + +#[derive(Event, Clone, Debug)] +pub struct CustomPayloadEvent { + pub client: Entity, + pub channel: Ident, + pub data: Box<[u8]>, +} + +impl Client { + pub fn send_custom_payload(&mut self, channel: Ident, data: &[u8]) { + self.write_packet(&CustomPayloadS2c { + channel: channel.into(), + data: Bounded(data.into()), + }); + } +} + +fn handle_custom_payload( + mut packets: EventReader, + mut events: EventWriter, +) { + for packet in packets.read() { + if let Some(pkt) = packet.decode::() { + events.send(CustomPayloadEvent { + client: packet.client, + channel: pkt.channel.into(), + data: pkt.data.0 .0.into(), + }) + } + } +} diff --git a/vendor/valence/crates/valence_server/src/event_loop.rs b/vendor/valence/crates/valence_server/src/event_loop.rs new file mode 100644 index 00000000..c89a7c00 --- /dev/null +++ b/vendor/valence/crates/valence_server/src/event_loop.rs @@ -0,0 +1,181 @@ +use std::time::Instant; + +use bevy_app::prelude::*; +use bevy_app::MainScheduleOrder; +use bevy_ecs::prelude::*; +use bevy_ecs::schedule::ScheduleLabel; +use bevy_ecs::system::SystemState; +use bytes::Bytes; +use tracing::{debug, warn}; +use valence_protocol::{Decode, Packet}; + +use crate::client::Client; + +pub struct EventLoopPlugin; + +impl Plugin for EventLoopPlugin { + fn build(&self, app: &mut App) { + app.add_event::() + .add_schedule(Schedule::new(RunEventLoop)) + .add_schedule(Schedule::new(EventLoopPreUpdate)) + .add_schedule(Schedule::new(EventLoopUpdate)) + .add_schedule(Schedule::new(EventLoopPostUpdate)) + .add_systems(RunEventLoop, run_event_loop); + + app.world + .resource_mut::() + .insert_after(PreUpdate, RunEventLoop); + } +} + +/// The schedule responsible for running [`EventLoopPreUpdate`], +/// [`EventLoopUpdate`], and [`EventLoopPostUpdate`]. +/// +/// This schedule is situated between [`PreUpdate`] and [`Update`]. +#[derive(ScheduleLabel, Clone, Debug, PartialEq, Eq, Hash)] +pub struct RunEventLoop; + +#[derive(ScheduleLabel, Clone, Debug, PartialEq, Eq, Hash)] +pub struct EventLoopPreUpdate; + +#[derive(ScheduleLabel, Clone, Debug, PartialEq, Eq, Hash)] +pub struct EventLoopUpdate; + +#[derive(ScheduleLabel, Clone, Debug, PartialEq, Eq, Hash)] +pub struct EventLoopPostUpdate; + +#[derive(Event, Clone, Debug)] +pub struct PacketEvent { + /// The client this packet originated from. + pub client: Entity, + /// The moment in time this packet arrived. + pub timestamp: Instant, + /// This packet's ID. + pub id: i32, + /// The content of the packet, excluding the leading varint packet ID. + pub data: Bytes, +} + +impl PacketEvent { + /// Attempts to decode this packet as the packet `P`. + /// + /// If the packet ID is mismatched or an error occurs, `None` is returned. + /// Otherwise, `Some` is returned containing the decoded packet. + #[inline] + pub fn decode

(&self) -> Option

+ where + P: Packet + Decode, + { + if self.id == P::ID { + let mut r = &self.data[..]; + + match P::decode(&mut r) { + Ok(pkt) => { + if r.is_empty() { + return Some(pkt); + } + + warn!( + "missed {} bytes while decoding packet {} (ID = {})", + r.len(), + P::NAME, + P::ID + ); + debug!("complete packet after partial decode: {pkt:?}"); + } + Err(e) => { + warn!("failed to decode packet with ID of {}: {e:#}", P::ID); + } + } + } + + None + } +} + +fn run_event_loop_schedules(world: &mut World) { + world.run_schedule(EventLoopPreUpdate); + world.run_schedule(EventLoopUpdate); + world.run_schedule(EventLoopPostUpdate); +} + +/// An exclusive system for running the event loop schedule. +#[allow(clippy::type_complexity)] +fn run_event_loop( + world: &mut World, + state: &mut SystemState<( + Query<(Entity, &mut Client)>, + EventWriter, + Commands, + )>, + mut check_again: Local>, +) { + debug_assert!(check_again.is_empty()); + + let (mut clients, mut event_writer, mut commands) = state.get_mut(world); + + for (entity, mut client) in &mut clients { + match client.connection_mut().try_recv() { + Ok(Some(pkt)) => { + event_writer.send(PacketEvent { + client: entity, + timestamp: pkt.timestamp, + id: pkt.id, + data: pkt.body, + }); + + let remaining = client.connection().len(); + + if remaining > 0 { + check_again.push((entity, remaining)); + } + } + Ok(None) => {} + Err(e) => { + // Client is disconnected. + debug!("disconnecting client: {e:#}"); + commands.entity(entity).remove::(); + } + } + } + + state.apply(world); + run_event_loop_schedules(world); + + while !check_again.is_empty() { + let (mut clients, mut event_writer, mut commands) = state.get_mut(world); + + check_again.retain_mut(|(entity, remaining)| { + debug_assert!(*remaining > 0); + + if let Ok((_, mut client)) = clients.get_mut(*entity) { + match client.connection_mut().try_recv() { + Ok(Some(pkt)) => { + event_writer.send(PacketEvent { + client: *entity, + timestamp: pkt.timestamp, + id: pkt.id, + data: pkt.body, + }); + *remaining -= 1; + // Keep looping as long as there are packets to process this tick. + *remaining > 0 + } + Ok(None) => false, + Err(e) => { + // Client is disconnected. + debug!("disconnecting client: {e:#}"); + commands.entity(*entity).remove::(); + false + } + } + } else { + // Client must have been deleted in the last run of the schedule. + false + } + }); + + state.apply(world); + run_event_loop_schedules(world); + } +} diff --git a/vendor/valence/crates/valence_server/src/hand_swing.rs b/vendor/valence/crates/valence_server/src/hand_swing.rs new file mode 100644 index 00000000..856d36cc --- /dev/null +++ b/vendor/valence/crates/valence_server/src/hand_swing.rs @@ -0,0 +1,44 @@ +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use valence_entity::{EntityAnimation, EntityAnimations}; +use valence_protocol::packets::play::HandSwingC2s; +use valence_protocol::Hand; + +use crate::event_loop::{EventLoopPreUpdate, PacketEvent}; + +pub struct HandSwingPlugin; + +impl Plugin for HandSwingPlugin { + fn build(&self, app: &mut App) { + app.add_event::() + .add_systems(EventLoopPreUpdate, handle_hand_swing); + } +} + +#[derive(Event, Copy, Clone, PartialEq, Eq, Debug)] +pub struct HandSwingEvent { + pub client: Entity, + pub hand: Hand, +} + +fn handle_hand_swing( + mut packets: EventReader, + mut clients: Query<&mut EntityAnimations>, + mut events: EventWriter, +) { + for packet in packets.read() { + if let Some(pkt) = packet.decode::() { + if let Ok(mut anim) = clients.get_mut(packet.client) { + anim.trigger(match pkt.hand { + Hand::Main => EntityAnimation::SwingMainHand, + Hand::Off => EntityAnimation::SwingOffHand, + }); + } + + events.send(HandSwingEvent { + client: packet.client, + hand: pkt.hand, + }); + } + } +} diff --git a/vendor/valence/crates/valence_server/src/interact_block.rs b/vendor/valence/crates/valence_server/src/interact_block.rs new file mode 100644 index 00000000..88bbe5a2 --- /dev/null +++ b/vendor/valence/crates/valence_server/src/interact_block.rs @@ -0,0 +1,60 @@ +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use valence_math::Vec3; +use valence_protocol::packets::play::PlayerInteractBlockC2s; +use valence_protocol::{BlockPos, Direction, Hand}; + +use crate::action::ActionSequence; +use crate::event_loop::{EventLoopPreUpdate, PacketEvent}; + +pub struct InteractBlockPlugin; + +impl Plugin for InteractBlockPlugin { + fn build(&self, app: &mut App) { + app.add_event::() + .add_systems(EventLoopPreUpdate, handle_interact_block); + } +} + +#[derive(Event, Copy, Clone, Debug)] +pub struct InteractBlockEvent { + pub client: Entity, + /// The hand that was used + pub hand: Hand, + /// The location of the block that was interacted with + pub position: BlockPos, + /// The face of the block that was clicked + pub face: Direction, + /// The position inside of the block that was clicked on + pub cursor_pos: Vec3, + /// Whether or not the player's head is inside a block + pub head_inside_block: bool, + /// Sequence number for synchronization + pub sequence: i32, +} + +fn handle_interact_block( + mut packets: EventReader, + mut clients: Query<&mut ActionSequence>, + mut events: EventWriter, +) { + for packet in packets.read() { + if let Some(pkt) = packet.decode::() { + if let Ok(mut action_seq) = clients.get_mut(packet.client) { + action_seq.update(pkt.sequence.0); + } + + // TODO: check that the block interaction is valid. + + events.send(InteractBlockEvent { + client: packet.client, + hand: pkt.hand, + position: pkt.position, + face: pkt.face, + cursor_pos: pkt.cursor_pos, + head_inside_block: pkt.head_inside_block, + sequence: pkt.sequence.0, + }); + } + } +} diff --git a/vendor/valence/crates/valence_server/src/interact_entity.rs b/vendor/valence/crates/valence_server/src/interact_entity.rs new file mode 100644 index 00000000..98e0d84f --- /dev/null +++ b/vendor/valence/crates/valence_server/src/interact_entity.rs @@ -0,0 +1,50 @@ +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use valence_entity::EntityManager; +pub use valence_protocol::packets::play::player_interact_entity_c2s::EntityInteraction; +use valence_protocol::packets::play::PlayerInteractEntityC2s; + +use crate::event_loop::{EventLoopPreUpdate, PacketEvent}; + +pub struct InteractEntityPlugin; + +impl Plugin for InteractEntityPlugin { + fn build(&self, app: &mut App) { + app.add_event::() + .add_systems(EventLoopPreUpdate, handle_interact_entity); + } +} + +#[derive(Event, Copy, Clone, Debug)] +pub struct InteractEntityEvent { + pub client: Entity, + /// The entity being interacted with. + pub entity: Entity, + /// If the client was sneaking during the interaction. + pub sneaking: bool, + /// The kind of interaction that occurred. + pub interact: EntityInteraction, +} + +fn handle_interact_entity( + mut packets: EventReader, + entities: Res, + mut events: EventWriter, +) { + for packet in packets.read() { + if let Some(pkt) = packet.decode::() { + // TODO: check that the entity is in the same instance as the player. + // TODO: check that the distance between the player and the interacted entity is + // within some configurable tolerance level. + + if let Some(entity) = entities.get_by_id(pkt.entity_id.0) { + events.send(InteractEntityEvent { + client: packet.client, + entity, + sneaking: pkt.sneaking, + interact: pkt.interact, + }) + } + } + } +} diff --git a/vendor/valence/crates/valence_server/src/interact_item.rs b/vendor/valence/crates/valence_server/src/interact_item.rs new file mode 100644 index 00000000..437e54c9 --- /dev/null +++ b/vendor/valence/crates/valence_server/src/interact_item.rs @@ -0,0 +1,43 @@ +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use valence_protocol::packets::play::PlayerInteractItemC2s; +use valence_protocol::Hand; + +use crate::action::ActionSequence; +use crate::event_loop::{EventLoopPreUpdate, PacketEvent}; + +pub struct InteractItemPlugin; + +impl Plugin for InteractItemPlugin { + fn build(&self, app: &mut App) { + app.add_event::() + .add_systems(EventLoopPreUpdate, handle_player_interact_item); + } +} + +#[derive(Event, Copy, Clone, Debug)] +pub struct InteractItemEvent { + pub client: Entity, + pub hand: Hand, + pub sequence: i32, +} + +fn handle_player_interact_item( + mut packets: EventReader, + mut clients: Query<&mut ActionSequence>, + mut events: EventWriter, +) { + for packet in packets.read() { + if let Some(pkt) = packet.decode::() { + if let Ok(mut action_seq) = clients.get_mut(packet.client) { + action_seq.update(pkt.sequence.0); + } + + events.send(InteractItemEvent { + client: packet.client, + hand: pkt.hand, + sequence: pkt.sequence.0, + }); + } + } +} diff --git a/vendor/valence/crates/valence_server/src/keepalive.rs b/vendor/valence/crates/valence_server/src/keepalive.rs new file mode 100644 index 00000000..0f97774e --- /dev/null +++ b/vendor/valence/crates/valence_server/src/keepalive.rs @@ -0,0 +1,118 @@ +use std::time::{Duration, Instant}; + +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use derive_more::Deref; +use tracing::warn; +use valence_protocol::packets::play::{KeepAliveC2s, KeepAliveS2c}; +use valence_protocol::WritePacket; + +use crate::client::{Client, UpdateClientsSet}; +use crate::event_loop::{EventLoopPreUpdate, PacketEvent}; + +pub struct KeepalivePlugin; + +impl Plugin for KeepalivePlugin { + fn build(&self, app: &mut App) { + app.init_resource::() + .add_systems(PostUpdate, send_keepalive.in_set(UpdateClientsSet)) + .add_systems(EventLoopPreUpdate, handle_keepalive_response); + } +} + +#[derive(Resource, Debug)] +pub struct KeepaliveSettings { + // How long to wait before sending keepalives and how long to wait for a response. + pub period: Duration, +} + +impl Default for KeepaliveSettings { + fn default() -> Self { + Self { + period: Duration::from_secs(8), + } + } +} + +#[derive(Component, Debug)] +pub struct KeepaliveState { + got_keepalive: bool, + last_keepalive_id: u64, + last_send: Instant, +} + +/// Delay measured in milliseconds. Negative values indicate absence. +#[derive(Component, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Deref)] +pub struct Ping(pub i32); + +impl Default for Ping { + fn default() -> Self { + Self(-1) + } +} + +impl KeepaliveState { + pub(super) fn new() -> Self { + Self { + got_keepalive: true, + last_keepalive_id: 0, + last_send: Instant::now(), + } + } + + /// When the last keepalive was sent for this client. + pub fn last_send(&self) -> Instant { + self.last_send + } +} + +fn send_keepalive( + mut clients: Query<(Entity, &mut Client, &mut KeepaliveState)>, + settings: Res, + mut commands: Commands, +) { + let now = Instant::now(); + + for (entity, mut client, mut state) in &mut clients { + if now.duration_since(state.last_send) >= settings.period { + if state.got_keepalive { + let id = rand::random(); + client.write_packet(&KeepAliveS2c { id }); + + state.got_keepalive = false; + state.last_keepalive_id = id; + state.last_send = now; + } else { + let millis = settings.period.as_millis(); + warn!("Client {entity:?} timed out: no keepalive response after {millis}ms"); + commands.entity(entity).remove::(); + } + } + } +} + +fn handle_keepalive_response( + mut packets: EventReader, + mut clients: Query<(Entity, &mut KeepaliveState, &mut Ping)>, + mut commands: Commands, +) { + for packet in packets.read() { + if let Some(pkt) = packet.decode::() { + if let Ok((entity, mut state, mut ping)) = clients.get_mut(packet.client) { + if state.got_keepalive { + warn!("unexpected keepalive from client {entity:?}"); + commands.entity(entity).remove::(); + } else if pkt.id != state.last_keepalive_id { + warn!( + "keepalive IDs don't match for client {entity:?} (expected {}, got {})", + state.last_keepalive_id, pkt.id, + ); + commands.entity(entity).remove::(); + } else { + state.got_keepalive = true; + ping.0 = state.last_send.elapsed().as_millis() as i32; + } + } + } + } +} diff --git a/vendor/valence/crates/valence_server/src/layer.rs b/vendor/valence/crates/valence_server/src/layer.rs new file mode 100644 index 00000000..e547e635 --- /dev/null +++ b/vendor/valence/crates/valence_server/src/layer.rs @@ -0,0 +1,138 @@ +//! Defines chunk layers and entity layers. Chunk layers contain the chunks and +//! dimension data of a world, while entity layers contain all the Minecraft +//! entities. +//! +//! These two together are analogous to Minecraft "levels" or "worlds". + +pub mod bvh; +pub mod chunk; +pub mod entity; +pub mod message; + +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +pub use chunk::ChunkLayer; +pub use entity::EntityLayer; +use valence_protocol::encode::WritePacket; +use valence_protocol::{BlockPos, ChunkPos, Ident}; +use valence_registry::{BiomeRegistry, DimensionTypeRegistry}; +use valence_server_common::Server; + +pub struct LayerPlugin; + +/// When entity and chunk changes are written to layers. Systems that modify +/// chunks and entities should run _before_ this. Systems that need to read +/// layer messages should run _after_ this. +#[derive(SystemSet, Copy, Clone, PartialEq, Eq, Hash, Debug)] +pub struct UpdateLayersPreClientSet; + +/// When layers are cleared and messages from this tick are lost. Systems that +/// read layer messages should run _before_ this. +#[derive(SystemSet, Copy, Clone, PartialEq, Eq, Hash, Debug)] +pub struct UpdateLayersPostClientSet; + +// impl Plugin for LayerPlugin { +// fn build(&self, app: &mut App) { +// app.configure_sets( +// PostUpdate, +// ( +// UpdateLayersPreClientSet +// .after(InitEntitiesSet) +// .after(UpdateTrackedDataSet), +// UpdateLayersPostClientSet.after(UpdateLayersPreClientSet), +// ), +// ); +// +// chunk::build(app); +// entity::build(app); +// } +// } + +/// Common functionality for layers. Notable implementors are [`ChunkLayer`] and +/// [`EntityLayer`]. +/// +/// Layers support sending packets to viewers of the layer under various +/// conditions. These are the "packet writers" exposed by this trait. +/// +/// Layers themselves implement the [`WritePacket`] trait. Writing directly to a +/// layer will send packets to all viewers unconditionally. +pub trait Layer: WritePacket { + /// Packet writer returned by [`except_writer`](Self::except_writer). + type ExceptWriter<'a>: WritePacket + where + Self: 'a; + + /// Packet writer returned by [`view_writer`](Self::ViewWriter). + type ViewWriter<'a>: WritePacket + where + Self: 'a; + + /// Packet writer returned by + /// [`view_except_writer`](Self::ViewExceptWriter). + type ViewExceptWriter<'a>: WritePacket + where + Self: 'a; + + /// Packet writer returned by [`radius_writer`](Self::radius_writer). + type RadiusWriter<'a>: WritePacket + where + Self: 'a; + + /// Packet writer returned by + /// [`radius_except_writer`](Self::radius_except_writer). + type RadiusExceptWriter<'a>: WritePacket + where + Self: 'a; + + /// Returns a packet writer which sends packets to all viewers not + /// identified by `except`. + fn except_writer(&mut self, except: Entity) -> Self::ExceptWriter<'_>; + + /// Returns a packet writer which sends packets to viewers in view of + /// the chunk position `pos`. + fn view_writer(&mut self, pos: impl Into) -> Self::ViewWriter<'_>; + + /// Returns a packet writer which sends packets to viewers in + /// view of the chunk position `pos` and not identified by `except`. + fn view_except_writer( + &mut self, + pos: impl Into, + except: Entity, + ) -> Self::ViewExceptWriter<'_>; + + /// Returns a packet writer which sends packets to viewers within `radius` + /// blocks of the block position `pos`. + fn radius_writer(&mut self, pos: impl Into, radius: u32) -> Self::RadiusWriter<'_>; + + /// Returns a packet writer which sends packets to viewers within `radius` + /// blocks of the block position `pos` and not identified by `except`. + fn radius_except_writer( + &mut self, + pos: impl Into, + radius: u32, + except: Entity, + ) -> Self::RadiusExceptWriter<'_>; +} + +/// Convenience [`Bundle`] for spawning a layer entity with both [`ChunkLayer`] +/// and [`EntityLayer`] components. +#[derive(Bundle)] +pub struct LayerBundle { + pub chunk: ChunkLayer, + pub entity: EntityLayer, +} + +impl LayerBundle { + /// Returns a new layer bundle. + pub fn new( + dimension_type_name: impl Into, + dimensions: &DimensionTypeRegistry, + biomes: &BiomeRegistry, + server: &Server, + ) -> Self { + Self { + chunk: ChunkLayer::new(dimension_type_name, dimensions, biomes, server), + entity: EntityLayer::new(server), + } + } +} diff --git a/vendor/valence/crates/valence_server/src/layer/bvh.rs b/vendor/valence/crates/valence_server/src/layer/bvh.rs new file mode 100644 index 00000000..4f63cd01 --- /dev/null +++ b/vendor/valence/crates/valence_server/src/layer/bvh.rs @@ -0,0 +1,339 @@ +use std::mem; +use std::ops::Range; + +use valence_protocol::ChunkPos; + +use crate::ChunkView; + +/// A bounding volume hierarchy for chunk positions. +#[derive(Clone, Debug)] +pub struct ChunkBvh { + nodes: Vec, + values: Vec, +} + +impl Default for ChunkBvh { + fn default() -> Self { + Self::new() + } +} + +#[derive(Clone, Debug)] +enum Node { + Internal { + bounds: Aabb, + left: NodeIdx, + right: NodeIdx, + }, + Leaf { + bounds: Aabb, + /// Range of values in the values array. + values: Range, + }, +} + +#[cfg(test)] +impl Node { + fn bounds(&self) -> Aabb { + match self { + Node::Internal { bounds, .. } => *bounds, + Node::Leaf { bounds, .. } => *bounds, + } + } +} + +type NodeIdx = u32; + +#[derive(Copy, Clone, PartialEq, Eq, Debug)] +struct Aabb { + min: ChunkPos, + max: ChunkPos, +} + +impl Aabb { + fn point(pos: ChunkPos) -> Self { + Self { min: pos, max: pos } + } + + /// Sum of side lengths. + fn surface_area(self) -> i32 { + (self.length_x() + self.length_z()) * 2 + } + + /// Returns the smallest AABB containing `self` and `other`. + fn union(self, other: Self) -> Self { + Self { + min: ChunkPos::new(self.min.x.min(other.min.x), self.min.z.min(other.min.z)), + max: ChunkPos::new(self.max.x.max(other.max.x), self.max.z.max(other.max.z)), + } + } + + fn length_x(self) -> i32 { + self.max.x - self.min.x + } + + fn length_z(self) -> i32 { + self.max.z - self.min.z + } + + fn intersects(self, other: Self) -> bool { + self.min.x <= other.max.x + && self.max.x >= other.min.x + && self.min.z <= other.max.z + && self.max.z >= other.min.z + } +} + +/// Obtains a chunk position for the purpose of placement in the BVH. +pub trait GetChunkPos { + fn chunk_pos(&self) -> ChunkPos; +} + +impl GetChunkPos for ChunkPos { + fn chunk_pos(&self) -> ChunkPos { + *self + } +} + +impl ChunkBvh { + pub fn new() -> Self { + assert!(MAX_SURFACE_AREA > 0); + + Self { + nodes: vec![], + values: vec![], + } + } +} + +impl ChunkBvh { + pub fn build(&mut self, items: impl IntoIterator) { + self.nodes.clear(); + self.values.clear(); + + self.values.extend(items); + + if let Some(bounds) = value_bounds(&self.values) { + self.build_rec(bounds, 0..self.values.len()); + } + } + + fn build_rec(&mut self, bounds: Aabb, value_range: Range) { + if bounds.surface_area() <= MAX_SURFACE_AREA { + self.nodes.push(Node::Leaf { + bounds, + values: value_range.start as u32..value_range.end as u32, + }); + + return; + } + + let values = &mut self.values[value_range.clone()]; + + // Determine splitting axis based on the side that's longer. Then split along + // the spatial midpoint. We could use a more advanced heuristic like SAH, + // but it's probably not worth it. + + let point = if bounds.length_x() >= bounds.length_z() { + // Split on Z axis. + + let mid = middle(bounds.min.x, bounds.max.x); + partition(values, |v| v.chunk_pos().x >= mid) + } else { + // Split on X axis. + + let mid = middle(bounds.min.z, bounds.max.z); + partition(values, |v| v.chunk_pos().z >= mid) + }; + + let left_range = value_range.start..value_range.start + point; + let right_range = left_range.end..value_range.end; + + let left_bounds = + value_bounds(&self.values[left_range.clone()]).expect("left half should be nonempty"); + + let right_bounds = + value_bounds(&self.values[right_range.clone()]).expect("right half should be nonempty"); + + self.build_rec(left_bounds, left_range); + let left_idx = (self.nodes.len() - 1) as NodeIdx; + + self.build_rec(right_bounds, right_range); + let right_idx = (self.nodes.len() - 1) as NodeIdx; + + self.nodes.push(Node::Internal { + bounds, + left: left_idx, + right: right_idx, + }); + } + + pub fn query(&self, view: ChunkView, mut f: impl FnMut(&T)) { + if let Some(root) = self.nodes.last() { + let (min, max) = view.bounding_box(); + self.query_rec(root, view, Aabb { min, max }, &mut f); + } + } + + fn query_rec(&self, node: &Node, view: ChunkView, view_aabb: Aabb, f: &mut impl FnMut(&T)) { + match node { + Node::Internal { + bounds, + left, + right, + } => { + if bounds.intersects(view_aabb) { + self.query_rec(&self.nodes[*left as usize], view, view_aabb, f); + self.query_rec(&self.nodes[*right as usize], view, view_aabb, f); + } + } + Node::Leaf { bounds, values } => { + if bounds.intersects(view_aabb) { + for val in &self.values[values.start as usize..values.end as usize] { + if view.contains(val.chunk_pos()) { + f(val) + } + } + } + } + } + } + + pub fn shrink_to_fit(&mut self) { + self.nodes.shrink_to_fit(); + self.values.shrink_to_fit(); + } + + #[cfg(test)] + fn check_invariants(&self) { + if let Some(root) = self.nodes.last() { + self.check_invariants_rec(root); + } + } + + #[cfg(test)] + fn check_invariants_rec(&self, node: &Node) { + match node { + Node::Internal { + bounds, + left, + right, + } => { + let left = &self.nodes[*left as usize]; + let right = &self.nodes[*right as usize]; + + assert_eq!(left.bounds().union(right.bounds()), *bounds); + + self.check_invariants_rec(left); + self.check_invariants_rec(right); + } + Node::Leaf { + bounds: leaf_bounds, + values, + } => { + let bounds = value_bounds(&self.values[values.start as usize..values.end as usize]) + .expect("leaf should be nonempty"); + + assert_eq!(*leaf_bounds, bounds); + } + } + } +} + +fn value_bounds(values: &[T]) -> Option { + values + .iter() + .map(|v| Aabb::point(v.chunk_pos())) + .reduce(Aabb::union) +} + +fn middle(min: i32, max: i32) -> i32 { + // Cast to i64 to avoid intermediate overflow. + ((min as i64 + max as i64) / 2) as i32 +} + +/// Partitions the slice in place and returns the partition point. Why this +/// isn't in Rust's stdlib I don't know. +fn partition(s: &mut [T], mut pred: impl FnMut(&T) -> bool) -> usize { + let mut it = s.iter_mut(); + let mut true_count = 0; + + while let Some(head) = it.find(|x| { + if pred(x) { + true_count += 1; + false + } else { + true + } + }) { + if let Some(tail) = it.rfind(|x| pred(x)) { + mem::swap(head, tail); + true_count += 1; + } else { + break; + } + } + true_count +} + +#[cfg(test)] +mod tests { + use rand::Rng; + + use super::*; + + #[test] + fn partition_middle() { + let mut arr = [2, 3, 4, 5]; + let mid = middle(arr[0], arr[arr.len() - 1]); + + let point = partition(&mut arr, |&x| mid >= x); + + assert_eq!(point, 2); + assert_eq!(&arr[..point], &[2, 3]); + assert_eq!(&arr[point..], &[4, 5]); + } + + #[test] + fn query_visits_correct_nodes() { + let mut bvh = ChunkBvh::::new(); + + let mut positions = vec![]; + + let size = 500; + let mut rng = rand::thread_rng(); + + // Create a bunch of positions in a large area. + for _ in 0..100_000 { + positions.push(ChunkPos { + x: rng.gen_range(-size / 2..size / 2), + z: rng.gen_range(-size / 2..size / 2), + }); + } + + // Put the view in the center of that area. + let view = ChunkView::new(ChunkPos::default(), 32); + + let mut viewed_positions = vec![]; + + // Create a list of positions the view contains. + for &pos in &positions { + if view.contains(pos) { + viewed_positions.push(pos); + } + } + + bvh.build(positions); + + bvh.check_invariants(); + + // Check that we query exactly the positions that we know the view can see. + + bvh.query(view, |pos| { + let idx = viewed_positions.iter().position(|p| p == pos).expect("šŸ˜”"); + viewed_positions.remove(idx); + }); + + assert!(viewed_positions.is_empty()); + } +} diff --git a/vendor/valence/crates/valence_server/src/layer/chunk.rs b/vendor/valence/crates/valence_server/src/layer/chunk.rs new file mode 100644 index 00000000..b1e830b9 --- /dev/null +++ b/vendor/valence/crates/valence_server/src/layer/chunk.rs @@ -0,0 +1,793 @@ +#[allow(clippy::module_inception)] +mod chunk; +pub mod loaded; +mod paletted_container; +pub mod unloaded; + +use std::borrow::Cow; +use std::collections::hash_map::{Entry, OccupiedEntry, VacantEntry}; +use std::fmt; + +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +pub use chunk::{MAX_HEIGHT, *}; +pub use loaded::LoadedChunk; +use rustc_hash::FxHashMap; +pub use unloaded::UnloadedChunk; +use valence_math::{DVec3, Vec3}; +use valence_nbt::Compound; +use valence_protocol::encode::{PacketWriter, WritePacket}; +use valence_protocol::packets::play::particle_s2c::Particle; +use valence_protocol::packets::play::{ParticleS2c, PlaySoundS2c}; +use valence_protocol::sound::{Sound, SoundCategory, SoundId}; +use valence_protocol::{BiomePos, BlockPos, ChunkPos, CompressionThreshold, Encode, Ident, Packet}; +use valence_registry::biome::{BiomeId, BiomeRegistry}; +use valence_registry::DimensionTypeRegistry; +use valence_server_common::Server; + +use super::bvh::GetChunkPos; +use super::message::Messages; +use super::{Layer, UpdateLayersPostClientSet, UpdateLayersPreClientSet}; + +/// A [`Component`] containing the [chunks](LoadedChunk) and [dimension +/// information](valence_registry::dimension_type::DimensionTypeId) of a +/// Minecraft world. +#[derive(Component, Debug)] +pub struct ChunkLayer { + messages: ChunkLayerMessages, + chunks: FxHashMap, + info: ChunkLayerInfo, +} + +/// Chunk layer information. +pub(crate) struct ChunkLayerInfo { + dimension_type_name: Ident, + height: u32, + min_y: i32, + biome_registry_len: usize, + threshold: CompressionThreshold, +} + +impl fmt::Debug for ChunkLayerInfo { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("ChunkLayerInfo") + .field("dimension_type_name", &self.dimension_type_name) + .field("height", &self.height) + .field("min_y", &self.min_y) + .field("biome_registry_len", &self.biome_registry_len) + .field("threshold", &self.threshold) + // Ignore sky light mask and array. + .finish() + } +} + +type ChunkLayerMessages = Messages; + +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug)] +pub(crate) enum GlobalMsg { + /// Send packet data to all clients viewing the layer. + Packet, + /// Send packet data to all clients viewing the layer, except the client + /// identified by `except`. + PacketExcept { except: Entity }, +} + +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug)] +pub(crate) enum LocalMsg { + /// Send packet data to all clients viewing the layer in view of `pos`. + PacketAt { + pos: ChunkPos, + }, + PacketAtExcept { + pos: ChunkPos, + except: Entity, + }, + RadiusAt { + center: BlockPos, + radius_squared: u32, + }, + RadiusAtExcept { + center: BlockPos, + radius_squared: u32, + except: Entity, + }, + /// Instruct clients to load or unload the chunk at `pos`. Loading and + /// unloading are combined into a single message so that load/unload order + /// is not lost when messages are sorted. + /// + /// Message content is a single byte indicating load (1) or unload (0). + ChangeChunkState { + pos: ChunkPos, + }, + /// Message content is the data for a single biome in the "change biomes" + /// packet. + ChangeBiome { + pos: ChunkPos, + }, +} + +impl GetChunkPos for LocalMsg { + fn chunk_pos(&self) -> ChunkPos { + match *self { + LocalMsg::PacketAt { pos } => pos, + LocalMsg::PacketAtExcept { pos, .. } => pos, + LocalMsg::RadiusAt { center, .. } => center.into(), + LocalMsg::RadiusAtExcept { center, .. } => center.into(), + LocalMsg::ChangeBiome { pos } => pos, + LocalMsg::ChangeChunkState { pos } => pos, + } + } +} + +impl ChunkLayer { + pub(crate) const LOAD: u8 = 0; + pub(crate) const UNLOAD: u8 = 1; + pub(crate) const OVERWRITE: u8 = 2; + + /// Creates a new chunk layer. + #[track_caller] + pub fn new( + dimension_type_name: impl Into, + dimensions: &DimensionTypeRegistry, + biomes: &BiomeRegistry, + server: &Server, + ) -> Self { + let dimension_type_name = dimension_type_name.into(); + + let dim = &dimensions[dimension_type_name.clone()]; + + assert!( + (0..MAX_HEIGHT as i32).contains(&dim.height), + "invalid dimension height of {}", + dim.height + ); + + Self { + messages: Messages::new(), + chunks: Default::default(), + info: ChunkLayerInfo { + dimension_type_name, + height: dim.height as u32, + min_y: dim.min_y, + biome_registry_len: biomes.iter().len(), + threshold: server.compression_threshold(), + }, + } + } + + /// The name of the dimension this chunk layer is using. + pub fn dimension_type_name(&self) -> Ident { + self.info.dimension_type_name.clone() + } + + /// The height of this instance's dimension. + pub fn height(&self) -> u32 { + self.info.height + } + + /// The `min_y` of this instance's dimension. + pub fn min_y(&self) -> i32 { + self.info.min_y + } + + /// Get a reference to the chunk at the given position, if it is loaded. + pub fn chunk(&self, pos: impl Into) -> Option<&LoadedChunk> { + self.chunks.get(&pos.into()) + } + + /// Get a mutable reference to the chunk at the given position, if it is + /// loaded. + pub fn chunk_mut(&mut self, pos: impl Into) -> Option<&mut LoadedChunk> { + self.chunks.get_mut(&pos.into()) + } + + /// Insert a chunk into the instance at the given position. The previous + /// chunk data is returned. + pub fn insert_chunk( + &mut self, + pos: impl Into, + chunk: UnloadedChunk, + ) -> Option { + match self.chunk_entry(pos) { + ChunkEntry::Occupied(mut oe) => Some(oe.insert(chunk)), + ChunkEntry::Vacant(ve) => { + ve.insert(chunk); + None + } + } + } + + /// Unload the chunk at the given position, if it is loaded. Returns the + /// chunk if it was loaded. + pub fn remove_chunk(&mut self, pos: impl Into) -> Option { + match self.chunk_entry(pos) { + ChunkEntry::Occupied(oe) => Some(oe.remove()), + ChunkEntry::Vacant(_) => None, + } + } + + /// Unload all chunks in this instance. + pub fn clear_chunks(&mut self) { + self.retain_chunks(|_, _| false) + } + + /// Retain only the chunks for which the given predicate returns `true`. + pub fn retain_chunks(&mut self, mut f: F) + where + F: FnMut(ChunkPos, &mut LoadedChunk) -> bool, + { + self.chunks.retain(|pos, chunk| { + if !f(*pos, chunk) { + self.messages + .send_local_infallible(LocalMsg::ChangeChunkState { pos: *pos }, |b| { + b.push(Self::UNLOAD) + }); + + false + } else { + true + } + }); + } + + /// Get a [`ChunkEntry`] for the given position. + pub fn chunk_entry(&mut self, pos: impl Into) -> ChunkEntry { + match self.chunks.entry(pos.into()) { + Entry::Occupied(oe) => ChunkEntry::Occupied(OccupiedChunkEntry { + messages: &mut self.messages, + entry: oe, + }), + Entry::Vacant(ve) => ChunkEntry::Vacant(VacantChunkEntry { + height: self.info.height, + messages: &mut self.messages, + entry: ve, + }), + } + } + + /// Get an iterator over all loaded chunks in the instance. The order of the + /// chunks is undefined. + pub fn chunks(&self) -> impl Iterator + Clone + '_ { + self.chunks.iter().map(|(pos, chunk)| (*pos, chunk)) + } + + /// Get an iterator over all loaded chunks in the instance, mutably. The + /// order of the chunks is undefined. + pub fn chunks_mut(&mut self) -> impl Iterator + '_ { + self.chunks.iter_mut().map(|(pos, chunk)| (*pos, chunk)) + } + + /// Optimizes the memory usage of the instance. + pub fn shrink_to_fit(&mut self) { + for (_, chunk) in self.chunks_mut() { + chunk.shrink_to_fit(); + } + + self.chunks.shrink_to_fit(); + self.messages.shrink_to_fit(); + } + + pub fn block(&self, pos: impl Into) -> Option { + let pos = pos.into(); + + let y = pos + .y + .checked_sub(self.info.min_y) + .and_then(|y| y.try_into().ok())?; + + if y >= self.info.height { + return None; + } + + let chunk = self.chunk(pos)?; + + let x = pos.x.rem_euclid(16) as u32; + let z = pos.z.rem_euclid(16) as u32; + + Some(chunk.block(x, y, z)) + } + + pub fn set_block(&mut self, pos: impl Into, block: impl IntoBlock) -> Option { + let pos = pos.into(); + + let y = pos + .y + .checked_sub(self.info.min_y) + .and_then(|y| y.try_into().ok())?; + + if y >= self.info.height { + return None; + } + + let chunk = self.chunk_mut(pos)?; + + let x = pos.x.rem_euclid(16) as u32; + let z = pos.z.rem_euclid(16) as u32; + + Some(chunk.set_block(x, y, z, block)) + } + + pub fn block_entity_mut(&mut self, pos: impl Into) -> Option<&mut Compound> { + let pos = pos.into(); + + let y = pos + .y + .checked_sub(self.info.min_y) + .and_then(|y| y.try_into().ok())?; + + if y >= self.info.height { + return None; + } + + let chunk = self.chunk_mut(pos)?; + + let x = pos.x.rem_euclid(16) as u32; + let z = pos.z.rem_euclid(16) as u32; + + chunk.block_entity_mut(x, y, z) + } + + pub fn biome(&self, pos: impl Into) -> Option { + let pos = pos.into(); + + let y = pos + .y + .checked_sub(self.info.min_y / 4) + .and_then(|y| y.try_into().ok())?; + + if y >= self.info.height / 4 { + return None; + } + + let chunk = self.chunk(pos)?; + + let x = pos.x.rem_euclid(4) as u32; + let z = pos.z.rem_euclid(4) as u32; + + Some(chunk.biome(x, y, z)) + } + + pub fn set_biome(&mut self, pos: impl Into, biome: BiomeId) -> Option { + let pos = pos.into(); + + let y = pos + .y + .checked_sub(self.info.min_y / 4) + .and_then(|y| y.try_into().ok())?; + + if y >= self.info.height / 4 { + return None; + } + + let chunk = self.chunk_mut(pos)?; + + let x = pos.x.rem_euclid(4) as u32; + let z = pos.z.rem_euclid(4) as u32; + + Some(chunk.set_biome(x, y, z, biome)) + } + + pub(crate) fn info(&self) -> &ChunkLayerInfo { + &self.info + } + + pub(crate) fn messages(&self) -> &ChunkLayerMessages { + &self.messages + } + + // TODO: move to `valence_particle`. + /// Puts a particle effect at the given position in the world. The particle + /// effect is visible to all players in the instance with the + /// appropriate chunk in view. + pub fn play_particle( + &mut self, + particle: &Particle, + long_distance: bool, + position: impl Into, + offset: impl Into, + max_speed: f32, + count: i32, + ) { + let position = position.into(); + + self.view_writer(position).write_packet(&ParticleS2c { + particle: Cow::Borrowed(particle), + long_distance, + position, + offset: offset.into(), + max_speed, + count, + }); + } + + // TODO: move to `valence_sound`. + /// Plays a sound effect at the given position in the world. The sound + /// effect is audible to all players in the instance with the + /// appropriate chunk in view. + pub fn play_sound( + &mut self, + sound: Sound, + category: SoundCategory, + position: impl Into, + volume: f32, + pitch: f32, + ) { + let position = position.into(); + + self.view_writer(position).write_packet(&PlaySoundS2c { + id: SoundId::Direct { + id: sound.to_ident(), + range: None, + }, + category, + position: (position * 8.0).as_ivec3(), + volume, + pitch, + seed: rand::random(), + }); + } +} + +impl Layer for ChunkLayer { + type ExceptWriter<'a> = ExceptWriter<'a>; + + type ViewWriter<'a> = ViewWriter<'a>; + + type ViewExceptWriter<'a> = ViewExceptWriter<'a>; + + type RadiusWriter<'a> = RadiusWriter<'a>; + + type RadiusExceptWriter<'a> = RadiusExceptWriter<'a>; + + fn except_writer(&mut self, except: Entity) -> Self::ExceptWriter<'_> { + ExceptWriter { + layer: self, + except, + } + } + + fn view_writer(&mut self, pos: impl Into) -> Self::ViewWriter<'_> { + ViewWriter { + layer: self, + pos: pos.into(), + } + } + + fn view_except_writer( + &mut self, + pos: impl Into, + except: Entity, + ) -> Self::ViewExceptWriter<'_> { + ViewExceptWriter { + layer: self, + pos: pos.into(), + except, + } + } + + fn radius_writer( + &mut self, + center: impl Into, + radius: u32, + ) -> Self::RadiusWriter<'_> { + RadiusWriter { + layer: self, + center: center.into(), + radius, + } + } + + fn radius_except_writer( + &mut self, + center: impl Into, + radius: u32, + except: Entity, + ) -> Self::RadiusExceptWriter<'_> { + RadiusExceptWriter { + layer: self, + center: center.into(), + radius, + except, + } + } +} + +impl WritePacket for ChunkLayer { + fn write_packet_fallible

(&mut self, packet: &P) -> anyhow::Result<()> + where + P: Packet + Encode, + { + self.messages.send_global(GlobalMsg::Packet, |b| { + PacketWriter::new(b, self.info.threshold).write_packet_fallible(packet) + }) + } + + fn write_packet_bytes(&mut self, bytes: &[u8]) { + self.messages + .send_global_infallible(GlobalMsg::Packet, |b| b.extend_from_slice(bytes)); + } +} + +pub struct ExceptWriter<'a> { + layer: &'a mut ChunkLayer, + except: Entity, +} + +impl WritePacket for ExceptWriter<'_> { + fn write_packet_fallible

(&mut self, packet: &P) -> anyhow::Result<()> + where + P: Packet + Encode, + { + self.layer.messages.send_global( + GlobalMsg::PacketExcept { + except: self.except, + }, + |b| PacketWriter::new(b, self.layer.info.threshold).write_packet_fallible(packet), + ) + } + + fn write_packet_bytes(&mut self, bytes: &[u8]) { + self.layer.messages.send_global_infallible( + GlobalMsg::PacketExcept { + except: self.except, + }, + |b| b.extend_from_slice(bytes), + ) + } +} + +pub struct ViewWriter<'a> { + layer: &'a mut ChunkLayer, + pos: ChunkPos, +} + +impl WritePacket for ViewWriter<'_> { + fn write_packet_fallible

(&mut self, packet: &P) -> anyhow::Result<()> + where + P: Packet + Encode, + { + self.layer + .messages + .send_local(LocalMsg::PacketAt { pos: self.pos }, |b| { + PacketWriter::new(b, self.layer.info.threshold).write_packet_fallible(packet) + }) + } + + fn write_packet_bytes(&mut self, bytes: &[u8]) { + self.layer + .messages + .send_local_infallible(LocalMsg::PacketAt { pos: self.pos }, |b| { + b.extend_from_slice(bytes) + }); + } +} + +pub struct ViewExceptWriter<'a> { + layer: &'a mut ChunkLayer, + pos: ChunkPos, + except: Entity, +} + +impl WritePacket for ViewExceptWriter<'_> { + fn write_packet_fallible

(&mut self, packet: &P) -> anyhow::Result<()> + where + P: Packet + Encode, + { + self.layer.messages.send_local( + LocalMsg::PacketAtExcept { + pos: self.pos, + except: self.except, + }, + |b| PacketWriter::new(b, self.layer.info.threshold).write_packet_fallible(packet), + ) + } + + fn write_packet_bytes(&mut self, bytes: &[u8]) { + self.layer.messages.send_local_infallible( + LocalMsg::PacketAtExcept { + pos: self.pos, + except: self.except, + }, + |b| b.extend_from_slice(bytes), + ); + } +} + +pub struct RadiusWriter<'a> { + layer: &'a mut ChunkLayer, + center: BlockPos, + radius: u32, +} + +impl WritePacket for RadiusWriter<'_> { + fn write_packet_fallible

(&mut self, packet: &P) -> anyhow::Result<()> + where + P: Packet + Encode, + { + self.layer.messages.send_local( + LocalMsg::RadiusAt { + center: self.center, + radius_squared: self.radius, + }, + |b| PacketWriter::new(b, self.layer.info.threshold).write_packet_fallible(packet), + ) + } + + fn write_packet_bytes(&mut self, bytes: &[u8]) { + self.layer.messages.send_local_infallible( + LocalMsg::RadiusAt { + center: self.center, + radius_squared: self.radius, + }, + |b| b.extend_from_slice(bytes), + ); + } +} + +pub struct RadiusExceptWriter<'a> { + layer: &'a mut ChunkLayer, + center: BlockPos, + radius: u32, + except: Entity, +} + +impl WritePacket for RadiusExceptWriter<'_> { + fn write_packet_fallible

(&mut self, packet: &P) -> anyhow::Result<()> + where + P: Packet + Encode, + { + self.layer.messages.send_local( + LocalMsg::RadiusAtExcept { + center: self.center, + radius_squared: self.radius, + except: self.except, + }, + |b| PacketWriter::new(b, self.layer.info.threshold).write_packet_fallible(packet), + ) + } + + fn write_packet_bytes(&mut self, bytes: &[u8]) { + self.layer.messages.send_local_infallible( + LocalMsg::RadiusAtExcept { + center: self.center, + radius_squared: self.radius, + except: self.except, + }, + |b| b.extend_from_slice(bytes), + ); + } +} + +#[derive(Debug)] +pub enum ChunkEntry<'a> { + Occupied(OccupiedChunkEntry<'a>), + Vacant(VacantChunkEntry<'a>), +} + +impl<'a> ChunkEntry<'a> { + pub fn or_default(self) -> &'a mut LoadedChunk { + match self { + ChunkEntry::Occupied(oe) => oe.into_mut(), + ChunkEntry::Vacant(ve) => ve.insert(UnloadedChunk::new()), + } + } +} + +#[derive(Debug)] +pub struct OccupiedChunkEntry<'a> { + messages: &'a mut ChunkLayerMessages, + entry: OccupiedEntry<'a, ChunkPos, LoadedChunk>, +} + +impl<'a> OccupiedChunkEntry<'a> { + pub fn get(&self) -> &LoadedChunk { + self.entry.get() + } + + pub fn get_mut(&mut self) -> &mut LoadedChunk { + self.entry.get_mut() + } + + pub fn insert(&mut self, chunk: UnloadedChunk) -> UnloadedChunk { + self.messages.send_local_infallible( + LocalMsg::ChangeChunkState { + pos: *self.entry.key(), + }, + |b| b.push(ChunkLayer::OVERWRITE), + ); + + self.entry.get_mut().insert(chunk) + } + + pub fn into_mut(self) -> &'a mut LoadedChunk { + self.entry.into_mut() + } + + pub fn key(&self) -> &ChunkPos { + self.entry.key() + } + + pub fn remove(self) -> UnloadedChunk { + self.messages.send_local_infallible( + LocalMsg::ChangeChunkState { + pos: *self.entry.key(), + }, + |b| b.push(ChunkLayer::UNLOAD), + ); + + self.entry.remove().remove() + } + + pub fn remove_entry(mut self) -> (ChunkPos, UnloadedChunk) { + let pos = *self.entry.key(); + let chunk = self.entry.get_mut().remove(); + + self.messages.send_local_infallible( + LocalMsg::ChangeChunkState { + pos: *self.entry.key(), + }, + |b| b.push(ChunkLayer::UNLOAD), + ); + + (pos, chunk) + } +} + +#[derive(Debug)] +pub struct VacantChunkEntry<'a> { + height: u32, + messages: &'a mut ChunkLayerMessages, + entry: VacantEntry<'a, ChunkPos, LoadedChunk>, +} + +impl<'a> VacantChunkEntry<'a> { + pub fn insert(self, chunk: UnloadedChunk) -> &'a mut LoadedChunk { + let mut loaded = LoadedChunk::new(self.height); + loaded.insert(chunk); + + self.messages.send_local_infallible( + LocalMsg::ChangeChunkState { + pos: *self.entry.key(), + }, + |b| b.push(ChunkLayer::LOAD), + ); + + self.entry.insert(loaded) + } + + pub fn into_key(self) -> ChunkPos { + *self.entry.key() + } + + pub fn key(&self) -> &ChunkPos { + self.entry.key() + } +} + +pub(super) fn build(app: &mut App) { + app.add_systems( + PostUpdate, + ( + update_chunk_layers_pre_client.in_set(UpdateLayersPreClientSet), + update_chunk_layers_post_client.in_set(UpdateLayersPostClientSet), + ), + ); +} + +fn update_chunk_layers_pre_client(mut layers: Query<&mut ChunkLayer>) { + for layer in &mut layers { + let layer = layer.into_inner(); + + for (&pos, chunk) in &mut layer.chunks { + chunk.update_pre_client(pos, &layer.info, &mut layer.messages); + } + + layer.messages.ready(); + } +} + +fn update_chunk_layers_post_client(mut layers: Query<&mut ChunkLayer>) { + for mut layer in &mut layers { + layer.messages.unready(); + } +} diff --git a/vendor/valence/crates/valence_server/src/layer/chunk/chunk.rs b/vendor/valence/crates/valence_server/src/layer/chunk/chunk.rs new file mode 100644 index 00000000..6e0a20ed --- /dev/null +++ b/vendor/valence/crates/valence_server/src/layer/chunk/chunk.rs @@ -0,0 +1,423 @@ +use valence_nbt::Compound; +use valence_protocol::BlockState; +use valence_registry::biome::BiomeId; + +use super::paletted_container::PalettedContainer; + +/// Common operations on chunks. Notable implementors are +/// [`LoadedChunk`](super::loaded::LoadedChunk) and +/// [`UnloadedChunk`](super::unloaded::UnloadedChunk). +pub trait Chunk { + /// Gets the height of this chunk in meters or blocks. + fn height(&self) -> u32; + + /// Gets the block at the provided position in this chunk. `x` and `z` + /// are in the range `0..16` while `y` is in the range `0..height`. + /// + /// # Panics + /// + /// May panic if the position is out of bounds. + #[track_caller] + fn block(&self, x: u32, y: u32, z: u32) -> BlockRef { + BlockRef { + state: self.block_state(x, y, z), + nbt: self.block_entity(x, y, z), + } + } + + /// Sets the block at the provided position in this chunk. `x` and `z` + /// are in the range `0..16` while `y` is in the range `0..height`. The + /// previous block at the position is returned. + /// + /// # Panics + /// + /// May panic if the position is out of bounds. + #[track_caller] + fn set_block(&mut self, x: u32, y: u32, z: u32, block: impl IntoBlock) -> Block { + let block = block.into_block(); + let state = self.set_block_state(x, y, z, block.state); + let nbt = self.set_block_entity(x, y, z, block.nbt); + + Block { state, nbt } + } + + /// Sets all the blocks in the entire chunk to the provided block. + fn fill_blocks(&mut self, block: impl IntoBlock) { + let block = block.into_block(); + + self.fill_block_states(block.state); + + if block.nbt.is_some() { + for x in 0..16 { + for z in 0..16 { + for y in 0..self.height() { + self.set_block_entity(x, y, z, block.nbt.clone()); + } + } + } + } else { + self.clear_block_entities(); + } + } + + /// Gets the block state at the provided position in this chunk. `x` and `z` + /// are in the range `0..16` while `y` is in the range `0..height`. + /// + /// # Panics + /// + /// May panic if the position is out of bounds. + #[track_caller] + fn block_state(&self, x: u32, y: u32, z: u32) -> BlockState; + + /// Sets the block state at the provided position in this chunk. `x` and `z` + /// are in the range `0..16` while `y` is in the range `0..height`. The + /// previous block state at the position is returned. + /// + /// **NOTE:** This is a low-level function which may break expected + /// invariants for block entities. Prefer [`Self::set_block`] if performance + /// is not a concern. + /// + /// # Panics + /// + /// May panic if the position is out of bounds. + #[track_caller] + fn set_block_state(&mut self, x: u32, y: u32, z: u32, block: BlockState) -> BlockState; + + /// Replaces all block states in the entire chunk with the provided block + /// state. + /// + /// **NOTE:** This is a low-level function which may break expected + /// invariants for block entities. Prefer [`Self::fill_blocks`] instead. + fn fill_block_states(&mut self, block: BlockState) { + for sect_y in 0..self.height() / 16 { + self.fill_block_state_section(sect_y, block); + } + } + + /// Replaces all the block states in a section with the provided block + /// state. + /// + /// **NOTE:** This is a low-level function which may break expected + /// invariants for block entities. Prefer [`Self::set_block`] if performance + /// is not a concern. + /// + /// # Panics + /// + /// May panic if the section offset is out of bounds. + #[track_caller] + fn fill_block_state_section(&mut self, sect_y: u32, block: BlockState); + + /// Gets the block entity at the provided position in this chunk. `x` and + /// `z` are in the range `0..16` while `y` is in the range `0..height`. + /// + /// # Panics + /// + /// May panic if the position is out of bounds. + #[track_caller] + fn block_entity(&self, x: u32, y: u32, z: u32) -> Option<&Compound>; + + /// Gets a mutable reference to the block entity at the provided position in + /// this chunk. `x` and `z` are in the range `0..16` while `y` is in the + /// range `0..height`. + /// + /// # Panics + /// + /// May panic if the position is out of bounds. + #[track_caller] + fn block_entity_mut(&mut self, x: u32, y: u32, z: u32) -> Option<&mut Compound>; + + /// Sets the block entity at the provided position in this chunk. `x` and + /// `z` are in the range `0..16` while `y` is in the range `0..height`. + /// The previous block entity at the position is returned. + /// + /// **NOTE:** This is a low-level function which may break expected + /// invariants for block entities. Prefer [`Self::set_block`] if performance + /// is not a concern. + /// + /// # Panics + /// + /// May panic if the position is out of bounds. + #[track_caller] + fn set_block_entity( + &mut self, + x: u32, + y: u32, + z: u32, + block_entity: Option, + ) -> Option; + + /// Removes all block entities from the chunk. + /// + /// **NOTE:** This is a low-level function which may break expected + /// invariants for block entities. Prefer [`Self::set_block`] if performance + /// is not a concern. + fn clear_block_entities(&mut self); + + /// Gets the biome at the provided position in this chunk. `x` and `z` are + /// in the range `0..4` while `y` is in the range `0..height / 4`. + /// + /// Note that biomes are 4x4x4 segments of a chunk, so the xyz arguments to + /// this method differ from those to [`Self::block_state`] and + /// [`Self::block_entity`]. + /// + /// # Panics + /// + /// May panic if the position is out of bounds. + #[track_caller] + fn biome(&self, x: u32, y: u32, z: u32) -> BiomeId; + + /// Sets the biome at the provided position in this chunk. The Previous + /// biome at the position is returned. `x` and `z` are in the range `0..4` + /// while `y` is in the range `0..height / 4`. + /// + /// Note that biomes are 4x4x4 segments of a chunk, so the xyz arguments to + /// this method differ from those to [`Self::block_state`] and + /// [`Self::block_entity`]. + /// + /// # Panics + /// + /// May panic if the position is out of bounds. + #[track_caller] + fn set_biome(&mut self, x: u32, y: u32, z: u32, biome: BiomeId) -> BiomeId; + + /// Sets all the biomes in the entire chunk to the provided biome. + fn fill_biomes(&mut self, biome: BiomeId) { + for sect_y in 0..self.height() / 16 { + self.fill_biome_section(sect_y, biome); + } + } + + /// Replaces all the biomes in a section with the provided biome. + /// + /// # Panics + /// + /// May panic if the section offset is out of bounds. + #[track_caller] + fn fill_biome_section(&mut self, sect_y: u32, biome: BiomeId); + + /// Sets all blocks and biomes in this chunk to the default values. The + /// height of the chunk is not modified. + fn clear(&mut self) { + self.fill_block_states(BlockState::AIR); + self.fill_biomes(BiomeId::default()); + self.clear_block_entities(); + } + + /// Attempts to optimize this chunk by reducing its memory usage or other + /// characteristics. This may be a relatively expensive operation. + /// + /// This method must not alter the semantics of the chunk in any observable + /// way. + fn shrink_to_fit(&mut self); +} + +/// Represents a complete block, which is a pair of block state and optional NBT +/// data for the block entity. +#[derive(Clone, PartialEq, Default, Debug)] +pub struct Block { + pub state: BlockState, + pub nbt: Option, +} + +impl Block { + pub const fn new(state: BlockState, nbt: Option) -> Self { + Self { state, nbt } + } +} + +/// Like [`Block`], but immutably referenced. +#[derive(Copy, Clone, PartialEq, Default, Debug)] +pub struct BlockRef<'a> { + pub state: BlockState, + pub nbt: Option<&'a Compound>, +} + +impl<'a> BlockRef<'a> { + pub const fn new(state: BlockState, nbt: Option<&'a Compound>) -> Self { + Self { state, nbt } + } +} + +pub trait IntoBlock { + // TODO: parameterize this with block registry ref? + fn into_block(self) -> Block; +} + +impl IntoBlock for Block { + fn into_block(self) -> Block { + self + } +} + +impl<'a> IntoBlock for BlockRef<'a> { + fn into_block(self) -> Block { + Block { + state: self.state, + nbt: self.nbt.cloned(), + } + } +} + +/// This will initialize the block with a new empty compound if the block state +/// is associated with a block entity. +impl IntoBlock for BlockState { + fn into_block(self) -> Block { + Block { + state: self, + nbt: self.block_entity_kind().map(|_| Compound::new()), + } + } +} + +pub const SECTION_BLOCK_COUNT: usize = 16 * 16 * 16; +pub const SECTION_BIOME_COUNT: usize = 4 * 4 * 4; + +/// The maximum height of a chunk. +pub const MAX_HEIGHT: u32 = 4096; + +pub type BlockStateContainer = + PalettedContainer; + +pub type BiomeContainer = + PalettedContainer; + +#[inline] +#[track_caller] +pub fn check_block_oob(chunk: &impl Chunk, x: u32, y: u32, z: u32) { + assert!( + x < 16 && y < chunk.height() && z < 16, + "chunk block offsets of ({x}, {y}, {z}) are out of bounds" + ); +} + +#[inline] +#[track_caller] +pub fn check_biome_oob(chunk: &impl Chunk, x: u32, y: u32, z: u32) { + assert!( + x < 4 && y < chunk.height() / 4 && z < 4, + "chunk biome offsets of ({x}, {y}, {z}) are out of bounds" + ); +} + +#[inline] +#[track_caller] +pub fn check_section_oob(chunk: &impl Chunk, sect_y: u32) { + assert!( + sect_y < chunk.height() / 16, + "chunk section offset of {sect_y} is out of bounds" + ); +} + +/// Returns the minimum number of bits needed to represent the integer `n`. +pub const fn bit_width(n: usize) -> usize { + (usize::BITS - n.leading_zeros()) as _ +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::layer::chunk::{LoadedChunk, UnloadedChunk}; + + #[test] + fn chunk_get_set() { + fn check(mut chunk: impl Chunk) { + assert_eq!( + chunk.set_block_state(1, 2, 3, BlockState::CHAIN), + BlockState::AIR + ); + assert_eq!( + chunk.set_block_state(1, 2, 3, BlockState::AIR), + BlockState::CHAIN + ); + + assert_eq!(chunk.set_block_entity(1, 2, 3, Some(Compound::new())), None); + assert_eq!(chunk.set_block_entity(1, 2, 3, None), Some(Compound::new())); + } + + let unloaded = UnloadedChunk::with_height(512); + let loaded = LoadedChunk::new(512); + + check(unloaded); + check(loaded); + } + + #[cfg(debug_assertions)] + #[test] + #[should_panic] + fn chunk_debug_oob_0() { + let mut chunk = UnloadedChunk::with_height(512); + chunk.set_block_state(0, 0, 16, BlockState::AIR); + } + + #[cfg(debug_assertions)] + #[test] + #[should_panic] + fn chunk_debug_oob_1() { + let mut chunk = LoadedChunk::new(512); + chunk.set_block_state(0, 0, 16, BlockState::AIR); + } + + #[cfg(debug_assertions)] + #[test] + #[should_panic] + fn chunk_debug_oob_2() { + let mut chunk = UnloadedChunk::with_height(512); + chunk.set_block_entity(0, 0, 16, None); + } + + #[cfg(debug_assertions)] + #[test] + #[should_panic] + fn chunk_debug_oob_3() { + let mut chunk = LoadedChunk::new(512); + chunk.set_block_entity(0, 0, 16, None); + } + + #[cfg(debug_assertions)] + #[test] + #[should_panic] + fn chunk_debug_oob_4() { + let mut chunk = UnloadedChunk::with_height(512); + chunk.set_biome(0, 0, 4, BiomeId::DEFAULT); + } + + #[cfg(debug_assertions)] + #[test] + #[should_panic] + fn chunk_debug_oob_5() { + let mut chunk = LoadedChunk::new(512); + chunk.set_biome(0, 0, 4, BiomeId::DEFAULT); + } + + #[cfg(debug_assertions)] + #[test] + #[should_panic] + fn chunk_debug_oob_6() { + let mut chunk = UnloadedChunk::with_height(512); + chunk.fill_block_state_section(chunk.height() / 16, BlockState::AIR); + } + + #[cfg(debug_assertions)] + #[test] + #[should_panic] + fn chunk_debug_oob_7() { + let mut chunk = LoadedChunk::new(512); + chunk.fill_block_state_section(chunk.height() / 16, BlockState::AIR); + } + + #[cfg(debug_assertions)] + #[test] + #[should_panic] + fn chunk_debug_oob_8() { + let mut chunk = UnloadedChunk::with_height(512); + chunk.fill_biome_section(chunk.height() / 16, BiomeId::DEFAULT); + } + + #[cfg(debug_assertions)] + #[test] + #[should_panic] + fn chunk_debug_oob_9() { + let mut chunk = LoadedChunk::new(512); + chunk.fill_biome_section(chunk.height() / 16, BiomeId::DEFAULT); + } +} diff --git a/vendor/valence/crates/valence_server/src/layer/chunk/loaded.rs b/vendor/valence/crates/valence_server/src/layer/chunk/loaded.rs new file mode 100644 index 00000000..cf0f5ac2 --- /dev/null +++ b/vendor/valence/crates/valence_server/src/layer/chunk/loaded.rs @@ -0,0 +1,776 @@ +use std::borrow::Cow; +use std::collections::{BTreeMap, BTreeSet}; +use std::mem; +use std::sync::atomic::{AtomicU32, Ordering}; + +use parking_lot::Mutex; // Using nonstandard mutex to avoid poisoning API. +use valence_bytes::CowBytes; +use valence_generated::block::{PropName, PropValue}; +use valence_nbt::{compound, Compound, Value}; +use valence_protocol::encode::{PacketWriter, WritePacket}; +use valence_protocol::packets::play::chunk_data_s2c::ChunkDataBlockEntity; +use valence_protocol::packets::play::chunk_delta_update_s2c::ChunkDeltaUpdateEntry; +use valence_protocol::packets::play::{ + BlockEntityUpdateS2c, BlockUpdateS2c, ChunkDataS2c, ChunkDeltaUpdateS2c, +}; +use valence_protocol::{BlockPos, BlockState, ChunkPos, ChunkSectionPos, Encode}; +use valence_registry::biome::BiomeId; +use valence_registry::RegistryIdx; + +use super::chunk::{ + bit_width, check_biome_oob, check_block_oob, check_section_oob, BiomeContainer, + BlockStateContainer, Chunk, SECTION_BLOCK_COUNT, +}; +use super::paletted_container::PalettedContainer; +use super::unloaded::{self, UnloadedChunk}; +use super::{ChunkLayerInfo, ChunkLayerMessages, LocalMsg}; + +#[derive(Debug)] +pub struct LoadedChunk { + /// A count of the clients viewing this chunk. Useful for knowing if it's + /// necessary to record changes, since no client would be in view to receive + /// the changes if this were zero. + viewer_count: AtomicU32, + /// Block and biome data for the chunk. + sections: Box<[Section]>, + /// The block entities in this chunk. + block_entities: BTreeMap, + /// The set of block entities that have been modified this tick. + changed_block_entities: BTreeSet, + /// If any biomes in this chunk have been modified this tick. + changed_biomes: bool, + /// Cached bytes of the chunk initialization packet. The cache is considered + /// invalidated if empty. This should be cleared whenever the chunk is + /// modified in an observable way, even if the chunk is not viewed. + cached_init_packets: Mutex>, +} + +#[derive(Clone, Default, Debug)] +struct Section { + block_states: BlockStateContainer, + biomes: BiomeContainer, + /// Contains modifications for the update section packet. (Or the regular + /// block update packet if len == 1). + section_updates: Vec, +} + +impl Section { + fn count_non_air_blocks(&self) -> u16 { + let mut count = 0; + + match &self.block_states { + PalettedContainer::Single(s) => { + if !s.is_air() { + count += SECTION_BLOCK_COUNT as u16; + } + } + PalettedContainer::Indirect(ind) => { + for i in 0..SECTION_BLOCK_COUNT { + if !ind.get(i).is_air() { + count += 1; + } + } + } + PalettedContainer::Direct(dir) => { + for s in dir.as_ref() { + if !s.is_air() { + count += 1; + } + } + } + } + count + } +} + +impl LoadedChunk { + pub(crate) fn new(height: u32) -> Self { + Self { + viewer_count: AtomicU32::new(0), + sections: vec![Section::default(); height as usize / 16].into(), + block_entities: BTreeMap::new(), + changed_block_entities: BTreeSet::new(), + changed_biomes: false, + cached_init_packets: Mutex::new(vec![]), + } + } + + /// Sets the content of this chunk to the supplied [`UnloadedChunk`]. The + /// given unloaded chunk is [resized] to match the height of this loaded + /// chunk prior to insertion. + /// + /// The previous chunk data is returned. + /// + /// [resized]: UnloadedChunk::set_height + pub(crate) fn insert(&mut self, mut chunk: UnloadedChunk) -> UnloadedChunk { + chunk.set_height(self.height()); + + let old_sections = self + .sections + .iter_mut() + .zip(chunk.sections) + .map(|(sect, other_sect)| { + sect.section_updates.clear(); + + unloaded::Section { + block_states: mem::replace(&mut sect.block_states, other_sect.block_states), + biomes: mem::replace(&mut sect.biomes, other_sect.biomes), + } + }) + .collect(); + let old_block_entities = mem::replace(&mut self.block_entities, chunk.block_entities); + self.changed_block_entities.clear(); + self.changed_biomes = false; + self.cached_init_packets.get_mut().clear(); + self.assert_no_changes(); + + UnloadedChunk { + sections: old_sections, + block_entities: old_block_entities, + } + } + + pub(crate) fn remove(&mut self) -> UnloadedChunk { + let old_sections = self + .sections + .iter_mut() + .map(|sect| { + sect.section_updates.clear(); + + unloaded::Section { + block_states: mem::take(&mut sect.block_states), + biomes: mem::take(&mut sect.biomes), + } + }) + .collect(); + let old_block_entities = mem::take(&mut self.block_entities); + self.changed_block_entities.clear(); + self.changed_biomes = false; + self.cached_init_packets.get_mut().clear(); + + self.assert_no_changes(); + + UnloadedChunk { + sections: old_sections, + block_entities: old_block_entities, + } + } + + /// Returns the number of clients in view of this chunk. + pub fn viewer_count(&self) -> u32 { + self.viewer_count.load(Ordering::Relaxed) + } + + /// Like [`Self::viewer_count`], but avoids an atomic operation. + pub fn viewer_count_mut(&mut self) -> u32 { + *self.viewer_count.get_mut() + } + + /// Increments the viewer count. + pub(crate) fn inc_viewer_count(&self) { + self.viewer_count.fetch_add(1, Ordering::Relaxed); + } + + /// Decrements the viewer count. + #[track_caller] + pub(crate) fn dec_viewer_count(&self) { + let old = self.viewer_count.fetch_sub(1, Ordering::Relaxed); + debug_assert_ne!(old, 0, "viewer count underflow!"); + } + + /// Performs the changes necessary to prepare this chunk for client updates. + /// - Chunk change messages are written to the layer. + /// - Recorded changes are cleared. + pub(crate) fn update_pre_client( + &mut self, + pos: ChunkPos, + info: &ChunkLayerInfo, + messages: &mut ChunkLayerMessages, + ) { + if *self.viewer_count.get_mut() == 0 { + // Nobody is viewing the chunk, so no need to send any update packets. There + // also shouldn't be any changes that need to be cleared. + self.assert_no_changes(); + + return; + } + + // Block states + for (sect_y, sect) in self.sections.iter_mut().enumerate() { + match sect.section_updates.as_slice() { + &[] => {} + &[entry] => { + let global_x = pos.x * 16 + entry.off_x() as i32; + let global_y = info.min_y + sect_y as i32 * 16 + entry.off_y() as i32; + let global_z = pos.z * 16 + entry.off_z() as i32; + + messages.send_local_infallible(LocalMsg::PacketAt { pos }, |buf| { + let mut writer = PacketWriter::new(buf, info.threshold); + + writer.write_packet(&BlockUpdateS2c { + position: BlockPos::new(global_x, global_y, global_z), + block_id: BlockState::from_raw(entry.block_state() as u16).unwrap(), + }); + }); + } + entries => { + let chunk_sect_pos = ChunkSectionPos { + x: pos.x, + y: sect_y as i32 + info.min_y.div_euclid(16), + z: pos.z, + }; + + messages.send_local_infallible(LocalMsg::PacketAt { pos }, |buf| { + let mut writer = PacketWriter::new(buf, info.threshold); + + writer.write_packet(&ChunkDeltaUpdateS2c { + chunk_sect_pos, + blocks: Cow::Borrowed(entries), + }); + }); + } + } + + sect.section_updates.clear(); + } + + // Block entities + for &idx in &self.changed_block_entities { + let Some(nbt) = self.block_entities.get(&idx) else { + continue; + }; + + let x = idx % 16; + let z = (idx / 16) % 16; + let y = idx / 16 / 16; + + let state = self.sections[y as usize / 16] + .block_states + .get(idx as usize % SECTION_BLOCK_COUNT); + + let Some(kind) = state.block_entity_kind() else { + continue; + }; + + let global_x = pos.x * 16 + x as i32; + let global_y = info.min_y + y as i32; + let global_z = pos.z * 16 + z as i32; + + messages.send_local_infallible(LocalMsg::PacketAt { pos }, |buf| { + let mut writer = PacketWriter::new(buf, info.threshold); + + writer.write_packet(&BlockEntityUpdateS2c { + position: BlockPos::new(global_x, global_y, global_z), + kind, + data: Cow::Borrowed(nbt), + }); + }); + } + + self.changed_block_entities.clear(); + + // Biomes + if self.changed_biomes { + self.changed_biomes = false; + + messages.send_local_infallible(LocalMsg::ChangeBiome { pos }, |buf| { + for sect in self.sections.iter() { + sect.biomes + .encode_mc_format( + &mut *buf, + |b| b.to_index() as _, + 0, + 3, + bit_width(info.biome_registry_len - 1), + ) + .expect("paletted container encode should always succeed"); + } + }); + } + + // All changes should be cleared. + self.assert_no_changes(); + } + + /// Generates the `MOTION_BLOCKING` heightmap for this chunk, which stores + /// the height of the highest non motion-blocking block in each column. + /// + /// The lowest value of the heightmap is 0, which means that there are no + /// motion-blocking blocks in the column. In this case, rain will fall + /// through the void and there will be no rain particles. + /// + /// A value of 1 means that rain particles will appear at the lowest + /// possible height given by [`DimensionType::min_y`]. Note that + /// blocks cannot be placed at `min_y - 1`. + /// + /// We take these two special cases into account by adding a value of 2 to + /// our heightmap if we find a motion-blocking block, since + /// `self.block_state(x, 0, z)` corresponds to the block at (x, min_y, z) + /// ingame. + /// + /// [`DimensionType::min_y`]: valence_registry::dimension_type::DimensionType::min_y + #[allow(clippy::needless_range_loop)] + fn motion_blocking(&self) -> Vec> { + let mut heightmap: Vec> = vec![vec![0; 16]; 16]; + + for z in 0..16 { + for x in 0..16 { + for y in (0..self.height()).rev() { + let state = self.block_state(x as u32, y, z as u32); + if state.blocks_motion() + || state.is_liquid() + || state.get(PropName::Waterlogged) == Some(PropValue::True) + { + heightmap[z][x] = y + 2; + break; + } + } + } + } + + heightmap + } + + /// Encodes a given heightmap into the correct format of the + /// `ChunkDataS2c` packet. + /// + /// The heightmap values are stored in a long array. Each value is encoded + /// as a 9-bit unsigned integer, so every long with 64 bits can hold at + /// most seven values. The long is padded at the left side with a single + /// zero. Since there are 256 values for 256 columns in a chunk, there + /// will be 36 fully filled longs and one half-filled long with four + /// values. The remaining three values in the last long are left unused. + /// + /// For example, the `MOTION_BLOCKING` heightmap in an empty superflat + /// world is always 4. The first 36 long values will then be + /// + /// 0 000000100 000000100 000000100 000000100 000000100 000000100 000000100, + /// + /// and the last long will be + /// + /// 0 000000000 000000000 000000000 000000100 000000100 000000100 000000100. + fn encode_heightmap(heightmap: Vec>) -> Value { + const BITS_PER_ENTRY: u32 = 9; + const ENTRIES_PER_LONG: u32 = i64::BITS / BITS_PER_ENTRY; + + // Unless `ENTRIES_PER_LONG` is a power of 2 and therefore evenly divides 16*16, + // we need to add one extra long to fit all values in the packet. + const LONGS_PER_PACKET: u32 = + 16 * 16 / ENTRIES_PER_LONG + (16 * 16 % ENTRIES_PER_LONG != 0) as u32; + + let mut encoded: Vec = vec![0; LONGS_PER_PACKET as usize]; + let mut iter = heightmap.into_iter().flatten(); + + for long in encoded.iter_mut() { + for j in 0..ENTRIES_PER_LONG { + match iter.next() { + None => break, + Some(y) => *long += i64::from(y) << (BITS_PER_ENTRY * j), + } + } + } + + Value::LongArray(encoded) + } + + /// Writes the packet data needed to initialize this chunk. + pub(crate) fn write_init_packets( + &self, + mut writer: impl WritePacket, + pos: ChunkPos, + info: &ChunkLayerInfo, + ) { + let mut init_packets = self.cached_init_packets.lock(); + + if init_packets.is_empty() { + let heightmaps = compound! { + "MOTION_BLOCKING" => LoadedChunk::encode_heightmap(self.motion_blocking()), + // TODO Implement `WORLD_SURFACE` (or explain why we don't need it) + // "WORLD_SURFACE" => self.encode_heightmap(self.world_surface()), + }; + + let mut blocks_and_biomes: Vec = vec![]; + + for sect in self.sections.iter() { + sect.count_non_air_blocks() + .encode(&mut blocks_and_biomes) + .unwrap(); + + sect.block_states + .encode_mc_format( + &mut blocks_and_biomes, + |b| b.to_raw().into(), + 4, + 8, + bit_width(BlockState::max_raw().into()), + ) + .expect("paletted container encode should always succeed"); + + sect.biomes + .encode_mc_format( + &mut blocks_and_biomes, + |b| b.to_index() as _, + 0, + 3, + bit_width(info.biome_registry_len - 1), + ) + .expect("paletted container encode should always succeed"); + } + + let block_entities: Vec<_> = self + .block_entities + .iter() + .filter_map(|(&idx, nbt)| { + let x = idx % 16; + let z = idx / 16 % 16; + let y = idx / 16 / 16; + + let kind = self.sections[y as usize / 16] + .block_states + .get(idx as usize % SECTION_BLOCK_COUNT) + .block_entity_kind(); + + kind.map(|kind| ChunkDataBlockEntity { + packed_xz: ((x << 4) | z) as i8, + y: y as i16 + info.min_y as i16, + kind, + data: Cow::Borrowed(nbt), + }) + }) + .collect(); + + PacketWriter::new(&mut init_packets, info.threshold).write_packet(&ChunkDataS2c { + pos, + heightmaps: Cow::Owned(heightmaps), + blocks_and_biomes: CowBytes::Borrowed(&blocks_and_biomes), + block_entities: Cow::Owned(block_entities), + sky_light_mask: Cow::Borrowed(&[]), + block_light_mask: Cow::Borrowed(&[]), + empty_sky_light_mask: Cow::Borrowed(&[]), + empty_block_light_mask: Cow::Borrowed(&[]), + sky_light_arrays: Cow::Borrowed(&[]), + block_light_arrays: Cow::Borrowed(&[]), + }) + } + + writer.write_packet_bytes(&init_packets); + } + + /// Asserts that no changes to this chunk are currently recorded. + #[track_caller] + fn assert_no_changes(&self) { + #[cfg(debug_assertions)] + { + assert!(!self.changed_biomes); + assert!(self.changed_block_entities.is_empty()); + + for sect in self.sections.iter() { + assert!(sect.section_updates.is_empty()); + } + } + } +} + +impl Chunk for LoadedChunk { + fn height(&self) -> u32 { + self.sections.len() as u32 * 16 + } + + fn block_state(&self, x: u32, y: u32, z: u32) -> BlockState { + check_block_oob(self, x, y, z); + + let idx = x + z * 16 + y % 16 * 16 * 16; + self.sections[y as usize / 16] + .block_states + .get(idx as usize) + } + + fn set_block_state(&mut self, x: u32, y: u32, z: u32, block: BlockState) -> BlockState { + check_block_oob(self, x, y, z); + + let sect_y = y / 16; + let sect = &mut self.sections[sect_y as usize]; + let idx = x + z * 16 + y % 16 * 16 * 16; + + let old_block = sect.block_states.set(idx as usize, block); + + if block != old_block { + self.cached_init_packets.get_mut().clear(); + + if *self.viewer_count.get_mut() > 0 { + sect.section_updates.push( + ChunkDeltaUpdateEntry::new() + .with_off_x(x as u8) + .with_off_y((y % 16) as u8) + .with_off_z(z as u8) + .with_block_state(block.to_raw().into()), + ); + } + } + + old_block + } + + fn fill_block_state_section(&mut self, sect_y: u32, block: BlockState) { + check_section_oob(self, sect_y); + + let sect = &mut self.sections[sect_y as usize]; + + if let PalettedContainer::Single(b) = §.block_states { + if *b != block { + self.cached_init_packets.get_mut().clear(); + + if *self.viewer_count.get_mut() > 0 { + // The whole section is being modified, so any previous modifications would + // be overwritten. + sect.section_updates.clear(); + + // Push section updates for all the blocks in the section. + sect.section_updates.reserve_exact(SECTION_BLOCK_COUNT); + for z in 0..16 { + for x in 0..16 { + for y in 0..16 { + sect.section_updates.push( + ChunkDeltaUpdateEntry::new() + .with_off_x(x) + .with_off_y(y) + .with_off_z(z) + .with_block_state(block.to_raw().into()), + ); + } + } + } + } + } + } else { + for z in 0..16 { + for x in 0..16 { + for y in 0..16 { + let idx = x + z * 16 + (sect_y * 16 + y) * (16 * 16); + + if block != sect.block_states.get(idx as usize) { + self.cached_init_packets.get_mut().clear(); + + if *self.viewer_count.get_mut() > 0 { + sect.section_updates.push( + ChunkDeltaUpdateEntry::new() + .with_off_x(x as u8) + .with_off_y(y as u8) + .with_off_z(z as u8) + .with_block_state(block.to_raw().into()), + ); + } + } + } + } + } + } + + sect.block_states.fill(block); + } + + fn block_entity(&self, x: u32, y: u32, z: u32) -> Option<&Compound> { + check_block_oob(self, x, y, z); + + let idx = x + z * 16 + y * 16 * 16; + self.block_entities.get(&idx) + } + + fn block_entity_mut(&mut self, x: u32, y: u32, z: u32) -> Option<&mut Compound> { + check_block_oob(self, x, y, z); + + let idx = x + z * 16 + y * 16 * 16; + + if let Some(be) = self.block_entities.get_mut(&idx) { + if *self.viewer_count.get_mut() > 0 { + self.changed_block_entities.insert(idx); + } + self.cached_init_packets.get_mut().clear(); + + Some(be) + } else { + None + } + } + + fn set_block_entity( + &mut self, + x: u32, + y: u32, + z: u32, + block_entity: Option, + ) -> Option { + check_block_oob(self, x, y, z); + + let idx = x + z * 16 + y * 16 * 16; + + match block_entity { + Some(nbt) => { + if *self.viewer_count.get_mut() > 0 { + self.changed_block_entities.insert(idx); + } + self.cached_init_packets.get_mut().clear(); + + self.block_entities.insert(idx, nbt) + } + None => { + let res = self.block_entities.remove(&idx); + + if res.is_some() { + self.cached_init_packets.get_mut().clear(); + } + + res + } + } + } + + fn clear_block_entities(&mut self) { + if self.block_entities.is_empty() { + return; + } + + self.cached_init_packets.get_mut().clear(); + + if *self.viewer_count.get_mut() > 0 { + self.changed_block_entities + .extend(mem::take(&mut self.block_entities).into_keys()); + } else { + self.block_entities.clear(); + } + } + + fn biome(&self, x: u32, y: u32, z: u32) -> BiomeId { + check_biome_oob(self, x, y, z); + + let idx = x + z * 4 + y % 4 * 4 * 4; + self.sections[y as usize / 4].biomes.get(idx as usize) + } + + fn set_biome(&mut self, x: u32, y: u32, z: u32, biome: BiomeId) -> BiomeId { + check_biome_oob(self, x, y, z); + + let idx = x + z * 4 + y % 4 * 4 * 4; + let old_biome = self.sections[y as usize / 4] + .biomes + .set(idx as usize, biome); + + if biome != old_biome { + self.cached_init_packets.get_mut().clear(); + + if *self.viewer_count.get_mut() > 0 { + self.changed_biomes = true; + } + } + + old_biome + } + + fn fill_biome_section(&mut self, sect_y: u32, biome: BiomeId) { + check_section_oob(self, sect_y); + + let sect = &mut self.sections[sect_y as usize]; + + if let PalettedContainer::Single(b) = §.biomes { + if *b != biome { + self.cached_init_packets.get_mut().clear(); + self.changed_biomes = *self.viewer_count.get_mut() > 0; + } + } else { + self.cached_init_packets.get_mut().clear(); + self.changed_biomes = *self.viewer_count.get_mut() > 0; + } + + sect.biomes.fill(biome); + } + + fn shrink_to_fit(&mut self) { + self.cached_init_packets.get_mut().shrink_to_fit(); + + for sect in self.sections.iter_mut() { + sect.block_states.shrink_to_fit(); + sect.biomes.shrink_to_fit(); + sect.section_updates.shrink_to_fit(); + } + } +} + +#[cfg(test)] +mod tests { + use valence_protocol::{ident, CompressionThreshold}; + + use super::*; + + #[test] + fn loaded_chunk_unviewed_no_changes() { + let mut chunk = LoadedChunk::new(512); + + chunk.set_block(0, 10, 0, BlockState::MAGMA_BLOCK); + chunk.assert_no_changes(); + + chunk.set_biome(0, 0, 0, BiomeId::from_index(5)); + chunk.assert_no_changes(); + + chunk.fill_block_states(BlockState::ACACIA_BUTTON); + chunk.assert_no_changes(); + + chunk.fill_biomes(BiomeId::from_index(42)); + chunk.assert_no_changes(); + } + + #[test] + fn loaded_chunk_changes_clear_packet_cache() { + #[track_caller] + fn check(chunk: &mut LoadedChunk, change: impl FnOnce(&mut LoadedChunk) -> T) { + let info = ChunkLayerInfo { + dimension_type_name: ident!("whatever").into(), + height: 512, + min_y: -16, + biome_registry_len: 200, + threshold: CompressionThreshold(-1), + }; + + let mut buf = vec![]; + let mut writer = PacketWriter::new(&mut buf, CompressionThreshold(-1)); + + // Rebuild cache. + chunk.write_init_packets(&mut writer, ChunkPos::new(3, 4), &info); + + // Check that the cache is built. + assert!(!chunk.cached_init_packets.get_mut().is_empty()); + + // Making a change should clear the cache. + change(chunk); + assert!(chunk.cached_init_packets.get_mut().is_empty()); + + // Rebuild cache again. + chunk.write_init_packets(&mut writer, ChunkPos::new(3, 4), &info); + assert!(!chunk.cached_init_packets.get_mut().is_empty()); + } + + let mut chunk = LoadedChunk::new(512); + + check(&mut chunk, |c| { + c.set_block_state(0, 4, 0, BlockState::ACACIA_WOOD) + }); + check(&mut chunk, |c| c.set_biome(1, 2, 3, BiomeId::from_index(4))); + check(&mut chunk, |c| c.fill_biomes(BiomeId::DEFAULT)); + check(&mut chunk, |c| c.fill_block_states(BlockState::WET_SPONGE)); + check(&mut chunk, |c| { + c.set_block_entity(3, 40, 5, Some(compound! {})) + }); + check(&mut chunk, |c| { + c.block_entity_mut(3, 40, 5).unwrap(); + }); + check(&mut chunk, |c| c.set_block_entity(3, 40, 5, None)); + + // Old block state is the same as new block state, so the cache should still be + // intact. + assert_eq!( + chunk.set_block_state(0, 0, 0, BlockState::WET_SPONGE), + BlockState::WET_SPONGE + ); + + assert!(!chunk.cached_init_packets.get_mut().is_empty()); + } +} diff --git a/vendor/valence/crates/valence_server/src/layer/chunk/paletted_container.rs b/vendor/valence/crates/valence_server/src/layer/chunk/paletted_container.rs new file mode 100644 index 00000000..70ccd4bb --- /dev/null +++ b/vendor/valence/crates/valence_server/src/layer/chunk/paletted_container.rs @@ -0,0 +1,339 @@ +use std::array; +use std::io::Write; + +use arrayvec::ArrayVec; +use valence_protocol::{Encode, VarInt}; + +use super::chunk::bit_width; + +/// `HALF_LEN` must be equal to `ceil(LEN / 2)`. +#[derive(Clone, Debug)] +pub enum PalettedContainer { + Single(T), + Indirect(Box>), + Direct(Box<[T; LEN]>), +} + +#[derive(Clone, Debug)] +pub struct Indirect { + /// Each element is a unique instance of `T`. The length of the palette is + /// always ≄2. + palette: ArrayVec, + /// Each half-byte is an index into `palette`. + indices: [u8; HALF_LEN], +} + +impl + PalettedContainer +{ + pub fn new() -> Self { + assert_eq!(LEN.div_ceil(2), HALF_LEN); + assert_ne!(LEN, 0); + + Self::Single(T::default()) + } + + pub fn fill(&mut self, val: T) { + *self = Self::Single(val) + } + + #[track_caller] + pub fn get(&self, idx: usize) -> T { + debug_assert!(idx < LEN); + + match self { + Self::Single(elem) => *elem, + Self::Indirect(ind) => ind.get(idx), + Self::Direct(elems) => elems[idx], + } + } + + #[track_caller] + pub fn set(&mut self, idx: usize, val: T) -> T { + debug_assert!(idx < LEN); + + match self { + Self::Single(old_val) => { + if *old_val == val { + *old_val + } else { + // Upgrade to indirect. + let old = *old_val; + let mut ind = Box::new(Indirect { + palette: ArrayVec::from_iter([old, val]), + // All indices are initialized to index 0 (the old element). + indices: [0; HALF_LEN], + }); + + ind.indices[idx / 2] = 1 << (idx % 2 * 4); + *self = Self::Indirect(ind); + old + } + } + Self::Indirect(ind) => { + if let Some(old) = ind.set(idx, val) { + old + } else { + // Upgrade to direct. + *self = Self::Direct(Box::new(array::from_fn(|i| ind.get(i)))); + self.set(idx, val) + } + } + Self::Direct(vals) => { + let old = vals[idx]; + vals[idx] = val; + old + } + } + } + + pub fn shrink_to_fit(&mut self) { + match self { + Self::Single(_) => {} + Self::Indirect(ind) => { + let mut new_ind = Indirect { + palette: ArrayVec::new(), + indices: [0; HALF_LEN], + }; + + for i in 0..LEN { + new_ind.set(i, ind.get(i)); + } + + if new_ind.palette.len() == 1 { + *self = Self::Single(new_ind.palette[0]); + } else { + **ind = new_ind; + } + } + Self::Direct(dir) => { + let mut ind = Indirect { + palette: ArrayVec::new(), + indices: [0; HALF_LEN], + }; + + for (i, val) in dir.iter().cloned().enumerate() { + if ind.set(i, val).is_none() { + return; + } + } + + *self = if ind.palette.len() == 1 { + Self::Single(ind.palette[0]) + } else { + Self::Indirect(Box::new(ind)) + }; + } + } + } + + /// Encodes the paletted container in the format that Minecraft expects. + /// + /// - **`writer`**: The [`Write`] instance to write the paletted container + /// to. + /// - **`to_bits`**: A function to convert the element type to bits. The + /// output must be less than two to the power of `direct_bits`. + /// - **`min_indirect_bits`**: The minimum number of bits used to represent + /// the element type in the indirect representation. If the bits per index + /// is lower, it will be rounded up to this. + /// - **`max_indirect_bits`**: The maximum number of bits per element + /// allowed in the indirect representation. Any higher than this will + /// force conversion to the direct representation while encoding. + /// - **`direct_bits`**: The minimum number of bits required to represent + /// all instances of the element type. If `N` is the total number of + /// possible values, then `DIRECT_BITS` is `floor(log2(N - 1)) + 1`. + pub fn encode_mc_format( + &self, + mut writer: W, + mut to_bits: F, + min_indirect_bits: usize, + max_indirect_bits: usize, + direct_bits: usize, + ) -> anyhow::Result<()> + where + W: Write, + F: FnMut(T) -> u64, + { + debug_assert!(min_indirect_bits <= 4); + debug_assert!(min_indirect_bits <= max_indirect_bits); + debug_assert!(max_indirect_bits <= 64); + debug_assert!(direct_bits <= 64); + + match self { + Self::Single(val) => { + // Bits per entry + 0_u8.encode(&mut writer)?; + + // Palette + VarInt(to_bits(*val) as i32).encode(&mut writer)?; + + // Number of longs + VarInt(0).encode(writer)?; + } + Self::Indirect(ind) => { + let bits_per_entry = min_indirect_bits.max(bit_width(ind.palette.len() - 1)); + + // Encode as direct if necessary. + if bits_per_entry > max_indirect_bits { + // Bits per entry + (direct_bits as u8).encode(&mut writer)?; + + // Number of longs in data array. + VarInt(compact_u64s_len(LEN, direct_bits) as _).encode(&mut writer)?; + // Data array + encode_compact_u64s( + writer, + (0..LEN).map(|i| to_bits(ind.get(i))), + direct_bits, + )?; + } else { + // Bits per entry + (bits_per_entry as u8).encode(&mut writer)?; + + // Palette len + VarInt(ind.palette.len() as i32).encode(&mut writer)?; + // Palette + for val in &ind.palette { + VarInt(to_bits(*val) as i32).encode(&mut writer)?; + } + + // Number of longs in data array. + VarInt(compact_u64s_len(LEN, bits_per_entry) as _).encode(&mut writer)?; + // Data array + encode_compact_u64s( + writer, + ind.indices + .iter() + .cloned() + .flat_map(|byte| [byte & 0b1111, byte >> 4]) + .map(u64::from) + .take(LEN), + bits_per_entry, + )?; + } + } + Self::Direct(dir) => { + // Bits per entry + (direct_bits as u8).encode(&mut writer)?; + + // Number of longs in data array. + VarInt(compact_u64s_len(LEN, direct_bits) as _).encode(&mut writer)?; + // Data array + encode_compact_u64s(writer, dir.iter().cloned().map(to_bits), direct_bits)?; + } + } + + Ok(()) + } +} + +impl Default + for PalettedContainer +{ + fn default() -> Self { + Self::new() + } +} + +impl Indirect { + pub fn get(&self, idx: usize) -> T { + let palette_idx = self.indices[idx / 2] >> (idx % 2 * 4) & 0b1111; + self.palette[palette_idx as usize] + } + + pub fn set(&mut self, idx: usize, val: T) -> Option { + let palette_idx = if let Some(i) = self.palette.iter().position(|v| *v == val) { + i + } else { + self.palette.try_push(val).ok()?; + self.palette.len() - 1 + }; + + let old_val = self.get(idx); + let u8 = &mut self.indices[idx / 2]; + let shift = idx % 2 * 4; + *u8 = (*u8 & !(0b1111 << shift)) | ((palette_idx as u8) << shift); + Some(old_val) + } +} + +#[inline] +fn compact_u64s_len(vals_count: usize, bits_per_val: usize) -> usize { + let vals_per_u64 = 64 / bits_per_val; + vals_count.div_ceil(vals_per_u64) +} + +#[inline] +fn encode_compact_u64s( + mut w: impl Write, + mut vals: impl Iterator, + bits_per_val: usize, +) -> anyhow::Result<()> { + debug_assert!(bits_per_val <= 64); + + let vals_per_u64 = 64 / bits_per_val; + + loop { + let mut n = 0; + for i in 0..vals_per_u64 { + match vals.next() { + Some(val) => { + debug_assert!(val < 2_u128.pow(bits_per_val as _) as _); + n |= val << (i * bits_per_val); + } + None if i > 0 => return n.encode(&mut w), + None => return Ok(()), + } + } + n.encode(&mut w)?; + } +} + +#[cfg(test)] +mod tests { + use rand::Rng; + + use super::*; + + fn check( + p: &PalettedContainer, + s: &[T], + ) -> bool { + assert_eq!(s.len(), LEN); + (0..LEN).all(|i| p.get(i) == s[i]) + } + + #[test] + fn random_assignments() { + const LEN: usize = 100; + let range = 0..64; + + let mut rng = rand::thread_rng(); + + for _ in 0..20 { + let mut p = PalettedContainer::::new(); + + let init = rng.gen_range(range.clone()); + + p.fill(init); + let mut a = [init; LEN]; + + assert!(check(&p, &a)); + + let mut rng = rand::thread_rng(); + + for _ in 0..LEN * 10 { + let idx = rng.gen_range(0..LEN); + let val = rng.gen_range(range.clone()); + + assert_eq!(p.get(idx), p.set(idx, val)); + assert_eq!(val, p.get(idx)); + a[idx] = val; + + p.shrink_to_fit(); + + assert!(check(&p, &a)); + } + } + } +} diff --git a/vendor/valence/crates/valence_server/src/layer/chunk/unloaded.rs b/vendor/valence/crates/valence_server/src/layer/chunk/unloaded.rs new file mode 100644 index 00000000..93638d2b --- /dev/null +++ b/vendor/valence/crates/valence_server/src/layer/chunk/unloaded.rs @@ -0,0 +1,184 @@ +use std::cmp::Ordering; +use std::collections::BTreeMap; + +use valence_nbt::Compound; +use valence_protocol::BlockState; +use valence_registry::biome::BiomeId; + +use super::chunk::{ + check_biome_oob, check_block_oob, check_section_oob, BiomeContainer, BlockStateContainer, + Chunk, MAX_HEIGHT, SECTION_BLOCK_COUNT, +}; + +#[derive(Clone, Default, Debug)] +pub struct UnloadedChunk { + pub sections: Vec

, + pub block_entities: BTreeMap, +} + +#[derive(Clone, Default, Debug)] +pub struct Section { + pub block_states: BlockStateContainer, + pub biomes: BiomeContainer, +} + +impl UnloadedChunk { + pub fn new() -> Self { + Self::default() + } + + pub fn with_height(height: u32) -> Self { + Self { + sections: vec![Section::default(); height as usize / 16], + block_entities: BTreeMap::new(), + } + } + + /// Sets the height of this chunk in meters. The chunk is truncated or + /// extended with [`BlockState::AIR`] and [`BiomeId::default()`] from the + /// top. + /// + /// The new height should be a multiple of 16 and no more than + /// [`MAX_HEIGHT`]. Otherwise, the height is rounded down to the nearest + /// valid height. + pub fn set_height(&mut self, height: u32) { + let new_count = height.min(MAX_HEIGHT) as usize / 16; + let old_count = self.sections.len(); + + match new_count.cmp(&old_count) { + Ordering::Less => { + self.sections.truncate(new_count); + self.sections.shrink_to_fit(); + + let cutoff = SECTION_BLOCK_COUNT as u32 * new_count as u32; + self.block_entities.retain(|idx, _| *idx < cutoff); + } + Ordering::Equal => {} + Ordering::Greater => { + let diff = new_count - old_count; + self.sections.reserve_exact(diff); + self.sections.extend((0..diff).map(|_| Section::default())); + } + } + } +} + +impl Chunk for UnloadedChunk { + fn height(&self) -> u32 { + self.sections.len() as u32 * 16 + } + + fn block_state(&self, x: u32, y: u32, z: u32) -> BlockState { + check_block_oob(self, x, y, z); + + let idx = x + z * 16 + y % 16 * 16 * 16; + self.sections[y as usize / 16] + .block_states + .get(idx as usize) + } + + fn set_block_state(&mut self, x: u32, y: u32, z: u32, block: BlockState) -> BlockState { + check_block_oob(self, x, y, z); + + let idx = x + z * 16 + y % 16 * 16 * 16; + self.sections[y as usize / 16] + .block_states + .set(idx as usize, block) + } + + fn fill_block_state_section(&mut self, sect_y: u32, block: BlockState) { + check_section_oob(self, sect_y); + + self.sections[sect_y as usize].block_states.fill(block); + } + + fn block_entity(&self, x: u32, y: u32, z: u32) -> Option<&Compound> { + check_block_oob(self, x, y, z); + + let idx = x + z * 16 + y * 16 * 16; + self.block_entities.get(&idx) + } + + fn block_entity_mut(&mut self, x: u32, y: u32, z: u32) -> Option<&mut Compound> { + check_block_oob(self, x, y, z); + + let idx = x + z * 16 + y * 16 * 16; + self.block_entities.get_mut(&idx) + } + + fn set_block_entity( + &mut self, + x: u32, + y: u32, + z: u32, + block_entity: Option, + ) -> Option { + check_block_oob(self, x, y, z); + + let idx = x + z * 16 + y * 16 * 16; + + match block_entity { + Some(be) => self.block_entities.insert(idx, be), + None => self.block_entities.remove(&idx), + } + } + + fn clear_block_entities(&mut self) { + self.block_entities.clear(); + } + + fn biome(&self, x: u32, y: u32, z: u32) -> BiomeId { + check_biome_oob(self, x, y, z); + + let idx = x + z * 4 + y % 4 * 4 * 4; + self.sections[y as usize / 4].biomes.get(idx as usize) + } + + fn set_biome(&mut self, x: u32, y: u32, z: u32, biome: BiomeId) -> BiomeId { + check_biome_oob(self, x, y, z); + + let idx = x + z * 4 + y % 4 * 4 * 4; + self.sections[y as usize / 4] + .biomes + .set(idx as usize, biome) + } + + fn fill_biome_section(&mut self, sect_y: u32, biome: BiomeId) { + check_section_oob(self, sect_y); + + self.sections[sect_y as usize].biomes.fill(biome); + } + + fn shrink_to_fit(&mut self) { + for sect in &mut self.sections { + sect.block_states.shrink_to_fit(); + sect.biomes.shrink_to_fit(); + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn unloaded_chunk_resize_removes_block_entities() { + let mut chunk = UnloadedChunk::with_height(32); + + assert_eq!(chunk.height(), 32); + + // First block entity is in section 0. + chunk.set_block_entity(0, 5, 0, Some(Compound::new())); + + // Second block entity is in section 1. + chunk.set_block_entity(0, 16, 0, Some(Compound::new())); + + // Remove section 0. + chunk.set_height(16); + assert_eq!(chunk.height(), 16); + + assert_eq!(chunk.block_entity(0, 5, 0), Some(&Compound::new())); + assert_eq!(chunk.set_block_entity(0, 5, 0, None), Some(Compound::new())); + assert!(chunk.block_entities.is_empty()); + } +} diff --git a/vendor/valence/crates/valence_server/src/layer/entity.rs b/vendor/valence/crates/valence_server/src/layer/entity.rs new file mode 100644 index 00000000..02beb55f --- /dev/null +++ b/vendor/valence/crates/valence_server/src/layer/entity.rs @@ -0,0 +1,524 @@ +use std::collections::BTreeSet; + +use bevy_ecs::prelude::*; +use rustc_hash::FxHashMap; +use valence_protocol::encode::{PacketWriter, WritePacket}; +use valence_protocol::{BlockPos, ChunkPos, CompressionThreshold, Encode, Packet}; +use valence_server_common::Server; + +use super::bvh::GetChunkPos; +use super::message::Messages; +use super::Layer; +// use crate::client::Client; + +/// A [`Component`] containing Minecraft entities. +#[derive(Component, Debug)] +pub struct EntityLayer { + messages: EntityLayerMessages, + entities: FxHashMap>, + threshold: CompressionThreshold, +} + +type EntityLayerMessages = Messages; + +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug)] +pub(crate) enum GlobalMsg { + /// Send packet data to all clients viewing the layer. Message data is + /// serialized packet data. + Packet, + /// Send packet data to all clients viewing layer, except the client + /// identified by `except`. + PacketExcept { except: Entity }, + /// This layer was despawned and should be removed from the set of visible + /// entity layers. Message data is empty. + DespawnLayer, +} + +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug)] +// NOTE: Variant order is significant. Despawns should be ordered before spawns. +pub(crate) enum LocalMsg { + /// Despawn entities if the client is not already viewing `dest_layer`. + /// Message data is the serialized form of `EntityId`. + DespawnEntity { pos: ChunkPos, dest_layer: Entity }, + /// Despawn entities if the client is not in view of `dest_pos`. Message + /// data is the serialized form of `EntityId`. + DespawnEntityTransition { pos: ChunkPos, dest_pos: ChunkPos }, + /// Spawn entities if the client is not already viewing `src_layer`. Message + /// data is the serialized form of [`Entity`]. + SpawnEntity { pos: ChunkPos, src_layer: Entity }, + /// Spawn entities if the client is not in view of `src_pos`. Message data + /// is the serialized form of [`Entity`]. + SpawnEntityTransition { pos: ChunkPos, src_pos: ChunkPos }, + /// Send packet data to all clients viewing the layer in view of `pos`. + /// Message data is serialized packet data. + PacketAt { pos: ChunkPos }, + /// Send packet data to all clients viewing the layer in view of `pos`, + /// except the client identified by `except`. Message data is serialized + /// packet data. + PacketAtExcept { pos: ChunkPos, except: Entity }, + /// Send packet data to all clients in a sphere. + RadiusAt { + center: BlockPos, + radius_squared: u32, + }, + /// Send packet data to all clients in a sphere, except the client `except`. + RadiusAtExcept { + center: BlockPos, + radius_squared: u32, + except: Entity, + }, +} + +impl GetChunkPos for LocalMsg { + fn chunk_pos(&self) -> ChunkPos { + match *self { + LocalMsg::PacketAt { pos } => pos, + LocalMsg::PacketAtExcept { pos, .. } => pos, + LocalMsg::RadiusAt { center, .. } => center.into(), + LocalMsg::RadiusAtExcept { center, .. } => center.into(), + LocalMsg::SpawnEntity { pos, .. } => pos, + LocalMsg::SpawnEntityTransition { pos, .. } => pos, + LocalMsg::DespawnEntity { pos, .. } => pos, + LocalMsg::DespawnEntityTransition { pos, .. } => pos, + } + } +} + +impl EntityLayer { + /// Creates a new entity layer. + pub fn new(server: &Server) -> Self { + Self { + messages: Messages::new(), + entities: Default::default(), + threshold: server.compression_threshold(), + } + } + + /// Returns an iterator over all entities contained within the given chunk + /// position in this layer. + pub fn entities_at( + &self, + pos: impl Into, + ) -> impl Iterator + Clone + '_ { + self.entities + .get(&pos.into()) + .into_iter() + .flat_map(|entities| entities.iter().copied()) + } + + pub(crate) fn messages(&self) -> &EntityLayerMessages { + &self.messages + } +} + +impl Layer for EntityLayer { + type ExceptWriter<'a> = ExceptWriter<'a>; + + type ViewWriter<'a> = ViewWriter<'a>; + + type ViewExceptWriter<'a> = ViewExceptWriter<'a>; + + type RadiusWriter<'a> = RadiusWriter<'a>; + + type RadiusExceptWriter<'a> = RadiusExceptWriter<'a>; + + fn except_writer(&mut self, except: Entity) -> Self::ExceptWriter<'_> { + ExceptWriter { + layer: self, + except, + } + } + + fn view_writer(&mut self, pos: impl Into) -> Self::ViewWriter<'_> { + ViewWriter { + layer: self, + pos: pos.into(), + } + } + + fn view_except_writer( + &mut self, + pos: impl Into, + except: Entity, + ) -> Self::ViewExceptWriter<'_> { + ViewExceptWriter { + layer: self, + pos: pos.into(), + except, + } + } + + fn radius_writer( + &mut self, + center: impl Into, + radius: u32, + ) -> Self::RadiusWriter<'_> { + RadiusWriter { + layer: self, + center: center.into(), + radius_squared: radius.saturating_mul(radius), + } + } + + fn radius_except_writer( + &mut self, + center: impl Into, + radius: u32, + except: Entity, + ) -> Self::RadiusExceptWriter<'_> { + RadiusExceptWriter { + layer: self, + center: center.into(), + radius_squared: radius.saturating_mul(radius), + except, + } + } +} + +impl WritePacket for EntityLayer { + fn write_packet_fallible

(&mut self, packet: &P) -> anyhow::Result<()> + where + P: Packet + Encode, + { + self.messages.send_global(GlobalMsg::Packet, |b| { + PacketWriter::new(b, self.threshold).write_packet_fallible(packet) + }) + } + + fn write_packet_bytes(&mut self, bytes: &[u8]) { + self.messages + .send_global_infallible(GlobalMsg::Packet, |b| b.extend_from_slice(bytes)); + } +} + +pub struct ExceptWriter<'a> { + layer: &'a mut EntityLayer, + except: Entity, +} + +impl WritePacket for ExceptWriter<'_> { + fn write_packet_fallible

(&mut self, packet: &P) -> anyhow::Result<()> + where + P: Packet + Encode, + { + self.layer.messages.send_global( + GlobalMsg::PacketExcept { + except: self.except, + }, + |b| PacketWriter::new(b, self.layer.threshold).write_packet_fallible(packet), + ) + } + + fn write_packet_bytes(&mut self, bytes: &[u8]) { + self.layer.messages.send_global_infallible( + GlobalMsg::PacketExcept { + except: self.except, + }, + |b| b.extend_from_slice(bytes), + ) + } +} + +pub struct ViewWriter<'a> { + layer: &'a mut EntityLayer, + pos: ChunkPos, +} + +impl<'a> WritePacket for ViewWriter<'a> { + fn write_packet_fallible

(&mut self, packet: &P) -> anyhow::Result<()> + where + P: Packet + Encode, + { + self.layer + .messages + .send_local(LocalMsg::PacketAt { pos: self.pos }, |b| { + PacketWriter::new(b, self.layer.threshold).write_packet_fallible(packet) + }) + } + + fn write_packet_bytes(&mut self, bytes: &[u8]) { + self.layer + .messages + .send_local_infallible(LocalMsg::PacketAt { pos: self.pos }, |b| { + b.extend_from_slice(bytes) + }); + } +} + +pub struct ViewExceptWriter<'a> { + layer: &'a mut EntityLayer, + pos: ChunkPos, + except: Entity, +} + +impl WritePacket for ViewExceptWriter<'_> { + fn write_packet_fallible

(&mut self, packet: &P) -> anyhow::Result<()> + where + P: Packet + Encode, + { + self.layer.messages.send_local( + LocalMsg::PacketAtExcept { + pos: self.pos, + except: self.except, + }, + |b| PacketWriter::new(b, self.layer.threshold).write_packet_fallible(packet), + ) + } + + fn write_packet_bytes(&mut self, bytes: &[u8]) { + self.layer.messages.send_local_infallible( + LocalMsg::PacketAtExcept { + pos: self.pos, + except: self.except, + }, + |b| b.extend_from_slice(bytes), + ); + } +} + +pub struct RadiusWriter<'a> { + layer: &'a mut EntityLayer, + center: BlockPos, + radius_squared: u32, +} + +impl WritePacket for RadiusWriter<'_> { + fn write_packet_fallible

(&mut self, packet: &P) -> anyhow::Result<()> + where + P: Packet + Encode, + { + self.layer.messages.send_local( + LocalMsg::RadiusAt { + center: self.center, + radius_squared: self.radius_squared, + }, + |b| PacketWriter::new(b, self.layer.threshold).write_packet_fallible(packet), + ) + } + + fn write_packet_bytes(&mut self, bytes: &[u8]) { + self.layer.messages.send_local_infallible( + LocalMsg::RadiusAt { + center: self.center, + radius_squared: self.radius_squared, + }, + |b| b.extend_from_slice(bytes), + ); + } +} + +pub struct RadiusExceptWriter<'a> { + layer: &'a mut EntityLayer, + center: BlockPos, + radius_squared: u32, + except: Entity, +} + +impl WritePacket for RadiusExceptWriter<'_> { + fn write_packet_fallible

(&mut self, packet: &P) -> anyhow::Result<()> + where + P: Packet + Encode, + { + self.layer.messages.send_local( + LocalMsg::RadiusAtExcept { + center: self.center, + radius_squared: self.radius_squared, + except: self.except, + }, + |b| PacketWriter::new(b, self.layer.threshold).write_packet_fallible(packet), + ) + } + + fn write_packet_bytes(&mut self, bytes: &[u8]) { + self.layer.messages.send_local_infallible( + LocalMsg::RadiusAtExcept { + center: self.center, + radius_squared: self.radius_squared, + except: self.except, + }, + |b| b.extend_from_slice(bytes), + ); + } +} + +// pub(super) fn build(app: &mut App) { +// app.add_systems( +// PostUpdate, +// ( +// ( +// change_entity_positions, +// send_entity_update_messages, +// send_layer_despawn_messages, +// ready_entity_layers, +// ) +// .chain() +// .in_set(UpdateLayersPreClientSet), +// unready_entity_layers.in_set(UpdateLayersPostClientSet), +// ), +// ); +// } +// +// fn change_entity_positions( +// entities: Query< +// ( +// Entity, +// &EntityId, +// &Position, +// &OldPosition, +// &EntityLayerId, +// &OldEntityLayerId, +// Has, +// ), +// Or<(Changed, Changed, With)>, +// >, +// mut layers: Query<&mut EntityLayer>, +// ) { +// for (entity, entity_id, pos, old_pos, layer_id, old_layer_id, despawned) +// in &entities { let chunk_pos = ChunkPos::from(pos.0); +// let old_chunk_pos = ChunkPos::from(old_pos.get()); +// +// if despawned { +// // Entity was deleted. Remove it from the layer. +// +// if let Ok(old_layer) = layers.get_mut(layer_id.0) { +// let old_layer = old_layer.into_inner(); +// +// if let Entry::Occupied(mut old_cell) = +// old_layer.entities.entry(old_chunk_pos) { if +// old_cell.get_mut().remove(&entity) { +// old_layer.messages.send_local_infallible( +// LocalMsg::DespawnEntity { pos: old_chunk_pos, +// dest_layer: Entity::PLACEHOLDER, +// }, +// |b| b.extend_from_slice(&entity_id.get().to_ne_bytes()), +// ); +// +// if old_cell.get().is_empty() { +// old_cell.remove(); +// } +// } +// } +// } +// } else if old_layer_id != layer_id { +// // Entity changed their layer. Remove it from old layer and +// insert it in the new // layer. +// +// if let Ok(old_layer) = layers.get_mut(old_layer_id.get()) { +// let old_layer = old_layer.into_inner(); +// +// if let Entry::Occupied(mut old_cell) = +// old_layer.entities.entry(old_chunk_pos) { if +// old_cell.get_mut().remove(&entity) { +// old_layer.messages.send_local_infallible( +// LocalMsg::DespawnEntity { pos: old_chunk_pos, +// dest_layer: layer_id.0, +// }, +// |b| b.extend_from_slice(&entity_id.get().to_ne_bytes()), +// ); +// +// if old_cell.get().is_empty() { +// old_cell.remove(); +// } +// } +// } +// } +// +// if let Ok(mut layer) = layers.get_mut(layer_id.0) { +// if +// layer.entities.entry(chunk_pos).or_default().insert(entity) { +// layer.messages.send_local_infallible( +// LocalMsg::SpawnEntity { pos: chunk_pos, +// src_layer: old_layer_id.get(), +// }, +// |b| b.extend_from_slice(&entity.to_bits().to_ne_bytes()), +// ); +// } +// } +// } else if chunk_pos != old_chunk_pos { +// // Entity changed their chunk position without changing layers. +// Remove it from // old cell and insert it in the new cell. +// +// if let Ok(mut layer) = layers.get_mut(layer_id.0) { +// if let Entry::Occupied(mut old_cell) = +// layer.entities.entry(old_chunk_pos) { if +// old_cell.get_mut().remove(&entity) { +// layer.messages.send_local_infallible( +// LocalMsg::DespawnEntityTransition { pos: +// old_chunk_pos, dest_pos: chunk_pos, +// }, +// |b| b.extend_from_slice(&entity_id.get().to_ne_bytes()), +// ); +// } +// } +// +// if +// layer.entities.entry(chunk_pos).or_default().insert(entity) { +// layer.messages.send_local_infallible( +// LocalMsg::SpawnEntityTransition { pos: chunk_pos, +// src_pos: old_chunk_pos, +// }, +// |b| b.extend_from_slice(&entity.to_bits().to_ne_bytes()), +// ); +// } +// } +// } +// } +// } +// +// fn send_entity_update_messages( +// entities: Query<(Entity, UpdateEntityQuery, Has), +// Without>, mut layers: Query<&mut EntityLayer>, +// ) { +// for layer in layers.iter_mut() { +// let layer = layer.into_inner(); +// +// for cell in layer.entities.values_mut() { +// for &entity in cell.iter() { +// if let Ok((entity, update, is_client)) = entities.get(entity) +// { let chunk_pos = ChunkPos::from(update.pos.0); +// +// // Send the update packets to all viewers. If the entity +// being updated is a // client, then we need to be careful +// to exclude the client itself from // receiving the update +// packets. let msg = if is_client { +// LocalMsg::PacketAtExcept { +// pos: chunk_pos, +// except: entity, +// } +// } else { +// LocalMsg::PacketAt { pos: chunk_pos } +// }; +// +// layer.messages.send_local_infallible(msg, |b| { +// update.write_update_packets(PacketWriter::new(b, +// layer.threshold)) }); +// } else { +// panic!( +// "Entity {entity:?} was not properly removed from +// entity layer. Did you \ forget to use the +// `Despawned` component?" ); +// } +// } +// } +// } +// } +// +// fn send_layer_despawn_messages(mut layers: Query<&mut EntityLayer, +// With>) { for mut layer in &mut layers { +// layer +// .messages +// .send_global_infallible(GlobalMsg::DespawnLayer, |_| {}); +// } +// } +// +// fn ready_entity_layers(mut layers: Query<&mut EntityLayer>) { +// for mut layer in &mut layers { +// layer.messages.ready(); +// } +// } +// +// fn unready_entity_layers(mut layers: Query<&mut EntityLayer>) { +// for mut layer in &mut layers { +// layer.messages.unready(); +// } +// } diff --git a/vendor/valence/crates/valence_server/src/layer/message.rs b/vendor/valence/crates/valence_server/src/layer/message.rs new file mode 100644 index 00000000..944a88cd --- /dev/null +++ b/vendor/valence/crates/valence_server/src/layer/message.rs @@ -0,0 +1,309 @@ +use core::fmt; +use std::convert::Infallible; +use std::ops::Range; + +use valence_protocol::ChunkPos; + +use crate::layer::bvh::{ChunkBvh, GetChunkPos}; +use crate::ChunkView; + +/// A message buffer of global messages (`G`) and local messages (`L`) meant for +/// consumption by clients. Local messages are those that have some spatial +/// component to them and implement the [`GetChunkPos`] trait. Local messages +/// are placed in a bounding volume hierarchy for fast queries via +/// [`Self::query_local`]. Global messages do not necessarily have a spatial +/// component and all globals will be visited when using [`Self::iter_global`]. +/// +/// Every message is associated with an arbitrary span of bytes. The meaning of +/// the bytes is whatever the message needs it to be. +/// +/// At the end of the tick and before clients have access to the buffer, all +/// messages are sorted and then deduplicated by concatenating byte spans +/// together. This is done for a couple of reasons: +/// - Messages may rely on sorted message order for correctness, like in the +/// case of entity spawn & despawn messages. Sorting also makes deduplication +/// easy. +/// - Deduplication reduces the total number of messages that all clients must +/// examine. Consider the case of a message such as "send all clients in view +/// of this chunk position these packet bytes". If two of these messages have +/// the same chunk position, then they can just be combined together. +pub struct Messages { + global: Vec<(G, Range)>, + local: Vec<(L, Range)>, + bvh: ChunkBvh>, + staging: Vec, + ready: Vec, + is_ready: bool, +} + +impl Messages +where + G: Clone + Ord, + L: Clone + Ord + GetChunkPos, +{ + pub(crate) fn new() -> Self { + Self::default() + } + + /// Adds a global message to this message buffer. + pub(crate) fn send_global( + &mut self, + msg: G, + f: impl FnOnce(&mut Vec) -> Result<(), E>, + ) -> Result<(), E> { + debug_assert!(!self.is_ready); + + let start = self.staging.len(); + f(&mut self.staging)?; + let end = self.staging.len(); + + if let Some((m, range)) = self.global.last_mut() + && msg == *m { + // Extend the existing message. + range.end = end as u32; + return Ok(()); + } + + self.global.push((msg, start as u32..end as u32)); + + Ok(()) + } + + /// Adds a local message to this message buffer. + pub(crate) fn send_local( + &mut self, + msg: L, + f: impl FnOnce(&mut Vec) -> Result<(), E>, + ) -> Result<(), E> { + debug_assert!(!self.is_ready); + + let start = self.staging.len(); + f(&mut self.staging)?; + let end = self.staging.len(); + + if let Some((m, range)) = self.local.last_mut() + && msg == *m { + // Extend the existing message. + range.end = end as u32; + return Ok(()); + } + + self.local.push((msg, start as u32..end as u32)); + + Ok(()) + } + + /// Like [`Self::send_global`] but writing bytes cannot fail. + pub(crate) fn send_global_infallible(&mut self, msg: G, f: impl FnOnce(&mut Vec)) { + let _ = self.send_global::(msg, |b| { + f(b); + Ok(()) + }); + } + + /// Like [`Self::send_local`] but writing bytes cannot fail. + pub(crate) fn send_local_infallible(&mut self, msg: L, f: impl FnOnce(&mut Vec)) { + let _ = self.send_local::(msg, |b| { + f(b); + Ok(()) + }); + } + + /// Readies messages to be read by clients. + pub(crate) fn ready(&mut self) { + debug_assert!(!self.is_ready); + self.is_ready = true; + + debug_assert!(self.ready.is_empty()); + + self.ready.reserve_exact(self.staging.len()); + + fn sort_and_merge( + msgs: &mut Vec<(M, Range)>, + staging: &[u8], + ready: &mut Vec, + ) { + // Sort must be stable. + msgs.sort_by_key(|(msg, _)| msg.clone()); + + // Make sure the first element is already copied to "ready". + if let Some((_, range)) = msgs.first_mut() { + let start = ready.len(); + ready.extend_from_slice(&staging[range.start as usize..range.end as usize]); + let end = ready.len(); + + *range = start as u32..end as u32; + } + + msgs.dedup_by(|(right_msg, right_range), (left_msg, left_range)| { + if *left_msg == *right_msg { + // Extend the left element with the right element. Then delete the right + // element. + + let right_bytes = + &staging[right_range.start as usize..right_range.end as usize]; + + ready.extend_from_slice(right_bytes); + + left_range.end += right_bytes.len() as u32; + + true + } else { + // Copy right element to "ready". + + let right_bytes = + &staging[right_range.start as usize..right_range.end as usize]; + + let start = ready.len(); + ready.extend_from_slice(right_bytes); + let end = ready.len(); + + *right_range = start as u32..end as u32; + + false + } + }); + } + + sort_and_merge(&mut self.global, &self.staging, &mut self.ready); + sort_and_merge(&mut self.local, &self.staging, &mut self.ready); + + self.bvh.build( + self.local + .iter() + .cloned() + .map(|(msg, range)| MessagePair { msg, range }), + ); + } + + pub(crate) fn unready(&mut self) { + assert!(self.is_ready); + self.is_ready = false; + + self.local.clear(); + self.global.clear(); + self.staging.clear(); + self.ready.clear(); + } + + pub(crate) fn shrink_to_fit(&mut self) { + self.global.shrink_to_fit(); + self.local.shrink_to_fit(); + self.bvh.shrink_to_fit(); + self.staging.shrink_to_fit(); + self.ready.shrink_to_fit(); + } + + /// All message bytes. Use this in conjunction with [`Self::iter_global`] + /// and [`Self::query_local`]. + pub fn bytes(&self) -> &[u8] { + debug_assert!(self.is_ready); + + &self.ready + } + + /// Returns an iterator over all global messages and their span of bytes in + /// [`Self::bytes`]. + pub fn iter_global(&self) -> impl Iterator)> + '_ { + debug_assert!(self.is_ready); + + self.global + .iter() + .map(|(m, r)| (m.clone(), r.start as usize..r.end as usize)) + } + + /// Takes a visitor function `f` and visits all local messages contained + /// within the chunk view `view`. `f` is called with the local + /// message and its span of bytes in [`Self::bytes`]. + pub fn query_local(&self, view: ChunkView, mut f: impl FnMut(L, Range)) { + debug_assert!(self.is_ready); + + self.bvh.query(view, |pair| { + f( + pair.msg.clone(), + pair.range.start as usize..pair.range.end as usize, + ) + }); + } +} + +impl Default for Messages { + fn default() -> Self { + Self { + global: Default::default(), + local: Default::default(), + bvh: Default::default(), + staging: Default::default(), + ready: Default::default(), + is_ready: Default::default(), + } + } +} + +impl fmt::Debug for Messages +where + G: fmt::Debug, + L: fmt::Debug, +{ + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.debug_struct("Messages") + .field("global", &self.global) + .field("local", &self.local) + .field("is_ready", &self.is_ready) + .finish() + } +} + +#[derive(Debug)] +struct MessagePair { + msg: M, + range: Range, +} + +impl GetChunkPos for MessagePair { + fn chunk_pos(&self) -> ChunkPos { + self.msg.chunk_pos() + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug)] + struct DummyLocal; + + impl GetChunkPos for DummyLocal { + fn chunk_pos(&self) -> ChunkPos { + unimplemented!() + } + } + + #[test] + fn send_global_message() { + #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug)] + enum TestMsg { + Foo, + Bar, + } + + let mut messages = Messages::::new(); + + messages.send_global_infallible(TestMsg::Foo, |b| b.extend_from_slice(&[1, 2, 3])); + messages.send_global_infallible(TestMsg::Bar, |b| b.extend_from_slice(&[4, 5, 6])); + messages.send_global_infallible(TestMsg::Foo, |b| b.extend_from_slice(&[7, 8, 9])); + + messages.ready(); + + let bytes = messages.bytes(); + + for (msg, range) in messages.iter_global() { + match msg { + TestMsg::Foo => assert_eq!(&bytes[range.clone()], &[1, 2, 3, 7, 8, 9]), + TestMsg::Bar => assert_eq!(&bytes[range.clone()], &[4, 5, 6]), + } + } + + messages.unready(); + } +} diff --git a/vendor/valence/crates/valence_server/src/lib.rs b/vendor/valence/crates/valence_server/src/lib.rs new file mode 100644 index 00000000..16c09e0f --- /dev/null +++ b/vendor/valence/crates/valence_server/src/lib.rs @@ -0,0 +1,58 @@ +#![doc = include_str!("../README.md")] +#![deny( + rustdoc::broken_intra_doc_links, + rustdoc::private_intra_doc_links, + rustdoc::missing_crate_level_docs, + rustdoc::invalid_codeblock_attributes, + rustdoc::invalid_rust_codeblocks, + rustdoc::bare_urls, + rustdoc::invalid_html_tags +)] +#![warn( + trivial_casts, + trivial_numeric_casts, + unused_lifetimes, + unused_import_braces, + unreachable_pub, + clippy::dbg_macro +)] +#![allow(clippy::type_complexity)] + +// pub mod abilities; +// pub mod action; +// pub mod brand; +mod chunk_view; +// pub mod client; +// pub mod client_command; +// pub mod client_settings; +// pub mod custom_payload; +// pub mod event_loop; +// pub mod hand_swing; +// pub mod interact_block; +// pub mod interact_entity; +// pub mod interact_item; +// pub mod keepalive; +pub mod layer; +// pub mod message; +// pub mod movement; +// pub mod op_level; +// pub mod resource_pack; +// pub mod spawn; +// pub mod status; +// pub mod status_effect; +// pub mod teleport; +// pub mod title; + +pub use chunk_view::ChunkView; +// pub use event_loop::{EventLoopPostUpdate, EventLoopPreUpdate, EventLoopUpdate}; +pub use layer::{ChunkLayer, EntityLayer, Layer, LayerBundle}; +pub use valence_protocol::{ + block, ident, item, math, text, uuid, BiomePos, BlockPos, BlockState, ChunkPos, + CompressionThreshold, Difficulty, Direction, GameMode, Hand, Ident, ItemKind, ItemStack, Text, + MINECRAFT_VERSION, PROTOCOL_VERSION, +}; +pub use valence_server_common::*; +pub use { + bevy_app as app, bevy_ecs as ecs, rand, valence_entity as entity, valence_nbt as nbt, + valence_protocol as protocol, valence_registry as registry, +}; diff --git a/vendor/valence/crates/valence_server/src/message.rs b/vendor/valence/crates/valence_server/src/message.rs new file mode 100644 index 00000000..49855c3b --- /dev/null +++ b/vendor/valence/crates/valence_server/src/message.rs @@ -0,0 +1,63 @@ +// TODO: delete this module in favor of valence_chat. + +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use valence_protocol::encode::WritePacket; +use valence_protocol::packets::play::{ChatMessageC2s, GameMessageS2c}; +use valence_protocol::text::IntoText; + +use crate::event_loop::{EventLoopPreUpdate, PacketEvent}; + +pub struct MessagePlugin; + +impl Plugin for MessagePlugin { + fn build(&self, app: &mut App) { + app.add_event::() + .add_systems(EventLoopPreUpdate, handle_chat_message); + } +} + +pub trait SendMessage { + /// Sends a system message visible in the chat. + fn send_chat_message<'a>(&mut self, msg: impl IntoText<'a>); + /// Displays a message in the player's action bar (text above the hotbar). + fn send_action_bar_message<'a>(&mut self, msg: impl IntoText<'a>); +} + +impl SendMessage for T { + fn send_chat_message<'a>(&mut self, msg: impl IntoText<'a>) { + self.write_packet(&GameMessageS2c { + chat: msg.into_cow_text(), + overlay: false, + }); + } + + fn send_action_bar_message<'a>(&mut self, msg: impl IntoText<'a>) { + self.write_packet(&GameMessageS2c { + chat: msg.into_cow_text(), + overlay: true, + }); + } +} + +#[derive(Event, Clone, Debug)] +pub struct ChatMessageEvent { + pub client: Entity, + pub message: Box, + pub timestamp: u64, +} + +pub fn handle_chat_message( + mut packets: EventReader, + mut events: EventWriter, +) { + for packet in packets.read() { + if let Some(pkt) = packet.decode::() { + events.send(ChatMessageEvent { + client: packet.client, + message: pkt.message.0.into(), + timestamp: pkt.timestamp, + }); + } + } +} diff --git a/vendor/valence/crates/valence_server/src/movement.rs b/vendor/valence/crates/valence_server/src/movement.rs new file mode 100644 index 00000000..00d5de9e --- /dev/null +++ b/vendor/valence/crates/valence_server/src/movement.rs @@ -0,0 +1,209 @@ +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use valence_entity::{HeadYaw, Look, OnGround, Position}; +use valence_math::DVec3; +use valence_protocol::packets::play::{ + FullC2s, LookAndOnGroundC2s, OnGroundOnlyC2s, PositionAndOnGroundC2s, VehicleMoveC2s, +}; + +use crate::event_loop::{EventLoopPreUpdate, PacketEvent}; +use crate::teleport::TeleportState; + +pub struct MovementPlugin; + +impl Plugin for MovementPlugin { + fn build(&self, app: &mut App) { + app.init_resource::() + .add_event::() + .add_systems(EventLoopPreUpdate, handle_client_movement); + } +} + +/// Configuration resource for client movement checks. +#[derive(Resource, Default)] +pub struct MovementSettings { + // TODO +} + +/// Event sent when a client successfully moves. +#[derive(Event, Clone, Debug)] +pub struct MovementEvent { + pub client: Entity, + pub position: DVec3, + pub old_position: DVec3, + pub look: Look, + pub old_look: Look, + pub on_ground: bool, + pub old_on_ground: bool, +} + +fn handle_client_movement( + mut packets: EventReader, + mut clients: Query<( + &mut Position, + &mut Look, + &mut HeadYaw, + &mut OnGround, + &mut TeleportState, + )>, + mut movement_events: EventWriter, +) { + for packet in packets.read() { + if let Some(pkt) = packet.decode::() { + if let Ok((pos, look, head_yaw, on_ground, teleport_state)) = + clients.get_mut(packet.client) + { + let mov = MovementEvent { + client: packet.client, + position: pkt.position, + old_position: pos.0, + look: *look, + old_look: *look, + on_ground: pkt.on_ground, + old_on_ground: on_ground.0, + }; + + handle( + mov, + pos, + look, + head_yaw, + on_ground, + teleport_state, + &mut movement_events, + ); + } + } else if let Some(pkt) = packet.decode::() { + if let Ok((pos, look, head_yaw, on_ground, teleport_state)) = + clients.get_mut(packet.client) + { + let mov = MovementEvent { + client: packet.client, + position: pkt.position, + old_position: pos.0, + look: Look { + yaw: pkt.yaw, + pitch: pkt.pitch, + }, + old_look: *look, + on_ground: pkt.on_ground, + old_on_ground: on_ground.0, + }; + + handle( + mov, + pos, + look, + head_yaw, + on_ground, + teleport_state, + &mut movement_events, + ); + } + } else if let Some(pkt) = packet.decode::() { + if let Ok((pos, look, head_yaw, on_ground, teleport_state)) = + clients.get_mut(packet.client) + { + let mov = MovementEvent { + client: packet.client, + position: pos.0, + old_position: pos.0, + look: Look { + yaw: pkt.yaw, + pitch: pkt.pitch, + }, + old_look: *look, + on_ground: pkt.on_ground, + old_on_ground: on_ground.0, + }; + + handle( + mov, + pos, + look, + head_yaw, + on_ground, + teleport_state, + &mut movement_events, + ); + } + } else if let Some(pkt) = packet.decode::() { + if let Ok((pos, look, head_yaw, on_ground, teleport_state)) = + clients.get_mut(packet.client) + { + let mov = MovementEvent { + client: packet.client, + position: pos.0, + old_position: pos.0, + look: *look, + old_look: *look, + on_ground: pkt.on_ground, + old_on_ground: on_ground.0, + }; + + handle( + mov, + pos, + look, + head_yaw, + on_ground, + teleport_state, + &mut movement_events, + ); + } + } else if let Some(pkt) = packet.decode::() { + if let Ok((pos, look, head_yaw, on_ground, teleport_state)) = + clients.get_mut(packet.client) + { + let mov = MovementEvent { + client: packet.client, + position: pkt.position, + old_position: pos.0, + look: Look { + yaw: pkt.yaw, + pitch: pkt.pitch, + }, + old_look: *look, + on_ground: on_ground.0, + old_on_ground: on_ground.0, + }; + + handle( + mov, + pos, + look, + head_yaw, + on_ground, + teleport_state, + &mut movement_events, + ); + } + } + } +} + +fn handle( + mov: MovementEvent, + mut pos: Mut, + mut look: Mut, + mut head_yaw: Mut, + mut on_ground: Mut, + mut teleport_state: Mut, + movement_events: &mut EventWriter, +) { + if teleport_state.pending_teleports() != 0 { + return; + } + + // TODO: check that the client isn't moving too fast / flying. + // TODO: check that the client isn't clipping through blocks. + + pos.set_if_neq(Position(mov.position)); + teleport_state.synced_pos = mov.position; + look.set_if_neq(mov.look); + teleport_state.synced_look = mov.look; + head_yaw.set_if_neq(HeadYaw(mov.look.yaw)); + on_ground.set_if_neq(OnGround(mov.on_ground)); + + movement_events.send(mov); +} diff --git a/vendor/valence/crates/valence_server/src/op_level.rs b/vendor/valence/crates/valence_server/src/op_level.rs new file mode 100644 index 00000000..55da0b13 --- /dev/null +++ b/vendor/valence/crates/valence_server/src/op_level.rs @@ -0,0 +1,38 @@ +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use derive_more::Deref; +use valence_protocol::packets::play::EntityStatusS2c; +use valence_protocol::WritePacket; + +use crate::client::{Client, UpdateClientsSet}; + +pub struct OpLevelPlugin; + +impl Plugin for OpLevelPlugin { + fn build(&self, app: &mut App) { + app.add_systems(PostUpdate, update_op_level.in_set(UpdateClientsSet)); + } +} + +#[derive(Component, Clone, PartialEq, Eq, Default, Debug, Deref)] +pub struct OpLevel(u8); + +impl OpLevel { + pub fn get(&self) -> u8 { + self.0 + } + + /// Sets the op level. Value is clamped to `0..=3`. + pub fn set(&mut self, lvl: u8) { + self.0 = lvl.min(3); + } +} + +fn update_op_level(mut clients: Query<(&mut Client, &OpLevel), Changed>) { + for (mut client, lvl) in &mut clients.iter_mut() { + client.write_packet(&EntityStatusS2c { + entity_id: 0, + entity_status: 24 + lvl.0, + }); + } +} diff --git a/vendor/valence/crates/valence_server/src/resource_pack.rs b/vendor/valence/crates/valence_server/src/resource_pack.rs new file mode 100644 index 00000000..ddd590e3 --- /dev/null +++ b/vendor/valence/crates/valence_server/src/resource_pack.rs @@ -0,0 +1,64 @@ +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use valence_protocol::packets::play::{ResourcePackSendS2c, ResourcePackStatusC2s}; +use valence_protocol::text::Text; +use valence_protocol::WritePacket; + +use crate::client::Client; +use crate::event_loop::{EventLoopPreUpdate, PacketEvent}; + +pub struct ResourcePackPlugin; + +impl Plugin for ResourcePackPlugin { + fn build(&self, app: &mut App) { + app.add_event::() + .add_systems(EventLoopPreUpdate, handle_resource_pack_status); + } +} + +#[derive(Event, Copy, Clone, PartialEq, Eq, Debug)] +pub struct ResourcePackStatusEvent { + pub client: Entity, + pub status: ResourcePackStatusC2s, +} + +impl Client { + /// Requests that the client download and enable a resource pack. + /// + /// # Arguments + /// * `url` - The URL of the resource pack file. + /// * `hash` - The SHA-1 hash of the resource pack file. The value must be a + /// 40-character hexadecimal string. + /// * `forced` - Whether a client should be kicked from the server upon + /// declining the pack (this is enforced client-side) + /// * `prompt_message` - A message to be displayed with the resource pack + /// dialog. + pub fn set_resource_pack( + &mut self, + url: &str, + hash: &str, + forced: bool, + prompt_message: Option, + ) { + self.write_packet(&ResourcePackSendS2c { + url, + hash: hash.into(), + forced, + prompt_message: prompt_message.map(|t| t.into()), + }); + } +} + +fn handle_resource_pack_status( + mut packets: EventReader, + mut events: EventWriter, +) { + for packet in packets.read() { + if let Some(pkt) = packet.decode::() { + events.send(ResourcePackStatusEvent { + client: packet.client, + status: pkt, + }) + } + } +} diff --git a/vendor/valence/crates/valence_server/src/spawn.rs b/vendor/valence/crates/valence_server/src/spawn.rs new file mode 100644 index 00000000..53c9850e --- /dev/null +++ b/vendor/valence/crates/valence_server/src/spawn.rs @@ -0,0 +1,207 @@ +//! Handles spawning and respawning the client. + +use std::borrow::Cow; +use std::collections::BTreeSet; + +use bevy_ecs::prelude::*; +use bevy_ecs::query::WorldQuery; +use derive_more::{Deref, DerefMut}; +use valence_entity::EntityLayerId; +use valence_protocol::packets::play::{GameJoinS2c, PlayerRespawnS2c, PlayerSpawnPositionS2c}; +use valence_protocol::{BlockPos, GameMode, GlobalPos, Ident, VarInt, WritePacket}; +use valence_registry::tags::TagsRegistry; +use valence_registry::{BiomeRegistry, RegistryCodec}; + +use crate::client::{Client, ViewDistance, VisibleChunkLayer}; +use crate::layer::ChunkLayer; + +// Components for the join game and respawn packet. + +#[derive(Component, Clone, PartialEq, Eq, Default, Debug)] +pub struct DeathLocation(pub Option<(Ident, BlockPos)>); + +#[derive(Component, Copy, Clone, PartialEq, Eq, Default, Debug, Deref, DerefMut)] +pub struct IsHardcore(pub bool); + +/// Hashed world seed used for biome noise. +#[derive(Component, Copy, Clone, PartialEq, Eq, Default, Debug, Deref, DerefMut)] +pub struct HashedSeed(pub u64); + +#[derive(Component, Copy, Clone, PartialEq, Eq, Default, Debug, Deref, DerefMut)] +pub struct ReducedDebugInfo(pub bool); + +#[derive(Component, Copy, Clone, PartialEq, Eq, Debug, Deref, DerefMut)] +pub struct HasRespawnScreen(pub bool); + +/// If the client is spawning into a debug world. +#[derive(Component, Copy, Clone, PartialEq, Eq, Default, Debug, Deref, DerefMut)] +pub struct IsDebug(pub bool); + +/// Changes the perceived horizon line (used for superflat worlds). +#[derive(Component, Copy, Clone, PartialEq, Eq, Default, Debug, Deref, DerefMut)] +pub struct IsFlat(pub bool); + +#[derive(Component, Copy, Clone, PartialEq, Eq, Default, Debug, Deref, DerefMut)] +pub struct PortalCooldown(pub i32); + +/// The initial previous gamemode. Used for the F3+F4 gamemode switcher. +#[derive(Component, Copy, Clone, PartialEq, Eq, Default, Debug, Deref, DerefMut)] +pub struct PrevGameMode(pub Option); + +impl Default for HasRespawnScreen { + fn default() -> Self { + Self(true) + } +} + +/// The position and angle that clients will respawn with. Also +/// controls the position that compasses point towards. +#[derive(Component, Copy, Clone, PartialEq, Default, Debug)] +pub struct RespawnPosition { + /// The position that clients will respawn at. This can be changed at any + /// time to set the position that compasses point towards. + pub pos: BlockPos, + /// The yaw angle that clients will respawn with (in degrees). + pub yaw: f32, +} + +/// A convenient [`WorldQuery`] for obtaining client spawn components. Also see +/// [`ClientSpawnQueryReadOnly`]. +#[derive(WorldQuery)] +#[world_query(mutable)] +pub struct ClientSpawnQuery { + pub is_hardcore: &'static mut IsHardcore, + pub game_mode: &'static mut GameMode, + pub prev_game_mode: &'static mut PrevGameMode, + pub hashed_seed: &'static mut HashedSeed, + pub view_distance: &'static mut ViewDistance, + pub reduced_debug_info: &'static mut ReducedDebugInfo, + pub has_respawn_screen: &'static mut HasRespawnScreen, + pub is_debug: &'static mut IsDebug, + pub is_flat: &'static mut IsFlat, + pub death_loc: &'static mut DeathLocation, + pub portal_cooldown: &'static mut PortalCooldown, +} + +pub(super) fn initial_join( + codec: Res, + tags: Res, + mut clients: Query<(&mut Client, &VisibleChunkLayer, ClientSpawnQueryReadOnly), Added>, + chunk_layers: Query<&ChunkLayer>, +) { + for (mut client, visible_chunk_layer, spawn) in &mut clients { + let Ok(chunk_layer) = chunk_layers.get(visible_chunk_layer.0) else { + continue; + }; + + let dimension_names: BTreeSet = codec + .registry(BiomeRegistry::KEY) + .iter() + .map(|value| value.name.into()) + .collect(); + + let dimension_name: Ident = chunk_layer.dimension_type_name().into(); + + let last_death_location = spawn.death_loc.0.as_ref().map(|(id, pos)| GlobalPos { + dimension_name: id.clone(), + position: *pos, + }); + + // The login packet is prepended so that it's sent before all the other packets. + // Some packets don't work correctly when sent before the game join packet. + _ = client.enc.prepend_packet(&GameJoinS2c { + entity_id: 0, // We reserve ID 0 for clients. + is_hardcore: spawn.is_hardcore.0, + game_mode: *spawn.game_mode, + previous_game_mode: spawn.prev_game_mode.0.into(), + dimension_names: Cow::Owned(dimension_names), + registry_codec: Cow::Borrowed(codec.cached_codec()), + dimension_type_name: dimension_name.clone(), + dimension_name, + hashed_seed: spawn.hashed_seed.0 as i64, + max_players: VarInt(0), // Ignored by clients. + view_distance: VarInt(spawn.view_distance.get() as i32), + simulation_distance: VarInt(16), // TODO. + reduced_debug_info: spawn.reduced_debug_info.0, + enable_respawn_screen: spawn.has_respawn_screen.0, + is_debug: spawn.is_debug.0, + is_flat: spawn.is_flat.0, + last_death_location, + portal_cooldown: VarInt(spawn.portal_cooldown.0), + }); + + client.write_packet_bytes(tags.sync_tags_packet()); + + /* + // TODO: enable all the features? + q.client.write_packet(&FeatureFlags { + features: vec![Ident::new("vanilla").unwrap()], + })?; + */ + } +} + +pub(super) fn respawn( + mut clients: Query< + ( + &mut Client, + &EntityLayerId, + &DeathLocation, + &HashedSeed, + &GameMode, + &PrevGameMode, + &IsDebug, + &IsFlat, + ), + Changed, + >, + chunk_layers: Query<&ChunkLayer>, +) { + for (mut client, loc, death_loc, hashed_seed, game_mode, prev_game_mode, is_debug, is_flat) in + &mut clients + { + if client.is_added() { + // No need to respawn since we are sending the game join packet this tick. + continue; + } + + let Ok(chunk_layer) = chunk_layers.get(loc.0) else { + continue; + }; + + let dimension_name = chunk_layer.dimension_type_name(); + + let last_death_location = death_loc.0.as_ref().map(|(id, pos)| GlobalPos { + dimension_name: id.clone(), + position: *pos, + }); + + client.write_packet(&PlayerRespawnS2c { + dimension_type_name: dimension_name.into(), + dimension_name: dimension_name.into(), + hashed_seed: hashed_seed.0, + game_mode: *game_mode, + previous_game_mode: prev_game_mode.0.into(), + is_debug: is_debug.0, + is_flat: is_flat.0, + copy_metadata: true, + last_death_location, + portal_cooldown: VarInt(0), // TODO + }); + } +} + +/// Sets the client's respawn and compass position. +/// +/// This also closes the "downloading terrain" screen when first joining, so +/// it should happen after the initial chunks are written. +pub(super) fn update_respawn_position( + mut clients: Query<(&mut Client, &RespawnPosition), Changed>, +) { + for (mut client, respawn_pos) in &mut clients { + client.write_packet(&PlayerSpawnPositionS2c { + position: respawn_pos.pos, + angle: respawn_pos.yaw, + }); + } +} diff --git a/vendor/valence/crates/valence_server/src/status.rs b/vendor/valence/crates/valence_server/src/status.rs new file mode 100644 index 00000000..1e0c66bd --- /dev/null +++ b/vendor/valence/crates/valence_server/src/status.rs @@ -0,0 +1,44 @@ +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use valence_protocol::packets::play::ClientStatusC2s; + +use crate::event_loop::{EventLoopPreUpdate, PacketEvent}; + +pub struct StatusPlugin; + +impl Plugin for StatusPlugin { + fn build(&self, app: &mut App) { + app.add_event::() + .add_event::() + .add_systems(EventLoopPreUpdate, handle_status); + } +} + +#[derive(Event, Copy, Clone, PartialEq, Eq, Debug)] +pub struct RequestRespawnEvent { + pub client: Entity, +} + +#[derive(Event, Copy, Clone, PartialEq, Eq, Debug)] +pub struct RequestStatsEvent { + pub client: Entity, +} + +fn handle_status( + mut packets: EventReader, + mut respawn_events: EventWriter, + mut request_stats_events: EventWriter, +) { + for packet in packets.read() { + if let Some(pkt) = packet.decode::() { + match pkt { + ClientStatusC2s::PerformRespawn => respawn_events.send(RequestRespawnEvent { + client: packet.client, + }), + ClientStatusC2s::RequestStats => request_stats_events.send(RequestStatsEvent { + client: packet.client, + }), + } + } + } +} diff --git a/vendor/valence/crates/valence_server/src/status_effect.rs b/vendor/valence/crates/valence_server/src/status_effect.rs new file mode 100644 index 00000000..c1de795f --- /dev/null +++ b/vendor/valence/crates/valence_server/src/status_effect.rs @@ -0,0 +1,194 @@ +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use bevy_ecs::query::WorldQuery; +use bevy_ecs::system::SystemState; +use valence_entity::active_status_effects::{ActiveStatusEffect, ActiveStatusEffects}; +use valence_entity::entity::Flags; +use valence_entity::living::{PotionSwirlsAmbient, PotionSwirlsColor}; +use valence_protocol::packets::play::{ + entity_status_effect_s2c, EntityStatusEffectS2c, RemoveEntityStatusEffectS2c, +}; +use valence_protocol::status_effects::StatusEffect; +use valence_protocol::{VarInt, WritePacket}; + +use crate::client::Client; +use crate::EventLoopPostUpdate; + +/// Event for when a status effect is added to an entity or the amplifier or +/// duration of an existing status effect is changed. +#[derive(Event, Clone, PartialEq, Eq, Debug)] +pub struct StatusEffectAdded { + pub entity: Entity, + pub status_effect: StatusEffect, +} + +/// Event for when a status effect is removed from an entity. +#[derive(Event, Clone, PartialEq, Eq, Debug)] +pub struct StatusEffectRemoved { + pub entity: Entity, + pub status_effect: ActiveStatusEffect, +} + +pub struct StatusEffectPlugin; + +impl Plugin for StatusEffectPlugin { + fn build(&self, app: &mut App) { + app.add_event::() + .add_event::() + .add_systems( + EventLoopPostUpdate, + ( + add_status_effects, + update_active_status_effects, + add_status_effects, + ), + ); + } +} + +fn update_active_status_effects( + world: &mut World, + state: &mut SystemState>, +) { + let mut query = state.get_mut(world); + for mut active_status_effects in query.iter_mut() { + active_status_effects.increment_active_ticks(); + } +} + +fn create_packet(effect: &ActiveStatusEffect) -> EntityStatusEffectS2c { + EntityStatusEffectS2c { + entity_id: VarInt(0), // We reserve ID 0 for clients. + effect_id: VarInt(effect.status_effect().to_raw() as i32), + amplifier: effect.amplifier(), + duration: VarInt(effect.remaining_duration().unwrap_or(-1)), + flags: entity_status_effect_s2c::Flags::new() + .with_is_ambient(effect.ambient()) + .with_show_particles(effect.show_particles()) + .with_show_icon(effect.show_icon()), + factor_codec: None, + } +} + +#[derive(WorldQuery)] +#[world_query(mutable)] +struct StatusEffectQuery { + entity: Entity, + active_effects: &'static mut ActiveStatusEffects, + client: Option<&'static mut Client>, + entity_flags: Option<&'static mut Flags>, + swirl_color: Option<&'static mut PotionSwirlsColor>, + swirl_ambient: Option<&'static mut PotionSwirlsAmbient>, +} + +fn add_status_effects( + mut query: Query, + mut add_events: EventWriter, + mut remove_events: EventWriter, +) { + for mut query in query.iter_mut() { + let updated = query.active_effects.apply_changes(); + + if updated.is_empty() { + continue; + } + + set_swirl( + &query.active_effects, + &mut query.swirl_color, + &mut query.swirl_ambient, + ); + + for (status_effect, prev) in updated { + if query.active_effects.has_effect(status_effect) { + add_events.send(StatusEffectAdded { + entity: query.entity, + status_effect, + }); + } else if let Some(prev) = prev { + remove_events.send(StatusEffectRemoved { + entity: query.entity, + status_effect: prev, + }); + } else { + // this should never happen + panic!("status effect was removed but was never added"); + } + + update_status_effect(&mut query, status_effect); + } + } +} + +fn update_status_effect(query: &mut StatusEffectQueryItem, status_effect: StatusEffect) { + let current_effect = query.active_effects.get_current_effect(status_effect); + + if let Some(ref mut client) = query.client { + if let Some(updated_effect) = current_effect { + client.write_packet(&create_packet(updated_effect)); + } else { + client.write_packet(&RemoveEntityStatusEffectS2c { + entity_id: VarInt(0), + effect_id: VarInt(status_effect.to_raw() as i32), + }); + } + } +} + +fn set_swirl( + active_status_effects: &ActiveStatusEffects, + swirl_color: &mut Option>, + swirl_ambient: &mut Option>, +) { + if let Some(ref mut swirl_ambient) = swirl_ambient { + swirl_ambient.0 = active_status_effects + .get_current_effects() + .iter() + .any(|effect| effect.ambient()); + } + + if let Some(ref mut swirl_color) = swirl_color { + swirl_color.0 = get_color(active_status_effects); + } +} + +/// Used to set the color of the swirls in the potion effect. +/// +/// Equivalent to net.minecraft.potion.PotionUtil#getColor +fn get_color(effects: &ActiveStatusEffects) -> i32 { + if effects.no_effects() { + // vanilla mc seems to return 0x385dc6 if there are no effects + // dunno why + // imma just say to return 0 to remove the swirls + return 0; + } + + let effects = effects.get_current_effects(); + let mut f = 0.0; + let mut g = 0.0; + let mut h = 0.0; + let mut j = 0.0; + + for status_effect_instance in effects { + if !status_effect_instance.show_particles() { + continue; + } + + let k = status_effect_instance.status_effect().color(); + let l = (status_effect_instance.amplifier() + 1) as f32; + f += (l * ((k >> 16) & 0xff) as f32) / 255.0; + g += (l * ((k >> 8) & 0xff) as f32) / 255.0; + h += (l * ((k) & 0xff) as f32) / 255.0; + j += l; + } + + if j == 0.0 { + return 0; + } + + f = f / j * 255.0; + g = g / j * 255.0; + h = h / j * 255.0; + + ((f as i32) << 16) | ((g as i32) << 8) | (h as i32) +} diff --git a/vendor/valence/crates/valence_server/src/teleport.rs b/vendor/valence/crates/valence_server/src/teleport.rs new file mode 100644 index 00000000..7f42bd39 --- /dev/null +++ b/vendor/valence/crates/valence_server/src/teleport.rs @@ -0,0 +1,139 @@ +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use tracing::warn; +use valence_entity::{Look, Position}; +use valence_math::DVec3; +use valence_protocol::packets::play::player_position_look_s2c::PlayerPositionLookFlags; +use valence_protocol::packets::play::{PlayerPositionLookS2c, TeleportConfirmC2s}; +use valence_protocol::WritePacket; + +use crate::client::{update_view_and_layers, Client, UpdateClientsSet}; +use crate::event_loop::{EventLoopPreUpdate, PacketEvent}; +use crate::spawn::update_respawn_position; + +pub struct TeleportPlugin; + +impl Plugin for TeleportPlugin { + fn build(&self, app: &mut App) { + app.add_systems( + PostUpdate, + teleport + .after(update_view_and_layers) + .before(update_respawn_position) + .in_set(UpdateClientsSet), + ) + .add_systems(EventLoopPreUpdate, handle_teleport_confirmations); + } +} + +#[derive(Component, Debug)] +pub struct TeleportState { + /// Counts up as teleports are made. + teleport_id_counter: u32, + /// The number of pending client teleports that have yet to receive a + /// confirmation. Inbound client position packets should be ignored while + /// this is nonzero. + pending_teleports: u32, + pub(super) synced_pos: DVec3, + pub(super) synced_look: Look, +} + +impl TeleportState { + pub(super) fn new() -> Self { + Self { + teleport_id_counter: 0, + pending_teleports: 0, + // Set initial synced pos and look to NaN so a teleport always happens when first + // joining. + synced_pos: DVec3::NAN, + synced_look: Look { + yaw: f32::NAN, + pitch: f32::NAN, + }, + } + } + + pub fn teleport_id_counter(&self) -> u32 { + self.teleport_id_counter + } + + pub fn pending_teleports(&self) -> u32 { + self.pending_teleports + } +} + +/// Syncs the client's position and look with the server. +/// +/// This should happen after chunks are loaded so the client doesn't fall though +/// the floor. +#[allow(clippy::type_complexity)] +fn teleport( + mut clients: Query< + (&mut Client, &mut TeleportState, &Position, &Look), + Or<(Changed, Changed)>, + >, +) { + for (mut client, mut state, pos, look) in &mut clients { + let changed_pos = pos.0 != state.synced_pos; + let changed_yaw = look.yaw != state.synced_look.yaw; + let changed_pitch = look.pitch != state.synced_look.pitch; + + if changed_pos || changed_yaw || changed_pitch { + state.synced_pos = pos.0; + state.synced_look = *look; + + let flags = PlayerPositionLookFlags::new() + .with_x(!changed_pos) + .with_y(!changed_pos) + .with_z(!changed_pos) + .with_y_rot(!changed_yaw) + .with_x_rot(!changed_pitch); + + client.write_packet(&PlayerPositionLookS2c { + position: if changed_pos { pos.0 } else { DVec3::ZERO }, + yaw: if changed_yaw { look.yaw } else { 0.0 }, + pitch: if changed_pitch { look.pitch } else { 0.0 }, + flags, + teleport_id: (state.teleport_id_counter as i32).into(), + }); + + state.pending_teleports = state.pending_teleports.wrapping_add(1); + state.teleport_id_counter = state.teleport_id_counter.wrapping_add(1); + } + } +} + +fn handle_teleport_confirmations( + mut packets: EventReader, + mut clients: Query<&mut TeleportState>, + mut commands: Commands, +) { + for packet in packets.read() { + if let Some(pkt) = packet.decode::() { + if let Ok(mut state) = clients.get_mut(packet.client) { + if state.pending_teleports == 0 { + warn!( + "unexpected teleport confirmation from client {:?}", + packet.client + ); + commands.entity(packet.client).remove::(); + } + + let got = pkt.teleport_id.0 as u32; + let expected = state + .teleport_id_counter + .wrapping_sub(state.pending_teleports); + + if got == expected { + state.pending_teleports -= 1; + } else { + warn!( + "unexpected teleport ID for client {:?} (expected {expected}, got {got}", + packet.client + ); + commands.entity(packet.client).remove::(); + } + } + } + } +} diff --git a/vendor/valence/crates/valence_server/src/title.rs b/vendor/valence/crates/valence_server/src/title.rs new file mode 100644 index 00000000..6f0613f9 --- /dev/null +++ b/vendor/valence/crates/valence_server/src/title.rs @@ -0,0 +1,64 @@ +use valence_protocol::encode::WritePacket; +use valence_protocol::packets::play::{ + ClearTitleS2c, OverlayMessageS2c, SubtitleS2c, TitleFadeS2c, TitleS2c, +}; +use valence_protocol::text::IntoText; + +pub trait SetTitle { + /// Displays a title to a client. + /// + /// A title is a large piece of text displayed in the center of the screen + /// which may also include a subtitle underneath it. The title can be + /// configured to fade in and out using + /// [`set_title_times`](Self::set_title_times). + fn set_title<'a>(&mut self, text: impl IntoText<'a>); + + fn set_subtitle<'a>(&mut self, text: impl IntoText<'a>); + + fn set_action_bar<'a>(&mut self, text: impl IntoText<'a>); + + /// - `fade_in`: Ticks to spend fading in. + /// - `stay`: Ticks to keep the title displayed. + /// - `fade_out`: Ticks to spend fading out. + fn set_title_times(&mut self, fade_in: i32, stay: i32, fade_out: i32); + + fn clear_title(&mut self); + + fn reset_title(&mut self); +} + +impl SetTitle for T { + fn set_title<'a>(&mut self, text: impl IntoText<'a>) { + self.write_packet(&TitleS2c { + title_text: text.into_cow_text(), + }); + } + + fn set_subtitle<'a>(&mut self, text: impl IntoText<'a>) { + self.write_packet(&SubtitleS2c { + subtitle_text: text.into_cow_text(), + }); + } + + fn set_action_bar<'a>(&mut self, text: impl IntoText<'a>) { + self.write_packet(&OverlayMessageS2c { + action_bar_text: text.into_cow_text(), + }); + } + + fn set_title_times(&mut self, fade_in: i32, stay: i32, fade_out: i32) { + self.write_packet(&TitleFadeS2c { + fade_in, + stay, + fade_out, + }); + } + + fn clear_title(&mut self) { + self.write_packet(&ClearTitleS2c { reset: false }); + } + + fn reset_title(&mut self) { + self.write_packet(&ClearTitleS2c { reset: true }); + } +} diff --git a/vendor/valence/crates/valence_server_common/Cargo.toml b/vendor/valence/crates/valence_server_common/Cargo.toml new file mode 100644 index 00000000..12d62c51 --- /dev/null +++ b/vendor/valence/crates/valence_server_common/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "valence_server_common" +description = "Common code for the valence_server family of crates" +readme = "README.md" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[dependencies] +bevy_ecs.workspace = true +bevy_app.workspace = true +derive_more.workspace = true +uuid.workspace = true +rand.workspace = true +valence_protocol.workspace = true \ No newline at end of file diff --git a/vendor/valence/crates/valence_server_common/README.md b/vendor/valence/crates/valence_server_common/README.md new file mode 100644 index 00000000..da10c50c --- /dev/null +++ b/vendor/valence/crates/valence_server_common/README.md @@ -0,0 +1,3 @@ +# valence_server_common + +Contains some miscellaneous types for the `valence_server` family of crates, like `valence_entity`. `valence_registry`, and `valence_server`. diff --git a/vendor/valence/crates/valence_server_common/src/despawn.rs b/vendor/valence/crates/valence_server_common/src/despawn.rs new file mode 100644 index 00000000..17a9c22b --- /dev/null +++ b/vendor/valence/crates/valence_server_common/src/despawn.rs @@ -0,0 +1,26 @@ +use bevy_ecs::prelude::*; + +/// A marker [`Component`] for entities that should be despawned at the end of +/// the tick. +/// +/// In Valence, some entities such as Minecraft entities must not be removed +/// from the [`World`] directly. Valence needs an opportunity to perform +/// deinitialization work while the entity's components still exist. +/// +/// To resolve this problem, you must give the entities you wish to despawn the +/// `Despawned` component. At the end of the tick, Valence will despawn all +/// entities with this component for you. +/// +/// The `Despawned` component can be used on entities that Valence does not know +/// about. The entity will be despawned regardless. +#[derive(Component, Copy, Clone, Default, PartialEq, Eq, Debug)] +pub struct Despawned; + +pub(super) fn despawn_marked_entities( + entities: Query>, + mut commands: Commands, +) { + for entity in &entities { + commands.entity(entity).despawn(); + } +} diff --git a/vendor/valence/crates/valence_server_common/src/lib.rs b/vendor/valence/crates/valence_server_common/src/lib.rs new file mode 100644 index 00000000..3ca47da9 --- /dev/null +++ b/vendor/valence/crates/valence_server_common/src/lib.rs @@ -0,0 +1,134 @@ +#![doc = include_str!("../README.md")] +#![deny( + rustdoc::broken_intra_doc_links, + rustdoc::private_intra_doc_links, + rustdoc::missing_crate_level_docs, + rustdoc::invalid_codeblock_attributes, + rustdoc::invalid_rust_codeblocks, + rustdoc::bare_urls, + rustdoc::invalid_html_tags +)] +#![warn( + trivial_casts, + trivial_numeric_casts, + unused_lifetimes, + unused_import_braces, + unreachable_pub, + clippy::dbg_macro +)] +#![allow(clippy::unusual_byte_groupings)] + +mod despawn; +mod uuid; + +use std::num::NonZeroU32; +use std::time::Duration; + +use bevy_app::prelude::*; +use bevy_app::ScheduleRunnerPlugin; +use bevy_ecs::prelude::*; +pub use despawn::*; +use valence_protocol::CompressionThreshold; + +pub use crate::uuid::*; + +/// Minecraft's standard ticks per second (TPS). +pub const DEFAULT_TPS: NonZeroU32 = match NonZeroU32::new(20) { + Some(n) => n, + None => unreachable!(), +}; + +#[derive(Clone, Resource)] +pub struct ServerSettings { + /// The target ticks per second (TPS) of the server. This is the number of + /// game updates that should occur in one second. + /// + /// On each game update (tick), the server is expected to update game logic + /// and respond to packets from clients. Once this is complete, the server + /// will sleep for any remaining time until a full tick duration has passed. + /// + /// Note that the official Minecraft client only processes packets at 20hz, + /// so there is little benefit to a tick rate higher than the default 20. + /// + /// # Default Value + /// + /// [`DEFAULT_TPS`] + pub tick_rate: NonZeroU32, + /// The compression threshold to use for compressing packets. For a + /// compression threshold of `Some(N)`, packets with encoded lengths >= `N` + /// are compressed while all others are not. `None` disables compression + /// completely. + /// + /// If the server is used behind a proxy on the same machine, you will + /// likely want to disable compression. + /// + /// # Default Value + /// + /// Compression is enabled with an unspecified value. This value may + /// change in future versions. + pub compression_threshold: CompressionThreshold, +} + +impl Default for ServerSettings { + fn default() -> Self { + Self { + tick_rate: DEFAULT_TPS, + compression_threshold: CompressionThreshold(256), + } + } +} + +pub struct ServerPlugin; + +impl Plugin for ServerPlugin { + fn build(&self, app: &mut App) { + let settings = app + .world + .get_resource_or_insert_with(ServerSettings::default) + .clone(); + + app.insert_resource(Server { + current_tick: 0, + threshold: settings.compression_threshold, + tick_rate: settings.tick_rate, + }); + + let tick_period = Duration::from_secs_f64((settings.tick_rate.get() as f64).recip()); + + // Make the app loop forever at the configured TPS. + app.add_plugins(ScheduleRunnerPlugin::run_loop(tick_period)); + + fn increment_tick_counter(mut server: ResMut) { + server.current_tick += 1; + } + + app.add_systems(Last, (increment_tick_counter, despawn_marked_entities)); + } +} + +/// Contains global server state accessible as a [`Resource`]. +#[derive(Resource)] +pub struct Server { + /// Incremented on every tick. + current_tick: i64, + threshold: CompressionThreshold, + tick_rate: NonZeroU32, +} + +impl Server { + /// Returns the number of ticks that have elapsed since the server began. + pub fn current_tick(&self) -> i64 { + self.current_tick + } + + /// Returns the server's [compression + /// threshold](ServerSettings::compression_threshold). + pub fn compression_threshold(&self) -> CompressionThreshold { + self.threshold + } + + // Returns the server's [tick rate](ServerPlugin::tick_rate). + pub fn tick_rate(&self) -> NonZeroU32 { + self.tick_rate + } +} diff --git a/vendor/valence/crates/valence_server_common/src/uuid.rs b/vendor/valence/crates/valence_server_common/src/uuid.rs new file mode 100644 index 00000000..ea24169f --- /dev/null +++ b/vendor/valence/crates/valence_server_common/src/uuid.rs @@ -0,0 +1,18 @@ +use bevy_ecs::prelude::*; +use derive_more::Deref; +use uuid::Uuid; + +/// The universally unique identifier of an entity. Component wrapper for a +/// [`Uuid`]. +/// +/// This component is expected to remain _unique_ and _constant_ during the +/// lifetime of the entity. The [`Default`] impl generates a new random UUID. +#[derive(Component, Copy, Clone, PartialEq, Eq, Debug, PartialOrd, Ord, Hash, Deref)] +pub struct UniqueId(pub Uuid); + +/// Generates a new random UUID. +impl Default for UniqueId { + fn default() -> Self { + Self(Uuid::from_bytes(rand::random())) + } +} diff --git a/vendor/valence/crates/valence_spatial/Cargo.toml b/vendor/valence/crates/valence_spatial/Cargo.toml new file mode 100644 index 00000000..1505d432 --- /dev/null +++ b/vendor/valence/crates/valence_spatial/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "valence_spatial" +description = "Spatial partitioning for entities in Valence" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[dependencies] +approx.workspace = true +rayon.workspace = true +vek = "0.16.1" # TODO: remove this. \ No newline at end of file diff --git a/vendor/valence/crates/valence_spatial/README.md b/vendor/valence/crates/valence_spatial/README.md new file mode 100644 index 00000000..b6157ac0 --- /dev/null +++ b/vendor/valence/crates/valence_spatial/README.md @@ -0,0 +1,3 @@ +# valence_spatial + +An implementation of a [bounding volume hierarchy](https://en.wikipedia.org/wiki/Bounding_volume_hierarchy) (BVH) for fast spatial queries. diff --git a/vendor/valence/crates/valence_spatial/src/bvh.rs b/vendor/valence/crates/valence_spatial/src/bvh.rs new file mode 100644 index 00000000..66926209 --- /dev/null +++ b/vendor/valence/crates/valence_spatial/src/bvh.rs @@ -0,0 +1,429 @@ +use std::iter::FusedIterator; +use std::mem; + +use approx::abs_diff_eq; +use rayon::iter::{ + IndexedParallelIterator, IntoParallelRefIterator, IntoParallelRefMutIterator, ParallelIterator, +}; +use vek::{Aabb, Vec3}; + +use crate::{ray_box_intersect, Bounded3D, RaycastHit, SpatialIndex}; + +#[derive(Clone, Debug)] +pub struct Bvh { + internal_nodes: Vec, + leaf_nodes: Vec, + root: NodeIdx, +} + +#[derive(Clone, Debug)] +struct InternalNode { + bb: Aabb, + left: NodeIdx, + right: NodeIdx, +} + +// TODO: we could use usize here to store more elements. +type NodeIdx = u32; + +impl Bvh { + pub fn new() -> Self { + Self { + internal_nodes: vec![], + leaf_nodes: vec![], + root: NodeIdx::MAX, + } + } + + pub fn rebuild(&mut self, leaves: impl IntoIterator) { + self.internal_nodes.clear(); + self.leaf_nodes.clear(); + + self.leaf_nodes.extend(leaves); + + let leaf_count = self.leaf_nodes.len(); + + if leaf_count == 0 { + return; + } + + self.internal_nodes.reserve_exact(leaf_count - 1); + self.internal_nodes.resize( + leaf_count - 1, + InternalNode { + bb: Aabb::default(), + left: NodeIdx::MAX, + right: NodeIdx::MAX, + }, + ); + + if NodeIdx::try_from(leaf_count) + .ok() + .and_then(|count| count.checked_add(count - 1)) + .is_none() + { + panic!("too many elements in BVH"); + } + + let id = self.leaf_nodes[0].aabb(); + let scene_bounds = self + .leaf_nodes + .par_iter() + .map(|l| l.aabb()) + .reduce(|| id, Aabb::union); + + self.root = rebuild_rec( + 0, + scene_bounds, + &mut self.internal_nodes, + &mut self.leaf_nodes, + leaf_count as NodeIdx, + ) + .0; + + debug_assert_eq!(self.internal_nodes.len(), self.leaf_nodes.len() - 1); + } + + pub fn traverse(&self) -> Option> { + if !self.leaf_nodes.is_empty() { + Some(Node::from_idx(self, self.root)) + } else { + None + } + } + + pub fn iter(&self) -> impl ExactSizeIterator + FusedIterator + Clone + '_ { + self.leaf_nodes.iter() + } + + pub fn iter_mut(&mut self) -> impl ExactSizeIterator + FusedIterator + '_ { + self.leaf_nodes.iter_mut() + } + + pub fn par_iter(&self) -> impl IndexedParallelIterator + Clone + '_ { + self.leaf_nodes.par_iter() + } + + pub fn par_iter_mut(&mut self) -> impl IndexedParallelIterator + '_ { + self.leaf_nodes.par_iter_mut() + } +} + +impl Default for Bvh { + fn default() -> Self { + Self::new() + } +} + +#[derive(Debug)] +pub enum Node<'a, T> { + Internal(Internal<'a, T>), + Leaf(&'a T), +} + +impl<'a, T> Node<'a, T> { + fn from_idx(bvh: &'a Bvh, idx: NodeIdx) -> Self { + if idx < bvh.internal_nodes.len() as NodeIdx { + Self::Internal(Internal { bvh, idx }) + } else { + Self::Leaf(&bvh.leaf_nodes[(idx - bvh.internal_nodes.len() as NodeIdx) as usize]) + } + } +} + +impl Bounded3D for Node<'_, T> { + fn aabb(&self) -> Aabb { + match self { + Node::Internal(int) => int.aabb(), + Node::Leaf(t) => t.aabb(), + } + } +} + +impl Clone for Node<'_, T> { + fn clone(&self) -> Self { + *self + } +} + +impl Copy for Node<'_, T> {} + +#[derive(Debug)] +pub struct Internal<'a, T> { + bvh: &'a Bvh, + idx: NodeIdx, +} + +impl<'a, T> Internal<'a, T> { + pub fn split(self) -> (Aabb, Node<'a, T>, Node<'a, T>) { + let internal = &self.bvh.internal_nodes[self.idx as usize]; + + let bb = internal.bb; + let left = Node::from_idx(self.bvh, internal.left); + let right = Node::from_idx(self.bvh, internal.right); + + (bb, left, right) + } +} + +impl Bounded3D for Internal<'_, T> { + fn aabb(&self) -> Aabb { + self.bvh.internal_nodes[self.idx as usize].bb + } +} + +impl Clone for Internal<'_, T> { + fn clone(&self) -> Self { + *self + } +} + +impl Copy for Internal<'_, T> {} + +fn rebuild_rec( + idx: NodeIdx, + mut bounds: Aabb, + internal_nodes: &mut [InternalNode], + leaf_nodes: &mut [T], + total_leaf_count: NodeIdx, +) -> (NodeIdx, Aabb) { + debug_assert_eq!(leaf_nodes.len() - 1, internal_nodes.len()); + + if leaf_nodes.len() == 1 { + // Leaf node + return (total_leaf_count - 1 + idx, leaf_nodes[0].aabb()); + } + + loop { + debug_assert!(bounds.is_valid()); + let dims = bounds.max - bounds.min; + + let (mut split, bounds_left, bounds_right) = if dims.x >= dims.y && dims.x >= dims.z { + let mid = middle(bounds.min.x, bounds.max.x); + let [bounds_left, bounds_right] = bounds.split_at_x(mid); + + let p = partition(leaf_nodes, |l| { + middle(l.aabb().min.x, l.aabb().max.x) <= mid + }); + + (p, bounds_left, bounds_right) + } else if dims.y >= dims.x && dims.y >= dims.z { + let mid = middle(bounds.min.y, bounds.max.y); + let [bounds_left, bounds_right] = bounds.split_at_y(mid); + + let p = partition(leaf_nodes, |l| { + middle(l.aabb().min.y, l.aabb().max.y) <= mid + }); + + (p, bounds_left, bounds_right) + } else { + let mid = middle(bounds.min.z, bounds.max.z); + let [bounds_left, bounds_right] = bounds.split_at_z(mid); + + let p = partition(leaf_nodes, |l| { + middle(l.aabb().min.z, l.aabb().max.z) <= mid + }); + + (p, bounds_left, bounds_right) + }; + + // Check if one of the halves is empty. (We can't have empty nodes) + // Also take care to handle the edge case of overlapping points. + if split == 0 { + if abs_diff_eq!( + bounds_right.min, + bounds_right.max, + epsilon = f64::EPSILON * 100.0 + ) { + split += 1; + } else { + bounds = bounds_right; + continue; + } + } else if split == leaf_nodes.len() { + if abs_diff_eq!( + bounds_left.min, + bounds_left.max, + epsilon = f64::EPSILON * 100.0 + ) { + split -= 1; + } else { + bounds = bounds_left; + continue; + } + } + + let (leaves_left, leaves_right) = leaf_nodes.split_at_mut(split); + + let (internal_left, internal_right) = internal_nodes.split_at_mut(split); + let (internal, internal_left) = internal_left.split_last_mut().unwrap(); + + let ((left, bounds_left), (right, bounds_right)) = rayon::join( + || { + rebuild_rec( + idx, + bounds_left, + internal_left, + leaves_left, + total_leaf_count, + ) + }, + || { + rebuild_rec( + idx + split as NodeIdx, + bounds_right, + internal_right, + leaves_right, + total_leaf_count, + ) + }, + ); + + internal.bb = bounds_left.union(bounds_right); + internal.left = left; + internal.right = right; + + break (idx + split as NodeIdx - 1, internal.bb); + } +} + +fn partition(s: &mut [T], mut pred: impl FnMut(&T) -> bool) -> usize { + let mut it = s.iter_mut(); + let mut true_count = 0; + + while let Some(head) = it.find(|x| { + if pred(x) { + true_count += 1; + false + } else { + true + } + }) { + if let Some(tail) = it.rfind(|x| pred(x)) { + mem::swap(head, tail); + true_count += 1; + } else { + break; + } + } + true_count +} + +fn middle(a: f64, b: f64) -> f64 { + (a + b) / 2.0 +} + +impl SpatialIndex for Bvh { + type Object = O; + + fn query(&self, mut collides: C, mut f: F) -> Option + where + C: FnMut(Aabb) -> bool, + F: FnMut(&O) -> Option, + { + fn query_rec(node: Node, collides: &mut C, f: &mut F) -> Option + where + C: FnMut(Aabb) -> bool, + F: FnMut(&O) -> Option, + O: Bounded3D, + { + match node { + Node::Internal(int) => { + let (bb, left, right) = int.split(); + + if collides(bb) { + query_rec(left, collides, f).or_else(|| query_rec(right, collides, f)) + } else { + None + } + } + Node::Leaf(leaf) => { + if collides(leaf.aabb()) { + f(leaf) + } else { + None + } + } + } + } + + query_rec(self.traverse()?, &mut collides, &mut f) + } + + fn raycast(&self, origin: Vec3, direction: Vec3, mut f: F) -> Option> + where + F: FnMut(RaycastHit) -> bool, + { + fn raycast_rec<'a, O: Bounded3D>( + node: Node<'a, O>, + hit: &mut Option>, + near: f64, + far: f64, + origin: Vec3, + direction: Vec3, + f: &mut impl FnMut(RaycastHit) -> bool, + ) { + if let Some(hit) = hit { + if hit.near <= near { + return; + } + } + + match node { + Node::Internal(int) => { + let (_, left, right) = int.split(); + + let int_left = ray_box_intersect(origin, direction, left.aabb()); + let int_right = ray_box_intersect(origin, direction, right.aabb()); + + match (int_left, int_right) { + (Some((near_left, far_left)), Some((near_right, far_right))) => { + // Explore closest subtree first. + if near_left < near_right { + raycast_rec(left, hit, near_left, far_left, origin, direction, f); + raycast_rec( + right, hit, near_right, far_right, origin, direction, f, + ); + } else { + raycast_rec( + right, hit, near_right, far_right, origin, direction, f, + ); + raycast_rec(left, hit, near_left, far_left, origin, direction, f); + } + } + (Some((near, far)), None) => { + raycast_rec(left, hit, near, far, origin, direction, f) + } + (None, Some((near, far))) => { + raycast_rec(right, hit, near, far, origin, direction, f) + } + (None, None) => {} + } + } + Node::Leaf(leaf) => { + let this_hit = RaycastHit { + object: leaf, + near, + far, + }; + + if f(this_hit) { + *hit = Some(this_hit); + } + } + } + } + + debug_assert!( + direction.is_normalized(), + "the ray direction must be normalized" + ); + + let root = self.traverse()?; + let (near, far) = ray_box_intersect(origin, direction, root.aabb())?; + + let mut hit = None; + raycast_rec(root, &mut hit, near, far, origin, direction, &mut f); + hit + } +} diff --git a/vendor/valence/crates/valence_spatial/src/lib.rs b/vendor/valence/crates/valence_spatial/src/lib.rs new file mode 100644 index 00000000..df9d7a55 --- /dev/null +++ b/vendor/valence/crates/valence_spatial/src/lib.rs @@ -0,0 +1,193 @@ +#![doc = include_str!("../README.md")] +#![deny( + rustdoc::broken_intra_doc_links, + rustdoc::private_intra_doc_links, + rustdoc::missing_crate_level_docs, + rustdoc::invalid_codeblock_attributes, + rustdoc::invalid_rust_codeblocks, + rustdoc::bare_urls, + rustdoc::invalid_html_tags +)] +#![warn( + trivial_casts, + trivial_numeric_casts, + unused_lifetimes, + unused_import_braces, + unreachable_pub, + clippy::dbg_macro +)] + +use vek::{Aabb, Vec3}; + +pub mod bvh; + +pub trait SpatialIndex { + type Object: Bounded3D; + + /// Invokes `f` with every object in the spatial index considered + /// colliding according to `collides` in an arbitrary order. + /// + /// `collides` takes an AABB and returns whether or not a collision + /// occurred with the given AABB. + /// + /// `f` is called with every object considered colliding. If `f` returns + /// with `Some(x)`, then `query` exits early with `Some(x)`. If `f` never + /// returns with `Some`, then query returns `None`. + fn query(&self, collides: C, f: F) -> Option + where + C: FnMut(Aabb) -> bool, + F: FnMut(&Self::Object) -> Option; + + /// Casts a ray defined by `origin` and `direction` through object AABBs + /// and returns the closest intersection for which `f` returns `true`. + /// + /// `f` is a predicate used to filter intersections. For instance, if a ray + /// is shot from a player's eye position, you probably don't want the + /// ray to intersect with the player's own hitbox. + /// + /// If no intersections are found or if `f` never returns `true` then `None` + /// is returned. Additionally, the given ray direction must be + /// normalized. + fn raycast( + &self, + origin: Vec3, + direction: Vec3, + f: F, + ) -> Option> + where + F: FnMut(RaycastHit) -> bool; +} + +pub trait Bounded3D { + fn aabb(&self) -> Aabb; +} + +/// Represents an intersection between a ray and an entity's axis-aligned +/// bounding box (hitbox). +#[derive(PartialEq, Eq, Debug)] +pub struct RaycastHit<'a, O, N = f64> { + /// The object that was hit by the ray. + pub object: &'a O, + /// The distance from the ray origin to the closest intersection point. + /// If the origin of the ray is inside the bounding box, then this will be + /// zero. + pub near: N, + /// The distance from the ray origin to the second intersection point. This + /// represents the point at which the ray exits the bounding box. + pub far: N, +} + +impl Clone for RaycastHit<'_, O, N> { + fn clone(&self) -> Self { + Self { + object: self.object, + near: self.near.clone(), + far: self.far.clone(), + } + } +} + +impl Copy for RaycastHit<'_, O, N> {} + +impl Bounded3D for Aabb { + fn aabb(&self) -> Aabb { + self.clone() + } +} + +#[derive(Copy, Clone, PartialEq, Eq, Hash, Default, Debug)] +pub struct WithAabb { + pub object: O, + pub aabb: Aabb, +} + +impl WithAabb { + pub fn new(object: O, aabb: Aabb) -> Self { + Self { object, aabb } + } +} + +impl Bounded3D for WithAabb { + fn aabb(&self) -> Aabb { + self.aabb.clone() + } +} + +/// Calculates the intersection between an axis-aligned bounding box and a ray +/// defined by its origin `ro` and direction `rd`. +/// +/// If an intersection occurs, `Some((near, far))` is returned. `near` and `far` +/// are the distance from the origin to the closest and furthest intersection +/// points respectively. If the intersection occurs inside the bounding box, +/// then `near` is zero. +pub fn ray_box_intersect(ro: Vec3, rd: Vec3, bb: Aabb) -> Option<(f64, f64)> { + let mut near = -f64::INFINITY; + let mut far = f64::INFINITY; + + for i in 0..3 { + // Rust's definition of min and max properly handle the NaNs that these + // computations might produce. + let t0 = (bb.min[i] - ro[i]) / rd[i]; + let t1 = (bb.max[i] - ro[i]) / rd[i]; + + near = near.max(t0.min(t1)); + far = far.min(t0.max(t1)); + } + + if near <= far && far >= 0.0 { + Some((near.max(0.0), far)) + } else { + None + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn ray_box_edge_cases() { + let bb = Aabb { + min: Vec3::new(0.0, 0.0, 0.0), + max: Vec3::new(1.0, 1.0, 1.0), + }; + + let ros = [ + // On a corner + Vec3::new(0.0, 0.0, 0.0), + // Outside + Vec3::new(-0.5, 0.5, -0.5), + // In the center + Vec3::new(0.5, 0.5, 0.5), + // On an edge + Vec3::new(0.0, 0.5, 0.0), + // On a face + Vec3::new(0.0, 0.5, 0.5), + // Outside slabs + Vec3::new(-2.0, -2.0, -2.0), + ]; + + let rds = [ + Vec3::new(1.0, 0.0, 0.0), + Vec3::new(-1.0, 0.0, 0.0), + Vec3::new(0.0, 1.0, 0.0), + Vec3::new(0.0, -1.0, 0.0), + Vec3::new(0.0, 0.0, 1.0), + Vec3::new(0.0, 0.0, -1.0), + ]; + + assert!(rds.iter().all(|d| d.is_normalized())); + + for ro in ros { + for rd in rds { + if let Some((near, far)) = ray_box_intersect(ro, rd, bb) { + assert!(near.is_finite()); + assert!(far.is_finite()); + assert!(near <= far); + assert!(near >= 0.0); + assert!(far >= 0.0); + } + } + } + } +} diff --git a/vendor/valence/crates/valence_text/Cargo.toml b/vendor/valence/crates/valence_text/Cargo.toml new file mode 100644 index 00000000..f79b9a9f --- /dev/null +++ b/vendor/valence/crates/valence_text/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "valence_text" +description = "Parsing and writing Minecraft's JSON text format" +readme = "README.md" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[dependencies] +serde = { workspace = true, features = ["derive"] } +serde_json.workspace = true +thiserror.workspace = true +uuid = { workspace = true, features = ["serde"] } +valence_ident.workspace = true +valence_nbt.workspace = true diff --git a/vendor/valence/crates/valence_text/README.md b/vendor/valence/crates/valence_text/README.md new file mode 100644 index 00000000..b3364ba2 --- /dev/null +++ b/vendor/valence/crates/valence_text/README.md @@ -0,0 +1,3 @@ +# valence_text + +A library for parsing and writing Minecraft's [JSON text format](https://minecraft.wiki/w/Raw_JSON_text_format) diff --git a/vendor/valence/crates/valence_text/src/color.rs b/vendor/valence/crates/valence_text/src/color.rs new file mode 100644 index 00000000..c0583158 --- /dev/null +++ b/vendor/valence/crates/valence_text/src/color.rs @@ -0,0 +1,368 @@ +//! [`Color`] and related data structures. + +use std::fmt; +use std::hash::Hash; + +use serde::de::Visitor; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use thiserror::Error; + +/// Text color +#[derive(Default, Debug, PartialOrd, Eq, Ord, Clone, Copy)] +pub enum Color { + /// The default color for the text will be used, which varies by context + /// (in some cases, it's white; in others, it's black; in still others, it + /// is a shade of gray that isn't normally used on text). + #[default] + Reset, + /// RGB Color + Rgb(RgbColor), + /// One of the 16 named Minecraft colors + Named(NamedColor), +} + +/// RGB Color +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] +pub struct RgbColor { + /// Red channel + pub r: u8, + /// Green channel + pub g: u8, + /// Blue channel + pub b: u8, +} + +/// Named Minecraft color +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] +pub enum NamedColor { + /// Hex digit: `0`, name: `black` + Black = 0, + /// Hex digit: `1`, name: `dark_blue` + DarkBlue, + /// Hex digit: `2`, name: `dark_green` + DarkGreen, + /// Hex digit: `3`, name: `dark_aqua` + DarkAqua, + /// Hex digit: `4`, name: `dark_red` + DarkRed, + /// Hex digit: `5`, name: `dark_purple` + DarkPurple, + /// Hex digit: `6`, name: `gold` + Gold, + /// Hex digit: `7`, name: `gray` + Gray, + /// Hex digit: `8`, name: `dark_gray` + DarkGray, + /// Hex digit: `9`, name: `blue` + Blue, + /// Hex digit: `a`, name: `green` + Green, + /// Hex digit: `b`, name: `aqua` + Aqua, + /// Hex digit: `c`, name: `red` + Red, + /// Hex digit: `d`, name: `light_purple` + LightPurple, + /// Hex digit: `e`, name: `yellow` + Yellow, + /// Hex digit: `f`, name: `white` + White, +} + +/// Color parsing error +#[derive(Debug, Error, PartialEq, PartialOrd, Clone, Copy, Hash, Eq, Ord)] +#[error("invalid color name or hex code")] +pub struct ColorError; + +impl Color { + pub const RESET: Self = Self::Reset; + pub const AQUA: Self = Self::Named(NamedColor::Aqua); + pub const BLACK: Self = Self::Named(NamedColor::Black); + pub const BLUE: Self = Self::Named(NamedColor::Blue); + pub const DARK_AQUA: Self = Self::Named(NamedColor::DarkAqua); + pub const DARK_BLUE: Self = Self::Named(NamedColor::DarkBlue); + pub const DARK_GRAY: Self = Self::Named(NamedColor::DarkGray); + pub const DARK_GREEN: Self = Self::Named(NamedColor::DarkGreen); + pub const DARK_PURPLE: Self = Self::Named(NamedColor::DarkPurple); + pub const DARK_RED: Self = Self::Named(NamedColor::DarkRed); + pub const GOLD: Self = Self::Named(NamedColor::Gold); + pub const GRAY: Self = Self::Named(NamedColor::Gray); + pub const GREEN: Self = Self::Named(NamedColor::Green); + pub const LIGHT_PURPLE: Self = Self::Named(NamedColor::LightPurple); + pub const RED: Self = Self::Named(NamedColor::Red); + pub const WHITE: Self = Self::Named(NamedColor::White); + pub const YELLOW: Self = Self::Named(NamedColor::Yellow); + + /// Constructs a new RGB color + pub const fn rgb(r: u8, g: u8, b: u8) -> Self { + Self::Rgb(RgbColor::new(r, g, b)) + } +} + +impl RgbColor { + /// Constructs a new color from red, green, and blue components. + pub const fn new(r: u8, g: u8, b: u8) -> Self { + Self { r, g, b } + } + /// Converts the RGB color to the closest [`NamedColor`] equivalent (lossy). + pub fn to_named_lossy(self) -> NamedColor { + // calculates the squared distance between 2 colors + fn squared_distance(c1: RgbColor, c2: RgbColor) -> i32 { + (c1.r as i32 - c2.r as i32).pow(2) + + (c1.g as i32 - c2.g as i32).pow(2) + + (c1.b as i32 - c2.b as i32).pow(2) + } + + [ + NamedColor::Aqua, + NamedColor::Black, + NamedColor::Blue, + NamedColor::DarkAqua, + NamedColor::DarkBlue, + NamedColor::DarkGray, + NamedColor::DarkGreen, + NamedColor::DarkPurple, + NamedColor::DarkRed, + NamedColor::Gold, + NamedColor::Gray, + NamedColor::Green, + NamedColor::LightPurple, + NamedColor::Red, + NamedColor::White, + NamedColor::Yellow, + ] + .into_iter() + .min_by_key(|&named| squared_distance(named.into(), self)) + .unwrap() + } +} + +impl NamedColor { + /// Returns the corresponding hex digit of the color. + pub const fn hex_digit(self) -> char { + b"0123456789abcdef"[self as usize] as char + } + /// Returns the identifier of the color. + pub const fn name(self) -> &'static str { + [ + "black", + "dark_blue", + "dark_green", + "dark_aqua", + "dark_red", + "dark_purple", + "gold", + "gray", + "dark_gray", + "blue", + "green", + "aqua", + "red", + "light_purple", + "yellow", + "white", + ][self as usize] + } +} + +impl PartialEq for Color { + fn eq(&self, other: &Self) -> bool { + match (*self, *other) { + (Self::Reset, Self::Reset) => true, + (Self::Rgb(rgb1), Self::Rgb(rgb2)) => rgb1 == rgb2, + (Self::Named(normal1), Self::Named(normal2)) => normal1 == normal2, + (Self::Rgb(rgb), Self::Named(normal)) | (Self::Named(normal), Self::Rgb(rgb)) => { + rgb == RgbColor::from(normal) + } + (Self::Reset, _) | (_, Self::Reset) => false, + } + } +} + +impl Hash for Color { + fn hash(&self, state: &mut H) { + match self { + Self::Reset => state.write_u8(0), + Self::Rgb(rgb) => { + state.write_u8(1); + rgb.hash(state); + } + Self::Named(normal) => { + state.write_u8(1); + RgbColor::from(*normal).hash(state); + } + } + } +} + +impl From for RgbColor { + fn from(value: NamedColor) -> Self { + match value { + NamedColor::Aqua => Self::new(85, 255, 255), + NamedColor::Black => Self::new(0, 0, 0), + NamedColor::Blue => Self::new(85, 85, 255), + NamedColor::DarkAqua => Self::new(0, 170, 170), + NamedColor::DarkBlue => Self::new(0, 0, 170), + NamedColor::DarkGray => Self::new(85, 85, 85), + NamedColor::DarkGreen => Self::new(0, 170, 0), + NamedColor::DarkPurple => Self::new(170, 0, 170), + NamedColor::DarkRed => Self::new(170, 0, 0), + NamedColor::Gold => Self::new(255, 170, 0), + NamedColor::Gray => Self::new(170, 170, 170), + NamedColor::Green => Self::new(85, 255, 85), + NamedColor::LightPurple => Self::new(255, 85, 255), + NamedColor::Red => Self::new(255, 85, 85), + NamedColor::White => Self::new(255, 255, 255), + NamedColor::Yellow => Self::new(255, 255, 85), + } + } +} + +impl From for Color { + fn from(value: RgbColor) -> Self { + Self::Rgb(value) + } +} + +impl From for Color { + fn from(value: NamedColor) -> Self { + Self::Named(value) + } +} + +impl TryFrom<&str> for Color { + type Error = ColorError; + + fn try_from(value: &str) -> Result { + if value.starts_with('#') { + return Ok(Self::Rgb(RgbColor::try_from(value)?)); + } + + if value == "reset" { + return Ok(Self::Reset); + } + + Ok(Self::Named(NamedColor::try_from(value)?)) + } +} + +impl TryFrom<&str> for NamedColor { + type Error = ColorError; + + fn try_from(value: &str) -> Result { + match value { + "black" => Ok(NamedColor::Black), + "dark_blue" => Ok(NamedColor::DarkBlue), + "dark_green" => Ok(NamedColor::DarkGreen), + "dark_aqua" => Ok(NamedColor::DarkAqua), + "dark_red" => Ok(NamedColor::DarkRed), + "dark_purple" => Ok(NamedColor::DarkPurple), + "gold" => Ok(NamedColor::Gold), + "gray" => Ok(NamedColor::Gray), + "dark_gray" => Ok(NamedColor::DarkGray), + "blue" => Ok(NamedColor::Blue), + "green" => Ok(NamedColor::Green), + "aqua" => Ok(NamedColor::Aqua), + "red" => Ok(NamedColor::Red), + "light_purple" => Ok(NamedColor::LightPurple), + "yellow" => Ok(NamedColor::Yellow), + "white" => Ok(NamedColor::White), + _ => Err(ColorError), + } + } +} + +impl TryFrom<&str> for RgbColor { + type Error = ColorError; + + fn try_from(value: &str) -> Result { + let to_num = |d| match d { + b'0'..=b'9' => Ok(d - b'0'), + b'a'..=b'f' => Ok(d - b'a' + 0xa), + b'A'..=b'F' => Ok(d - b'A' + 0xa), + _ => Err(ColorError), + }; + + if let &[b'#', r0, r1, g0, g1, b0, b1] = value.as_bytes() { + Ok(RgbColor { + r: to_num(r0)? << 4 | to_num(r1)?, + g: to_num(g0)? << 4 | to_num(g1)?, + b: to_num(b0)? << 4 | to_num(b1)?, + }) + } else { + Err(ColorError) + } + } +} + +impl Serialize for Color { + fn serialize(&self, serializer: S) -> Result { + format!("{}", self).serialize(serializer) + } +} + +impl<'de> Deserialize<'de> for Color { + fn deserialize>(deserializer: D) -> Result { + deserializer.deserialize_str(ColorVisitor) + } +} + +struct ColorVisitor; + +impl<'de> Visitor<'de> for ColorVisitor { + type Value = Color; + + fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "a hex color (#rrggbb), a normal color or 'reset'") + } + + fn visit_str(self, s: &str) -> Result { + Color::try_from(s).map_err(|_| E::custom("invalid color")) + } +} + +impl fmt::Display for Color { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + Color::Reset => write!(f, "reset"), + Color::Rgb(rgb) => rgb.fmt(f), + Color::Named(normal) => normal.fmt(f), + } + } +} + +impl fmt::Display for RgbColor { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "#{:02x}{:02x}{:02x}", self.r, self.g, self.b) + } +} + +impl fmt::Display for NamedColor { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.name()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn colors() { + assert_eq!( + Color::try_from("#aBcDeF"), + Ok(RgbColor::new(0xab, 0xcd, 0xef).into()) + ); + assert_eq!( + Color::try_from("#fFfFfF"), + Ok(RgbColor::new(255, 255, 255).into()) + ); + assert_eq!(Color::try_from("#000000"), Ok(NamedColor::Black.into())); + assert_eq!(Color::try_from("red"), Ok(NamedColor::Red.into())); + assert_eq!(Color::try_from("blue"), Ok(NamedColor::Blue.into())); + assert!(Color::try_from("#ffTf00").is_err()); + assert!(Color::try_from("#ffÅ”00").is_err()); + assert!(Color::try_from("#00000000").is_err()); + assert!(Color::try_from("#").is_err()); + } +} diff --git a/vendor/valence/crates/valence_text/src/into_text.rs b/vendor/valence/crates/valence_text/src/into_text.rs new file mode 100644 index 00000000..5b0fb7c7 --- /dev/null +++ b/vendor/valence/crates/valence_text/src/into_text.rs @@ -0,0 +1,377 @@ +//! Provides the [`IntoText`] trait and implementations. + +use std::borrow::Cow; + +use super::{ClickEvent, Color, Font, HoverEvent, Text}; + +/// Trait for any data that can be converted to a [`Text`] object. +/// +/// Also conveniently provides many useful methods for modifying a [`Text`] +/// object. +/// +/// # Usage +/// +/// ``` +/// # use valence_text::{IntoText, color::NamedColor}; +/// let mut my_text = "".into_text(); +/// my_text = my_text.color(NamedColor::Red).bold(); +/// my_text = my_text.add_child("CRABBBBB".obfuscated()); +pub trait IntoText<'a>: Sized { + /// Converts to a [`Text`] object, either owned or borrowed. + fn into_cow_text(self) -> Cow<'a, Text>; + + /// Converts to an owned [`Text`] object. + fn into_text(self) -> Text { + self.into_cow_text().into_owned() + } + + /// Sets the color of the text. + fn color(self, color: impl Into) -> Text { + let mut value = self.into_text(); + value.color = Some(color.into()); + value + } + /// Clears the color of the text. Color of parent [`Text`] object will be + /// used. + fn clear_color(self) -> Text { + let mut value = self.into_text(); + value.color = None; + value + } + + /// Sets the font of the text. + fn font(self, font: Font) -> Text { + let mut value = self.into_text(); + value.font = Some(font); + value + } + /// Clears the font of the text. Font of parent [`Text`] object will be + /// used. + fn clear_font(self) -> Text { + let mut value = self.into_text(); + value.font = None; + value + } + + /// Makes the text bold. + fn bold(self) -> Text { + let mut value = self.into_text(); + value.bold = Some(true); + value + } + /// Makes the text not bold. + fn not_bold(self) -> Text { + let mut value = self.into_text(); + value.bold = Some(false); + value + } + /// Clears the `bold` property of the text. Property of the parent [`Text`] + /// object will be used. + fn clear_bold(self) -> Text { + let mut value = self.into_text(); + value.bold = None; + value + } + + /// Makes the text italic. + fn italic(self) -> Text { + let mut value = self.into_text(); + value.italic = Some(true); + value + } + /// Makes the text not italic. + fn not_italic(self) -> Text { + let mut value = self.into_text(); + value.italic = Some(false); + value + } + /// Clears the `italic` property of the text. Property of the parent + /// [`Text`] object will be used. + fn clear_italic(self) -> Text { + let mut value = self.into_text(); + value.italic = None; + value + } + + /// Makes the text underlined. + fn underlined(self) -> Text { + let mut value = self.into_text(); + value.underlined = Some(true); + value + } + /// Makes the text not underlined. + fn not_underlined(self) -> Text { + let mut value = self.into_text(); + value.underlined = Some(false); + value + } + /// Clears the `underlined` property of the text. Property of the parent + /// [`Text`] object will be used. + fn clear_underlined(self) -> Text { + let mut value = self.into_text(); + value.underlined = None; + value + } + + /// Adds a strikethrough effect to the text. + fn strikethrough(self) -> Text { + let mut value = self.into_text(); + value.strikethrough = Some(true); + value + } + /// Removes the strikethrough effect from the text. + fn not_strikethrough(self) -> Text { + let mut value = self.into_text(); + value.strikethrough = Some(false); + value + } + /// Clears the `strikethrough` property of the text. Property of the parent + /// [`Text`] object will be used. + fn clear_strikethrough(self) -> Text { + let mut value = self.into_text(); + value.strikethrough = None; + value + } + + /// Makes the text obfuscated. + fn obfuscated(self) -> Text { + let mut value = self.into_text(); + value.obfuscated = Some(true); + value + } + /// Makes the text not obfuscated. + fn not_obfuscated(self) -> Text { + let mut value = self.into_text(); + value.obfuscated = Some(false); + value + } + /// Clears the `obfuscated` property of the text. Property of the parent + /// [`Text`] object will be used. + fn clear_obfuscated(self) -> Text { + let mut value = self.into_text(); + value.obfuscated = None; + value + } + + /// Adds an `insertion` property to the text. When shift-clicked, the given + /// text will be inserted into chat box for the client. + fn insertion(self, insertion: impl Into>) -> Text { + let mut value = self.into_text(); + value.insertion = Some(insertion.into()); + value + } + /// Clears the `insertion` property of the text. Property of the parent + /// [`Text`] object will be used. + fn clear_insertion(self) -> Text { + let mut value = self.into_text(); + value.insertion = None; + value + } + + /// On click, opens the given URL. Has to be `http` or `https` protocol. + fn on_click_open_url(self, url: impl Into>) -> Text { + let mut value = self.into_text(); + value.click_event = Some(ClickEvent::OpenUrl(url.into())); + value + } + /// On click, sends a command. Doesn't actually have to be a command, can be + /// a simple chat message. + fn on_click_run_command(self, command: impl Into>) -> Text { + let mut value = self.into_text(); + value.click_event = Some(ClickEvent::RunCommand(command.into())); + value + } + /// On click, copies the given text to the chat box. + fn on_click_suggest_command(self, command: impl Into>) -> Text { + let mut value = self.into_text(); + value.click_event = Some(ClickEvent::SuggestCommand(command.into())); + value + } + /// On click, turns the page of the opened book to the given number. + /// Indexing starts at `1`. + fn on_click_change_page(self, page: impl Into) -> Text { + let mut value = self.into_text(); + value.click_event = Some(ClickEvent::ChangePage(page.into())); + value + } + /// On click, copies the given text to clipboard. + fn on_click_copy_to_clipboard(self, text: impl Into>) -> Text { + let mut value = self.into_text(); + value.click_event = Some(ClickEvent::CopyToClipboard(text.into())); + value + } + /// Clears the `click_event` property of the text. Property of the parent + /// [`Text`] object will be used. + fn clear_click_event(self) -> Text { + let mut value = self.into_text(); + value.click_event = None; + value + } + + /// On mouse hover, shows the given text in a tooltip. + fn on_hover_show_text(self, text: impl IntoText<'static>) -> Text { + let mut value = self.into_text(); + value.hover_event = Some(HoverEvent::ShowText(text.into_text())); + value + } + /// Clears the `hover_event` property of the text. Property of the parent + /// [`Text`] object will be used. + fn clear_hover_event(self) -> Text { + let mut value = self.into_text(); + value.hover_event = None; + value + } + + /// Adds a child [`Text`] object. + fn add_child(self, text: impl IntoText<'static>) -> Text { + let mut value = self.into_text(); + value.extra.push(text.into_text()); + value + } +} + +impl<'a> IntoText<'a> for Text { + fn into_cow_text(self) -> Cow<'a, Text> { + Cow::Owned(self) + } +} +impl<'a> IntoText<'a> for &'a Text { + fn into_cow_text(self) -> Cow<'a, Text> { + Cow::Borrowed(self) + } +} +impl<'a> From<&'a Text> for Text { + fn from(value: &'a Text) -> Self { + value.clone() + } +} + +impl<'a> IntoText<'a> for Cow<'a, Text> { + fn into_cow_text(self) -> Cow<'a, Text> { + self + } +} +impl<'a> From> for Text { + fn from(value: Cow<'a, Text>) -> Self { + value.into_owned() + } +} +impl<'a, 'b> IntoText<'a> for &'a Cow<'b, Text> { + fn into_cow_text(self) -> Cow<'a, Text> { + self.clone() + } +} +impl<'a, 'b> From<&'a Cow<'b, Text>> for Text { + fn from(value: &'a Cow<'b, Text>) -> Self { + value.clone().into_owned() + } +} + +impl<'a> IntoText<'a> for String { + fn into_cow_text(self) -> Cow<'a, Text> { + Cow::Owned(Text::text(self)) + } +} +impl From for Text { + fn from(value: String) -> Self { + value.into_text() + } +} +impl<'b> IntoText<'b> for &String { + fn into_cow_text(self) -> Cow<'b, Text> { + Cow::Owned(Text::text(self.clone())) + } +} +impl<'a> From<&'a String> for Text { + fn from(value: &'a String) -> Self { + value.into_text() + } +} + +impl<'a> IntoText<'a> for Cow<'static, str> { + fn into_cow_text(self) -> Cow<'a, Text> { + Cow::Owned(Text::text(self)) + } +} +impl From> for Text { + fn from(value: Cow<'static, str>) -> Self { + value.into_text() + } +} +impl IntoText<'static> for &Cow<'static, str> { + fn into_cow_text(self) -> Cow<'static, Text> { + Cow::Owned(Text::text(self.clone())) + } +} +impl<'a> From<&'a Cow<'static, str>> for Text { + fn from(value: &'a Cow<'static, str>) -> Self { + value.into_text() + } +} + +impl<'a> IntoText<'a> for &'static str { + fn into_cow_text(self) -> Cow<'a, Text> { + Cow::Owned(Text::text(self)) + } +} +impl From<&'static str> for Text { + fn from(value: &'static str) -> Self { + value.into_text() + } +} + +impl<'a, 'b, T: IntoText<'a>, const N: usize> IntoText<'b> for [T; N] { + fn into_cow_text(self) -> Cow<'b, Text> { + let mut txt = Text::text(""); + + for child in self { + txt = txt.add_child(child.into_cow_text().into_owned()); + } + + Cow::Owned(txt) + } +} + +impl<'a, 'c, T: IntoText<'a> + Clone, const N: usize> IntoText<'c> for &[T; N] { + fn into_cow_text(self) -> Cow<'c, Text> { + let mut txt = Text::text(""); + + for child in self { + txt = txt.add_child(child.clone().into_cow_text().into_owned()); + } + + Cow::Owned(txt) + } +} + +macro_rules! impl_primitives { + ($($primitive:ty),+) => { + $( + impl<'a> IntoText<'a> for $primitive { + fn into_cow_text(self) -> Cow<'a, Text> { + Cow::Owned(Text::text(self.to_string())) + } + } + )+ + }; +} +impl_primitives! {char, bool, f32, f64, isize, usize, i8, i16, i32, i64, i128, u8, u16, u32, u64, u128} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn intotext_trait() { + fn is_borrowed<'a>(value: impl IntoText<'a>) -> bool { + matches!(value.into_cow_text(), Cow::Borrowed(..)) + } + + assert!(is_borrowed(&"this should be borrowed".into_text())); + assert!(is_borrowed(&"this should be borrowed too".bold())); + assert!(!is_borrowed("this should be owned?".bold())); + assert!(!is_borrowed("this should be owned")); + assert!(!is_borrowed(465)); + assert!(!is_borrowed(false)); + } +} diff --git a/vendor/valence/crates/valence_text/src/lib.rs b/vendor/valence/crates/valence_text/src/lib.rs new file mode 100644 index 00000000..fe07201e --- /dev/null +++ b/vendor/valence/crates/valence_text/src/lib.rs @@ -0,0 +1,649 @@ +#![doc = include_str!("../README.md")] + +use std::borrow::Cow; +use std::ops::{Deref, DerefMut}; +use std::str::FromStr; +use std::{fmt, ops}; + +use serde::de::Visitor; +use serde::{de, Deserialize, Deserializer, Serialize}; +use uuid::Uuid; +use valence_ident::Ident; +use valence_nbt::Value; + +pub mod color; +mod into_text; +#[cfg(test)] +mod tests; + +pub use color::Color; +pub use into_text::IntoText; + +/// Represents formatted text in Minecraft's JSON text format. +/// +/// Text is used in various places such as chat, window titles, +/// disconnect messages, written books, signs, and more. +/// +/// For more information, see the relevant [Minecraft Wiki article]. +/// +/// [Minecraft Wiki article]: https://minecraft.wiki/w/Raw_JSON_text_format +/// +/// # Examples +/// +/// With [`IntoText`] in scope, you can write the following: +/// ``` +/// use valence_text::{Color, IntoText, Text}; +/// +/// let txt = "The text is ".into_text() +/// + "Red".color(Color::RED) +/// + ", " +/// + "Green".color(Color::GREEN) +/// + ", and also " +/// + "Blue".color(Color::BLUE) +/// + "! And maybe even " +/// + "Italic".italic() +/// + "."; +/// +/// assert_eq!( +/// txt.to_string(), +/// r#"{"text":"The text is ","extra":[{"text":"Red","color":"red"},{"text":", "},{"text":"Green","color":"green"},{"text":", and also "},{"text":"Blue","color":"blue"},{"text":"! And maybe even "},{"text":"Italic","italic":true},{"text":"."}]}"# +/// ); +/// ``` +#[derive(Clone, PartialEq, Default, Serialize)] +#[serde(transparent)] +pub struct Text(Box); + +/// Text data and formatting. +#[derive(Clone, PartialEq, Default, Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct TextInner { + #[serde(flatten)] + pub content: TextContent, + + #[serde(default, skip_serializing_if = "Option::is_none")] + pub color: Option, + + #[serde(default, skip_serializing_if = "Option::is_none")] + pub font: Option, + + #[serde(default, skip_serializing_if = "Option::is_none")] + pub bold: Option, + + #[serde(default, skip_serializing_if = "Option::is_none")] + pub italic: Option, + + #[serde(default, skip_serializing_if = "Option::is_none")] + pub underlined: Option, + + #[serde(default, skip_serializing_if = "Option::is_none")] + pub strikethrough: Option, + + #[serde(default, skip_serializing_if = "Option::is_none")] + pub obfuscated: Option, + + #[serde(default, skip_serializing_if = "Option::is_none")] + pub insertion: Option>, + + #[serde(default, skip_serializing_if = "Option::is_none")] + pub click_event: Option, + + #[serde(default, skip_serializing_if = "Option::is_none")] + pub hover_event: Option, + + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub extra: Vec, +} + +/// The text content of a Text object. +#[derive(Clone, PartialEq, Debug, Serialize, Deserialize)] +#[serde(untagged)] +pub enum TextContent { + /// Normal text + // TODO: Use Utf8Bytes + Text { text: Cow<'static, str> }, + /// A piece of text that will be translated on the client based on the + /// client language. If no corresponding translation can be found, the + /// identifier itself is used as the translated text. + Translate { + /// A translation identifier, corresponding to the identifiers found in + /// loaded language files. + translate: Cow<'static, str>, + /// Optional list of text components to be inserted into slots in the + /// translation text. Ignored if `translate` is not present. + #[serde(default, skip_serializing_if = "Vec::is_empty")] + with: Vec, + }, + /// Displays a score holder's current score in an objective. + ScoreboardValue { score: ScoreboardValueContent }, + /// Displays the name of one or more entities found by a [`selector`]. + /// + /// [`selector`]: https://minecraft.wiki/w/Target_selectors + EntityNames { + /// A string containing a [`selector`]. + /// + /// [`selector`]: https://minecraft.wiki/w/Target_selectors + selector: Cow<'static, str>, + /// An optional custom separator used when the selector returns multiple + /// entities. Defaults to the ", " text with gray color. + #[serde(default, skip_serializing_if = "Option::is_none")] + separator: Option, + }, + /// Displays the name of the button that is currently bound to a certain + /// configurable control on the client. + Keybind { + /// A [`keybind identifier`], to be displayed as the name of the button + /// that is currently bound to that action. + /// + /// [`keybind identifier`]: https://minecraft.wiki/w/Controls#Configurable_controls + keybind: Cow<'static, str>, + }, + /// Displays NBT values from block entities. + BlockNbt { + block: Cow<'static, str>, + nbt: Cow<'static, str>, + #[serde(default, skip_serializing_if = "Option::is_none")] + interpret: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + separator: Option, + }, + /// Displays NBT values from entities. + EntityNbt { + entity: Cow<'static, str>, + nbt: Cow<'static, str>, + #[serde(default, skip_serializing_if = "Option::is_none")] + interpret: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + separator: Option, + }, + /// Displays NBT values from command storage. + StorageNbt { + storage: Ident, + nbt: Cow<'static, str>, + #[serde(default, skip_serializing_if = "Option::is_none")] + interpret: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + separator: Option, + }, +} + +/// Scoreboard value. +#[derive(Clone, PartialEq, Debug, Serialize, Deserialize)] +pub struct ScoreboardValueContent { + /// The name of the score holder whose score should be displayed. This + /// can be a [`selector`] or an explicit name. + /// + /// [`selector`]: https://minecraft.wiki/w/Target_selectors + pub name: Cow<'static, str>, + /// The internal name of the objective to display the player's score in. + pub objective: Cow<'static, str>, + /// If present, this value is displayed regardless of what the score + /// would have been. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub value: Option>, +} + +/// Action to take on click of the text. +#[derive(Clone, PartialEq, Debug, Serialize, Deserialize)] +#[serde(tag = "action", content = "value", rename_all = "snake_case")] +pub enum ClickEvent { + /// Opens an URL + OpenUrl(Cow<'static, str>), + /// Only usable by internal servers for security reasons. + OpenFile(Cow<'static, str>), + /// Sends a chat command. Doesn't actually have to be a command, can be a + /// normal chat message. + RunCommand(Cow<'static, str>), + /// Replaces the contents of the chat box with the text, not necessarily a + /// command. + SuggestCommand(Cow<'static, str>), + /// Only usable within written books. Changes the page of the book. Indexing + /// starts at 1. + ChangePage(i32), + /// Copies the given text to clipboard + CopyToClipboard(Cow<'static, str>), +} + +/// Action to take when mouse-hovering on the text. +#[derive(Clone, PartialEq, Debug, Serialize, Deserialize)] +#[serde(tag = "action", content = "contents", rename_all = "snake_case")] +#[allow(clippy::enum_variant_names)] +pub enum HoverEvent { + /// Displays a tooltip with the given text. + ShowText(Text), + /// Shows an item. + ShowItem { + /// Resource identifier of the item + id: Ident, + /// Number of the items in the stack + count: Option, + /// NBT information about the item (sNBT format) + tag: Cow<'static, str>, + }, + /// Shows an entity. + ShowEntity { + /// The entity's UUID + id: Uuid, + /// Resource identifier of the entity + #[serde(rename = "type")] + #[serde(default, skip_serializing_if = "Option::is_none")] + kind: Option, + /// Optional custom name for the entity + #[serde(default, skip_serializing_if = "Option::is_none")] + name: Option, + }, +} + +/// The font of the text. +#[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize)] +pub enum Font { + /// The default font. + #[serde(rename = "minecraft:default")] + Default, + /// Unicode font. + #[serde(rename = "minecraft:uniform")] + Uniform, + /// Enchanting table font. + #[serde(rename = "minecraft:alt")] + Alt, +} + +#[allow(clippy::self_named_constructors)] +impl Text { + /// Constructs a new plain text object. + pub fn text(plain: impl Into>) -> Self { + Self(Box::new(TextInner { + content: TextContent::Text { text: plain.into() }, + ..Default::default() + })) + } + + /// Create translated text based on the given translation key, with extra + /// text components to be inserted into the slots of the translation text. + pub fn translate(key: impl Into>, with: impl Into>) -> Self { + Self(Box::new(TextInner { + content: TextContent::Translate { + translate: key.into(), + with: with.into(), + }, + ..Default::default() + })) + } + + /// Create a score from the scoreboard with an optional custom value. + pub fn score( + name: impl Into>, + objective: impl Into>, + value: Option>, + ) -> Self { + Self(Box::new(TextInner { + content: TextContent::ScoreboardValue { + score: ScoreboardValueContent { + name: name.into(), + objective: objective.into(), + value, + }, + }, + ..Default::default() + })) + } + + /// Creates a text component for selecting entity names with an optional + /// custom separator. + pub fn selector(selector: impl Into>, separator: Option) -> Self { + Self(Box::new(TextInner { + content: TextContent::EntityNames { + selector: selector.into(), + separator, + }, + ..Default::default() + })) + } + + /// Creates a text component for a keybind. The keybind should be a valid + /// [`keybind identifier`]. + /// + /// [`keybind identifier`]: https://minecraft.wiki/w/Controls#Configurable_controls + pub fn keybind(keybind: impl Into>) -> Self { + Self(Box::new(TextInner { + content: TextContent::Keybind { + keybind: keybind.into(), + }, + ..Default::default() + })) + } + + /// Creates a text component for a block NBT tag. + pub fn block_nbt( + block: impl Into>, + nbt: impl Into>, + interpret: Option, + separator: Option, + ) -> Self { + Self(Box::new(TextInner { + content: TextContent::BlockNbt { + block: block.into(), + nbt: nbt.into(), + interpret, + separator, + }, + ..Default::default() + })) + } + + /// Creates a text component for an entity NBT tag. + pub fn entity_nbt( + entity: impl Into>, + nbt: impl Into>, + interpret: Option, + separator: Option, + ) -> Self { + Self(Box::new(TextInner { + content: TextContent::EntityNbt { + entity: entity.into(), + nbt: nbt.into(), + interpret, + separator, + }, + ..Default::default() + })) + } + + /// Creates a text component for a command storage NBT tag. + pub fn storage_nbt( + storage: impl Into, + nbt: impl Into>, + interpret: Option, + separator: Option, + ) -> Self { + Self(Box::new(TextInner { + content: TextContent::StorageNbt { + storage: storage.into(), + nbt: nbt.into(), + interpret, + separator, + }, + ..Default::default() + })) + } + + /// Returns `true` if the text contains no characters. Returns `false` + /// otherwise. + pub fn is_empty(&self) -> bool { + for extra in &self.0.extra { + if !extra.is_empty() { + return false; + } + } + + match &self.0.content { + TextContent::Text { text } => text.is_empty(), + TextContent::Translate { translate, .. } => translate.is_empty(), + TextContent::ScoreboardValue { score } => { + let ScoreboardValueContent { + name, objective, .. + } = score; + + name.is_empty() || objective.is_empty() + } + TextContent::EntityNames { selector, .. } => selector.is_empty(), + TextContent::Keybind { keybind } => keybind.is_empty(), + TextContent::BlockNbt { nbt, .. } => nbt.is_empty(), + TextContent::EntityNbt { nbt, .. } => nbt.is_empty(), + TextContent::StorageNbt { nbt, .. } => nbt.is_empty(), + } + } + + /// Converts the [`Text`] object to a plain string with the [legacy formatting (`§` and format codes)](https://wiki.vg/Chat#Old_system) + /// + /// Removes everything that can't be represented with a `§` and a modifier. + /// Any colors not on the [the legacy color list](https://wiki.vg/Chat#Colors) will be replaced with their closest equivalent. + pub fn to_legacy_lossy(&self) -> String { + // For keeping track of the currently active modifiers + #[derive(Default, Clone)] + struct Modifiers { + obfuscated: Option, + bold: Option, + strikethrough: Option, + underlined: Option, + italic: Option, + color: Option, + } + + impl Modifiers { + // Writes all active modifiers to a String as `§` + fn write(&self, output: &mut String) { + if let Some(color) = self.color { + let code = match color { + Color::Rgb(rgb) => rgb.to_named_lossy().hex_digit(), + Color::Named(normal) => normal.hex_digit(), + Color::Reset => return, + }; + + output.push('§'); + output.push(code); + } + if let Some(true) = self.obfuscated { + output.push_str("§k"); + } + if let Some(true) = self.bold { + output.push_str("§l"); + } + if let Some(true) = self.strikethrough { + output.push_str("§m"); + } + if let Some(true) = self.underlined { + output.push_str("§n"); + } + if let Some(true) = self.italic { + output.push_str("§o"); + } + } + // Merges 2 Modifiers. The result is what you would get if you applied them both + // sequentially. + fn add(&self, other: &Self) -> Self { + Self { + obfuscated: other.obfuscated.or(self.obfuscated), + bold: other.bold.or(self.bold), + strikethrough: other.strikethrough.or(self.strikethrough), + underlined: other.underlined.or(self.underlined), + italic: other.italic.or(self.italic), + color: other.color.or(self.color), + } + } + } + + fn to_legacy_inner(this: &Text, result: &mut String, mods: &mut Modifiers) { + let new_mods = Modifiers { + obfuscated: this.0.obfuscated, + bold: this.0.bold, + strikethrough: this.0.strikethrough, + underlined: this.0.underlined, + italic: this.0.italic, + color: this.0.color, + }; + + // If any modifiers were removed + if [ + this.0.obfuscated, + this.0.bold, + this.0.strikethrough, + this.0.underlined, + this.0.italic, + ].contains(&Some(false)) + || this.0.color == Some(Color::Reset) + { + // Reset and print sum of old and new modifiers + result.push_str("§r"); + mods.add(&new_mods).write(result); + } else { + // Print only new modifiers + new_mods.write(result); + } + + *mods = mods.add(&new_mods); + + if let TextContent::Text { text } = &this.0.content { + result.push_str(text); + } + + for child in &this.0.extra { + to_legacy_inner(child, result, mods); + } + } + + let mut result = String::new(); + let mut mods = Modifiers::default(); + to_legacy_inner(self, &mut result, &mut mods); + + result + } +} + +impl Deref for Text { + type Target = TextInner; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl DerefMut for Text { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + +impl> ops::Add for Text { + type Output = Self; + + fn add(self, rhs: T) -> Self::Output { + self.add_child(rhs) + } +} + +impl> ops::AddAssign for Text { + fn add_assign(&mut self, rhs: T) { + self.extra.push(rhs.into_text()); + } +} + +impl<'a> From for Cow<'a, Text> { + fn from(value: Text) -> Self { + Cow::Owned(value) + } +} + +impl<'a> From<&'a Text> for Cow<'a, Text> { + fn from(value: &'a Text) -> Self { + Cow::Borrowed(value) + } +} + +impl FromStr for Text { + type Err = serde_json::error::Error; + + fn from_str(s: &str) -> Result { + if s.is_empty() { + Ok(Text::default()) + } else { + serde_json::from_str(s) + } + } +} + +impl From for String { + fn from(value: Text) -> Self { + format!("{value}") + } +} + +impl From for Value { + fn from(value: Text) -> Self { + Value::String(value.into()) + } +} + +impl fmt::Debug for Text { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + fmt::Display::fmt(self, f) + } +} + +impl fmt::Display for Text { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let string = if f.alternate() { + serde_json::to_string_pretty(self) + } else { + serde_json::to_string(self) + } + .map_err(|_| fmt::Error)?; + + f.write_str(&string) + } +} + +impl Default for TextContent { + fn default() -> Self { + Self::Text { text: "".into() } + } +} + +impl<'de> Deserialize<'de> for Text { + fn deserialize>(deserializer: D) -> Result { + struct TextVisitor; + + impl<'de> Visitor<'de> for TextVisitor { + type Value = Text; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + write!(formatter, "a text component data type") + } + + fn visit_bool(self, v: bool) -> Result { + Ok(Text::text(v.to_string())) + } + + fn visit_i64(self, v: i64) -> Result { + Ok(Text::text(v.to_string())) + } + + fn visit_u64(self, v: u64) -> Result { + Ok(Text::text(v.to_string())) + } + + fn visit_f64(self, v: f64) -> Result { + Ok(Text::text(v.to_string())) + } + + fn visit_str(self, v: &str) -> Result { + Ok(Text::text(v.to_string())) + } + + fn visit_string(self, v: String) -> Result { + Ok(Text::text(v)) + } + + fn visit_seq>(self, mut seq: A) -> Result { + let Some(mut res) = seq.next_element()? else { + return Ok(Text::default()); + }; + + while let Some(child) = seq.next_element::()? { + res += child; + } + + Ok(res) + } + + fn visit_map>(self, map: A) -> Result { + use de::value::MapAccessDeserializer; + + Ok(Text(Box::new(TextInner::deserialize( + MapAccessDeserializer::new(map), + )?))) + } + } + + deserializer.deserialize_any(TextVisitor) + } +} diff --git a/vendor/valence/crates/valence_text/src/tests.rs b/vendor/valence/crates/valence_text/src/tests.rs new file mode 100644 index 00000000..28b03729 --- /dev/null +++ b/vendor/valence/crates/valence_text/src/tests.rs @@ -0,0 +1,136 @@ +use valence_ident::ident; + +use super::*; + +#[test] +fn text_round_trip() { + let before = "foo".color(Color::RED).bold() + + ("bar".obfuscated().color(Color::YELLOW) + + "baz".underlined().not_bold().italic().color(Color::BLACK)); + + let json = format!("{before:#}"); + + let after = Text::from_str(&json).unwrap(); + + println!("==== Before ====\n"); + println!("{before:#?}"); + println!("==== After ====\n"); + println!("{after:#?}"); + + assert_eq!(before, after); + assert_eq!(before.to_string(), after.to_string()); +} + +#[test] +fn non_object_data_types() { + let input = r#"["foo", true, false, 1.9E10, 9999]"#; + let txt: Text = serde_json::from_str(input).unwrap(); + + assert_eq!(txt, "foo".into_text() + true + false + 1.9E10 + 9999); +} + +#[test] +fn translate() { + let txt = Text::translate( + "chat.type.advancement.task", + ["arg1".into_text(), "arg2".into_text()], + ); + let serialized = txt.to_string(); + let deserialized = Text::from_str(&serialized).unwrap(); + assert_eq!( + serialized, + r#"{"translate":"chat.type.advancement.task","with":[{"text":"arg1"},{"text":"arg2"}]}"# + ); + assert_eq!(txt, deserialized); +} + +#[test] +fn score() { + let txt = Text::score("foo", "bar", Some(Cow::from("baz"))); + let serialized = txt.to_string(); + let deserialized = Text::from_str(&serialized).unwrap(); + assert_eq!( + serialized, + r#"{"score":{"name":"foo","objective":"bar","value":"baz"}}"# + ); + assert_eq!(txt, deserialized); +} + +#[test] +fn selector() { + let separator = Text::text("bar").color(Color::RED).bold(); + let txt = Text::selector("foo", Some(separator)); + let serialized = txt.to_string(); + let deserialized = Text::from_str(&serialized).unwrap(); + assert_eq!( + serialized, + r#"{"selector":"foo","separator":{"text":"bar","color":"red","bold":true}}"# + ); + assert_eq!(txt, deserialized); +} + +#[test] +fn keybind() { + let txt = Text::keybind("foo"); + let serialized = txt.to_string(); + let deserialized = Text::from_str(&serialized).unwrap(); + assert_eq!(serialized, r#"{"keybind":"foo"}"#); + assert_eq!(txt, deserialized); +} + +#[test] +fn block_nbt() { + let txt = Text::block_nbt("foo", "bar", Some(true), Some("baz".into_text())); + let serialized = txt.to_string(); + let deserialized = Text::from_str(&serialized).unwrap(); + let expected = r#"{"block":"foo","nbt":"bar","interpret":true,"separator":{"text":"baz"}}"#; + assert_eq!(serialized, expected); + assert_eq!(txt, deserialized); +} + +#[test] +fn entity_nbt() { + let txt = Text::entity_nbt("foo", "bar", Some(true), Some("baz".into_text())); + let serialized = txt.to_string(); + let deserialized = Text::from_str(&serialized).unwrap(); + let expected = r#"{"entity":"foo","nbt":"bar","interpret":true,"separator":{"text":"baz"}}"#; + assert_eq!(serialized, expected); + assert_eq!(txt, deserialized); +} + +#[test] +fn storage_nbt() { + let txt = Text::storage_nbt(ident!("foo"), "bar", Some(true), Some("baz".into_text())); + let serialized = txt.to_string(); + let deserialized = Text::from_str(&serialized).unwrap(); + let expected = + r#"{"storage":"minecraft:foo","nbt":"bar","interpret":true,"separator":{"text":"baz"}}"#; + assert_eq!(serialized, expected); + assert_eq!(txt, deserialized); +} + +#[test] +fn text_to_legacy_lossy() { + let text = "Heavily formatted green text\n" + .bold() + .italic() + .strikethrough() + .underlined() + .obfuscated() + .color(Color::GREEN) + + "Lightly formatted red text\n" + .not_bold() + .not_strikethrough() + .not_obfuscated() + .color(Color::RED) + + "Not formatted blue text" + .not_italic() + .not_underlined() + .color(Color::BLUE); + + assert_eq!( + text.to_legacy_lossy(), + "§a§k§l§m§n§oHeavily formatted green text\n§r§c§n§oLightly formatted red text\n§r§9Not \ + formatted blue text" + ); +} diff --git a/vendor/valence/crates/valence_weather/Cargo.toml b/vendor/valence/crates/valence_weather/Cargo.toml new file mode 100644 index 00000000..18fc33ae --- /dev/null +++ b/vendor/valence/crates/valence_weather/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "valence_weather" +description = "Weather support for Valence" +readme = "README.md" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[dependencies] +valence_server.workspace = true +bevy_ecs.workspace = true +bevy_app.workspace = true +derive_more.workspace = true \ No newline at end of file diff --git a/vendor/valence/crates/valence_weather/README.md b/vendor/valence/crates/valence_weather/README.md new file mode 100644 index 00000000..fe5b850c --- /dev/null +++ b/vendor/valence/crates/valence_weather/README.md @@ -0,0 +1,3 @@ +# valence_weather + +Support for weather effects in layers. (rain, thunder, etc.) diff --git a/vendor/valence/crates/valence_weather/src/lib.rs b/vendor/valence/crates/valence_weather/src/lib.rs new file mode 100644 index 00000000..49fbe6b4 --- /dev/null +++ b/vendor/valence/crates/valence_weather/src/lib.rs @@ -0,0 +1,133 @@ +#![doc = include_str!("../README.md")] +#![allow(clippy::type_complexity)] +#![deny( + rustdoc::broken_intra_doc_links, + rustdoc::private_intra_doc_links, + rustdoc::missing_crate_level_docs, + rustdoc::invalid_codeblock_attributes, + rustdoc::invalid_rust_codeblocks, + rustdoc::bare_urls, + rustdoc::invalid_html_tags +)] +#![warn( + trivial_casts, + trivial_numeric_casts, + unused_lifetimes, + unused_import_braces, + unreachable_pub, + clippy::dbg_macro +)] + +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use derive_more::{Deref, DerefMut}; +use valence_server::client::{Client, FlushPacketsSet, UpdateClientsSet, VisibleChunkLayer}; +use valence_server::protocol::packets::play::game_state_change_s2c::GameEventKind; +use valence_server::protocol::packets::play::GameStateChangeS2c; +use valence_server::protocol::WritePacket; +use valence_server::ChunkLayer; + +pub struct WeatherPlugin; + +impl Plugin for WeatherPlugin { + fn build(&self, app: &mut App) { + app.add_systems( + PostUpdate, + ( + init_weather_on_layer_join, + change_client_rain_level, + change_client_thunder_level, + ) + .before(FlushPacketsSet), + ) + .add_systems( + PostUpdate, + (change_layer_rain_level, change_layer_thunder_level).before(UpdateClientsSet), + ); + } +} + +/// Bundle containing rain and thunder components. `valence_weather` allows this +/// to be added to clients and chunk layer entities. +#[derive(Bundle, Default, PartialEq, PartialOrd)] +pub struct WeatherBundle { + pub rain: Rain, + pub thunder: Thunder, +} + +/// Component containing the rain level. Valid values are in \[0, 1] with 0 +/// being no rain and 1 being full rain. +#[derive(Component, Default, PartialEq, PartialOrd, Deref, DerefMut)] +pub struct Rain(pub f32); + +/// Component containing the thunder level. Valid values are in \[0, 1] with 0 +/// being no rain and 1 being full rain. +#[derive(Component, Default, PartialEq, PartialOrd, Deref, DerefMut)] +pub struct Thunder(pub f32); + +fn init_weather_on_layer_join( + mut clients: Query<(&mut Client, &VisibleChunkLayer), Changed>, + layers: Query<(Option<&Rain>, Option<&Thunder>), With>, +) { + for (mut client, visible_chunk_layer) in &mut clients { + if let Ok((rain, thunder)) = layers.get(visible_chunk_layer.0) { + if let Some(rain) = rain { + if rain.0 != 0.0 { + client.write_packet(&GameStateChangeS2c { + kind: GameEventKind::RainLevelChange, + value: rain.0, + }); + } + } + + if let Some(thunder) = thunder { + if thunder.0 != 0.0 { + client.write_packet(&GameStateChangeS2c { + kind: GameEventKind::ThunderLevelChange, + value: thunder.0, + }); + } + } + } + } +} + +fn change_layer_rain_level( + mut layers: Query<(&mut ChunkLayer, &Rain), (Changed, Without)>, +) { + for (mut layer, rain) in &mut layers { + layer.write_packet(&GameStateChangeS2c { + kind: GameEventKind::RainLevelChange, + value: rain.0, + }); + } +} + +fn change_layer_thunder_level( + mut layers: Query<(&mut ChunkLayer, &Thunder), (Changed, Without)>, +) { + for (mut layer, thunder) in &mut layers { + layer.write_packet(&GameStateChangeS2c { + kind: GameEventKind::ThunderLevelChange, + value: thunder.0, + }); + } +} + +fn change_client_rain_level(mut clients: Query<(&mut Client, &Rain), Changed>) { + for (mut client, rain) in &mut clients { + client.write_packet(&GameStateChangeS2c { + kind: GameEventKind::RainLevelChange, + value: rain.0, + }); + } +} + +fn change_client_thunder_level(mut clients: Query<(&mut Client, &Thunder), Changed>) { + for (mut client, thunder) in &mut clients { + client.write_packet(&GameStateChangeS2c { + kind: GameEventKind::RainLevelChange, + value: thunder.0, + }); + } +} diff --git a/vendor/valence/crates/valence_weather/src/packet.rs b/vendor/valence/crates/valence_weather/src/packet.rs new file mode 100644 index 00000000..e69de29b diff --git a/vendor/valence/crates/valence_world_border/Cargo.toml b/vendor/valence/crates/valence_world_border/Cargo.toml new file mode 100644 index 00000000..d1dc00aa --- /dev/null +++ b/vendor/valence/crates/valence_world_border/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "valence_world_border" +description = "World border support for Valence" +readme = "README.md" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[dependencies] +bevy_app.workspace = true +bevy_ecs.workspace = true +derive_more.workspace = true +valence_server.workspace = true diff --git a/vendor/valence/crates/valence_world_border/README.md b/vendor/valence/crates/valence_world_border/README.md new file mode 100644 index 00000000..985186e8 --- /dev/null +++ b/vendor/valence/crates/valence_world_border/README.md @@ -0,0 +1,29 @@ +# valence_world_border + +Contains the plugin for working with Minecraft's [world border](https://minecraft.wiki/w/World_border). + +To enable world border functionality for a layer, insert the [`WorldBorderBundle`] component on the layer entity. +Note that the layer entity must have the [`ChunkLayer`] component for this to work. + +## Example + +```rust +use bevy_ecs::prelude::*; +use valence_world_border::*; + +fn example_system(mut world_borders: Query<(&mut WorldBorderCenter, &mut WorldBorderLerp)>) { + for (mut center, mut lerp) in &mut world_borders { + // Change the center position of the world border. + center.x = 123.0; + center.z = 456.0; + + // Change the diameter of the world border. + // If you want to change the diameter without interpolating, stop after this. + lerp.target_diameter = 100.0; + + // Have the world border linearly interpolate its diameter from 50 to 100 over 200 ticks. + // `current_diameter` and `remaining_ticks` will change automatically, but you can modify their values at any time. + lerp.current_diameter = 50.0; + lerp.remaining_ticks = 200; + } +} diff --git a/vendor/valence/crates/valence_world_border/src/lib.rs b/vendor/valence/crates/valence_world_border/src/lib.rs new file mode 100644 index 00000000..16ffae51 --- /dev/null +++ b/vendor/valence/crates/valence_world_border/src/lib.rs @@ -0,0 +1,257 @@ +#![doc = include_str!("../README.md")] +#![allow(clippy::type_complexity)] +#![deny( + rustdoc::broken_intra_doc_links, + rustdoc::private_intra_doc_links, + rustdoc::missing_crate_level_docs, + rustdoc::invalid_codeblock_attributes, + rustdoc::invalid_rust_codeblocks, + rustdoc::bare_urls, + rustdoc::invalid_html_tags +)] +#![warn( + trivial_casts, + trivial_numeric_casts, + unused_lifetimes, + unused_import_braces, + unreachable_pub, + clippy::dbg_macro +)] + +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use derive_more::{Deref, DerefMut}; +use valence_server::client::{Client, UpdateClientsSet, VisibleChunkLayer}; +use valence_server::protocol::packets::play::{ + WorldBorderCenterChangedS2c, WorldBorderInitializeS2c, WorldBorderInterpolateSizeS2c, + WorldBorderSizeChangedS2c, WorldBorderWarningBlocksChangedS2c, + WorldBorderWarningTimeChangedS2c, +}; +use valence_server::protocol::WritePacket; +use valence_server::{ChunkLayer, Server}; + +// https://minecraft.wiki/w/World_border +pub const DEFAULT_PORTAL_LIMIT: i32 = 29999984; +pub const DEFAULT_DIAMETER: f64 = (DEFAULT_PORTAL_LIMIT * 2) as f64; +pub const DEFAULT_WARN_TIME: i32 = 15; +pub const DEFAULT_WARN_BLOCKS: i32 = 5; + +pub struct WorldBorderPlugin; + +#[derive(SystemSet, Copy, Clone, PartialEq, Eq, Hash, Debug)] +pub struct UpdateWorldBorderSet; + +impl Plugin for WorldBorderPlugin { + fn build(&self, app: &mut App) { + app.configure_sets(PostUpdate, UpdateWorldBorderSet.before(UpdateClientsSet)) + .add_systems( + PostUpdate, + ( + init_world_border_for_new_clients, + tick_world_border_lerp, + change_world_border_center, + change_world_border_warning_blocks, + change_world_border_warning_time, + change_world_border_portal_tp_boundary, + ) + .in_set(UpdateWorldBorderSet), + ); + } +} + +/// A bundle containing necessary components to enable world border +/// functionality. Add this to an entity with the [`ChunkLayer`] component. +#[derive(Bundle, Default, Debug)] +pub struct WorldBorderBundle { + pub center: WorldBorderCenter, + pub lerp: WorldBorderLerp, + pub portal_teleport_boundary: WorldBorderPortalTpBoundary, + pub warn_time: WorldBorderWarnTime, + pub warn_blocks: WorldBorderWarnBlocks, +} + +#[derive(Component, Default, Copy, Clone, PartialEq, Debug)] +pub struct WorldBorderCenter { + pub x: f64, + pub z: f64, +} + +impl WorldBorderCenter { + pub fn set(&mut self, x: f64, z: f64) { + self.x = x; + self.z = z; + } +} + +/// Component containing information to linearly interpolate the world border. +/// Contains the world border's diameter. +#[derive(Component, Clone, Copy, Debug)] +pub struct WorldBorderLerp { + /// The current diameter of the world border. This is updated automatically + /// as the remaining ticks count down. + pub current_diameter: f64, + /// The desired diameter of the world border after lerping has finished. + /// Modify this if you want to change the world border diameter. + pub target_diameter: f64, + /// Server ticks until the target diameter is reached. This counts down + /// automatically. + pub remaining_ticks: u64, +} +#[derive(Component, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Deref, DerefMut)] +pub struct WorldBorderWarnTime(pub i32); + +impl Default for WorldBorderWarnTime { + fn default() -> Self { + Self(DEFAULT_WARN_TIME) + } +} + +#[derive(Component, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Deref, DerefMut)] +pub struct WorldBorderWarnBlocks(pub i32); + +impl Default for WorldBorderWarnBlocks { + fn default() -> Self { + Self(DEFAULT_WARN_BLOCKS) + } +} + +#[derive(Component, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Deref, DerefMut)] +pub struct WorldBorderPortalTpBoundary(pub i32); + +impl Default for WorldBorderPortalTpBoundary { + fn default() -> Self { + Self(DEFAULT_PORTAL_LIMIT) + } +} + +impl Default for WorldBorderLerp { + fn default() -> Self { + Self { + current_diameter: DEFAULT_DIAMETER, + target_diameter: DEFAULT_DIAMETER, + remaining_ticks: 0, + } + } +} + +fn init_world_border_for_new_clients( + mut clients: Query<(&mut Client, &VisibleChunkLayer), Changed>, + wbs: Query<( + &WorldBorderCenter, + &WorldBorderLerp, + &WorldBorderPortalTpBoundary, + &WorldBorderWarnTime, + &WorldBorderWarnBlocks, + )>, + server: Res, +) { + for (mut client, layer) in &mut clients { + if let Ok((center, lerp, portal_tp_boundary, warn_time, warn_blocks)) = wbs.get(layer.0) { + let millis = lerp.remaining_ticks as i64 * 1000 / server.tick_rate().get() as i64; + + client.write_packet(&WorldBorderInitializeS2c { + x: center.x, + z: center.z, + old_diameter: lerp.current_diameter, + new_diameter: lerp.target_diameter, + duration_millis: millis.into(), + portal_teleport_boundary: portal_tp_boundary.0.into(), + warning_blocks: warn_blocks.0.into(), + warning_time: warn_time.0.into(), + }); + } + } +} + +fn tick_world_border_lerp( + mut wbs: Query<(&mut ChunkLayer, &mut WorldBorderLerp)>, + server: Res, +) { + for (mut layer, mut lerp) in &mut wbs { + if lerp.is_changed() { + if lerp.remaining_ticks == 0 { + layer.write_packet(&WorldBorderSizeChangedS2c { + diameter: lerp.target_diameter, + }); + + lerp.current_diameter = lerp.target_diameter; + } else { + let millis = lerp.remaining_ticks as i64 * 1000 / server.tick_rate().get() as i64; + + layer.write_packet(&WorldBorderInterpolateSizeS2c { + old_diameter: lerp.current_diameter, + new_diameter: lerp.target_diameter, + duration_millis: millis.into(), + }); + } + } + + if lerp.remaining_ticks > 0 { + let diff = lerp.target_diameter - lerp.current_diameter; + lerp.current_diameter += diff / lerp.remaining_ticks as f64; + + lerp.remaining_ticks -= 1; + } + } +} + +fn change_world_border_center( + mut wbs: Query<(&mut ChunkLayer, &WorldBorderCenter), Changed>, +) { + for (mut layer, center) in &mut wbs { + layer.write_packet(&WorldBorderCenterChangedS2c { + x_pos: center.x, + z_pos: center.z, + }); + } +} + +fn change_world_border_warning_blocks( + mut wbs: Query<(&mut ChunkLayer, &WorldBorderWarnBlocks), Changed>, +) { + for (mut layer, warn_blocks) in &mut wbs { + layer.write_packet(&WorldBorderWarningBlocksChangedS2c { + warning_blocks: warn_blocks.0.into(), + }); + } +} + +fn change_world_border_warning_time( + mut wbs: Query<(&mut ChunkLayer, &WorldBorderWarnTime), Changed>, +) { + for (mut layer, warn_time) in &mut wbs { + layer.write_packet(&WorldBorderWarningTimeChangedS2c { + warning_time: warn_time.0.into(), + }); + } +} + +fn change_world_border_portal_tp_boundary( + mut wbs: Query< + ( + &mut ChunkLayer, + &WorldBorderCenter, + &WorldBorderLerp, + &WorldBorderPortalTpBoundary, + &WorldBorderWarnTime, + &WorldBorderWarnBlocks, + ), + Changed, + >, + server: Res, +) { + for (mut layer, center, lerp, portal_tp_boundary, warn_time, warn_blocks) in &mut wbs { + let millis = lerp.remaining_ticks as i64 * 1000 / server.tick_rate().get() as i64; + + layer.write_packet(&WorldBorderInitializeS2c { + x: center.x, + z: center.z, + old_diameter: lerp.current_diameter, + new_diameter: lerp.target_diameter, + duration_millis: millis.into(), + portal_teleport_boundary: portal_tp_boundary.0.into(), + warning_blocks: warn_blocks.0.into(), + warning_time: warn_time.0.into(), + }); + } +} diff --git a/vendor/valence/examples/advancement.rs b/vendor/valence/examples/advancement.rs new file mode 100644 index 00000000..dd46800d --- /dev/null +++ b/vendor/valence/examples/advancement.rs @@ -0,0 +1,314 @@ +use std::collections::HashMap; + +use valence::advancement::bevy_hierarchy::{BuildChildren, Children, Parent}; +use valence::advancement::ForceTabUpdate; +use valence::prelude::*; + +#[derive(Component)] +struct RootCriteria; + +#[derive(Component)] +struct Root2Criteria; + +#[derive(Component)] +struct RootAdvancement; + +#[derive(Component)] +struct RootCriteriaDone(bool); + +#[derive(Component)] +struct TabChangeCount(u8); + +#[derive(Resource, Default)] +struct ClientSave(HashMap); + +fn main() { + App::new() + .add_plugins(DefaultPlugins) + .init_resource::() + .add_systems(Startup, setup) + .add_systems( + Update, + ( + load_clients, + apply_deferred.after(load_clients).before(init_advancements), + init_clients, + init_advancements, + sneak, + tab_change, + ), + ) + .run(); +} + +fn setup( + mut commands: Commands, + server: Res, + dimensions: Res, + biomes: Res, +) { + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + for z in -5..5 { + for x in -5..5 { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + for z in -25..25 { + for x in -25..25 { + layer.chunk.set_block([x, 64, z], BlockState::GRASS_BLOCK); + } + } + + commands.spawn(layer); + + let root_criteria = commands + .spawn(( + AdvancementCriteria::new(ident!("custom:root_criteria").into()), + RootCriteria, + )) + .id(); + + let root_advancement = commands + .spawn(( + AdvancementBundle { + advancement: Advancement::new(ident!("custom:root").into()), + requirements: AdvancementRequirements(vec![vec![root_criteria]]), + cached_bytes: Default::default(), + }, + AdvancementDisplay { + title: "Root".into(), + description: "Toggles when you sneak".into(), + icon: ItemStack::new(ItemKind::Stone, 1, None), + frame_type: AdvancementFrameType::Task, + show_toast: true, + hidden: false, + background_texture: Some(ident!("textures/block/stone.png").into()), + x_coord: 0.0, + y_coord: 0.0, + }, + RootAdvancement, + )) + .add_child(root_criteria) + .id(); + + commands + .spawn(( + AdvancementBundle { + advancement: Advancement::new(ident!("custom:first").into()), + requirements: AdvancementRequirements::default(), + cached_bytes: Default::default(), + }, + AdvancementDisplay { + title: "First".into(), + description: "First advancement".into(), + icon: ItemStack::new(ItemKind::OakWood, 1, None), + frame_type: AdvancementFrameType::Task, + show_toast: false, + hidden: false, + background_texture: None, + x_coord: 1.0, + y_coord: -0.5, + }, + )) + .set_parent(root_advancement); + + commands + .spawn(( + AdvancementBundle { + advancement: Advancement::new(ident!("custom:second").into()), + requirements: AdvancementRequirements::default(), + cached_bytes: Default::default(), + }, + AdvancementDisplay { + title: "Second".into(), + description: "Second advancement".into(), + icon: ItemStack::new(ItemKind::AcaciaWood, 1, None), + frame_type: AdvancementFrameType::Task, + show_toast: false, + hidden: false, + background_texture: None, + x_coord: 1.0, + y_coord: 0.5, + }, + )) + .set_parent(root_advancement); + + let root2_criteria = commands + .spawn(( + AdvancementCriteria::new(ident!("custom:root2_criteria").into()), + Root2Criteria, + )) + .id(); + + commands + .spawn(( + AdvancementBundle { + advancement: Advancement::new(ident!("custom:root2").into()), + requirements: AdvancementRequirements(vec![vec![root2_criteria]]), + cached_bytes: Default::default(), + }, + AdvancementDisplay { + title: "Root2".into(), + description: "Go to this tab 5 times to earn this advancement".into(), + icon: ItemStack::new(ItemKind::IronSword, 1, None), + frame_type: AdvancementFrameType::Challenge, + show_toast: false, + hidden: false, + background_texture: Some(Ident::new("textures/block/andesite.png").unwrap()), + x_coord: 0.0, + y_coord: 0.0, + }, + )) + .add_child(root2_criteria); +} + +fn init_clients( + mut clients: Query< + ( + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut Position, + &mut GameMode, + ), + Added, + >, + layers: Query>, +) { + for ( + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut pos, + mut game_mode, + ) in &mut clients + { + let layer = layers.single(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + pos.set([0.5, 65.0, 0.5]); + *game_mode = GameMode::Creative; + } +} + +fn load_clients( + mut commands: Commands, + clients: Query<(Entity, &UniqueId), Added>, + mut client_save: ResMut, +) { + for (client, uuid) in clients.iter() { + let (root_criteria_done, tab_change_count) = + client_save.0.entry(uuid.0).or_insert((false, 0)); + + commands.entity(client).insert(( + RootCriteriaDone(*root_criteria_done), + TabChangeCount(*tab_change_count), + )); + } +} + +fn init_advancements( + mut clients: Query< + ( + &mut AdvancementClientUpdate, + &RootCriteriaDone, + &TabChangeCount, + ), + Added, + >, + root_advancement_query: Query, With)>, + children_query: Query<&Children>, + advancement_check_query: Query<(), With>, + root2_criteria: Query>, + root_criteria: Query>, +) { + let root_c = root_criteria.single(); + let root2_c = root2_criteria.single(); + for (mut advancement_client_update, root_criteria, tab_change) in clients.iter_mut() { + for root_advancement in root_advancement_query.iter() { + advancement_client_update.send_advancements( + root_advancement, + &children_query, + &advancement_check_query, + ); + if root_criteria.0 { + advancement_client_update.criteria_done(root_c); + } + if tab_change.0 > 5 { + advancement_client_update.criteria_done(root2_c); + } + } + } +} + +fn sneak( + mut sneaking: EventReader, + mut client: Query<(&mut AdvancementClientUpdate, &mut RootCriteriaDone)>, + root_criteria: Query>, + client_uuid: Query<&UniqueId>, + mut client_save: ResMut, +) { + let root_criteria = root_criteria.single(); + for sneaking in sneaking.read() { + if sneaking.state == SneakState::Stop { + continue; + } + let Ok((mut advancement_client_update, mut root_criteria_done)) = + client.get_mut(sneaking.client) + else { + continue; + }; + root_criteria_done.0 = !root_criteria_done.0; + match root_criteria_done.0 { + true => advancement_client_update.criteria_done(root_criteria), + false => advancement_client_update.criteria_undone(root_criteria), + } + client_save + .0 + .get_mut(&client_uuid.get(sneaking.client).unwrap().0) + .unwrap() + .0 = root_criteria_done.0; + } +} + +fn tab_change( + mut tab_change: EventReader, + mut client: Query<(&mut AdvancementClientUpdate, &mut TabChangeCount)>, + root2_criteria: Query>, + root: Query>, + client_uuid: Query<&UniqueId>, + mut client_save: ResMut, +) { + let root2_criteria = root2_criteria.single(); + let root = root.single(); + for tab_change in tab_change.read() { + let Ok((mut advancement_client_update, mut tab_change_count)) = + client.get_mut(tab_change.client) + else { + continue; + }; + if let Some(ref opened) = tab_change.opened_tab { + if opened.as_str() == "custom:root2" { + tab_change_count.0 += 1; + } else { + continue; + } + } else { + continue; + } + if tab_change_count.0 == 5 { + advancement_client_update.criteria_done(root2_criteria); + } else if tab_change_count.0 >= 10 { + advancement_client_update.force_tab_update = ForceTabUpdate::Spec(root); + } + client_save + .0 + .get_mut(&client_uuid.get(tab_change.client).unwrap().0) + .unwrap() + .1 = tab_change_count.0; + } +} diff --git a/vendor/valence/examples/anvil_loading.rs b/vendor/valence/examples/anvil_loading.rs new file mode 100644 index 00000000..d6245721 --- /dev/null +++ b/vendor/valence/examples/anvil_loading.rs @@ -0,0 +1,158 @@ +#![allow(clippy::type_complexity)] + +use std::path::PathBuf; + +use clap::Parser; +use valence::abilities::{FlyingSpeed, FovModifier, PlayerAbilitiesFlags}; +use valence::message::SendMessage; +use valence::prelude::*; +use valence_anvil::{AnvilLevel, ChunkLoadEvent, ChunkLoadStatus}; + +const SPAWN_POS: DVec3 = DVec3::new(0.0, 256.0, 0.0); + +#[derive(Parser, Resource)] +#[clap(author, version, about)] +struct Cli { + /// The path to a Minecraft world save containing a `region` subdirectory. + path: PathBuf, +} + +pub fn main() { + let cli = Cli::parse(); + + if !cli.path.exists() { + eprintln!( + "Directory `{}` does not exist. Exiting.", + cli.path.display() + ); + return; + } + + if !cli.path.is_dir() { + eprintln!("`{}` is not a directory. Exiting.", cli.path.display()); + return; + } + + App::new() + .add_plugins(DefaultPlugins) + .insert_resource(cli) + .add_systems(Startup, setup) + .add_systems( + Update, + ( + despawn_disconnected_clients, + (init_clients, handle_chunk_loads).chain(), + display_loaded_chunk_count, + ), + ) + .run(); +} + +fn setup( + mut commands: Commands, + dimensions: Res, + biomes: Res, + server: Res, + cli: Res, +) { + let layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + let mut level = AnvilLevel::new(&cli.path, &biomes); + + // Force a 16x16 area of chunks around the origin to be loaded at all times. + // This is similar to "spawn chunks" in vanilla. This isn't necessary for the + // example to function, but it's done to demonstrate that it's possible. + for z in -8..8 { + for x in -8..8 { + let pos = ChunkPos::new(x, z); + + level.ignored_chunks.insert(pos); + level.force_chunk_load(pos); + } + } + + commands.spawn((layer, level)); +} + +fn init_clients( + mut clients: Query< + ( + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut Position, + &mut GameMode, + &mut PlayerAbilitiesFlags, + &mut FlyingSpeed, + &mut FovModifier, + ), + Added, + >, + layers: Query>, +) { + for ( + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut pos, + mut game_mode, + mut abilities, + mut flying_speed, + mut fov_modifier, + ) in &mut clients + { + let layer = layers.single(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + pos.set(SPAWN_POS); + *game_mode = GameMode::Adventure; + abilities.set_allow_flying(true); + flying_speed.0 = 0.1; + fov_modifier.0 = 0.05; + } +} + +fn handle_chunk_loads( + mut events: EventReader, + mut layers: Query<&mut ChunkLayer, With>, +) { + let mut layer = layers.single_mut(); + + for event in events.read() { + match &event.status { + ChunkLoadStatus::Success { .. } => { + // The chunk was inserted into the world. Nothing for us to do. + } + ChunkLoadStatus::Empty => { + // There's no chunk here so let's insert an empty chunk. If we were doing + // terrain generation we would prepare that here. + layer.insert_chunk(event.pos, UnloadedChunk::new()); + } + ChunkLoadStatus::Failed(e) => { + // Something went wrong. + let errmsg = format!( + "failed to load chunk at ({}, {}): {e:#}", + event.pos.x, event.pos.z + ); + + eprintln!("{errmsg}"); + layer.send_chat_message(errmsg.color(Color::RED)); + + layer.insert_chunk(event.pos, UnloadedChunk::new()); + } + } + } +} + +// Display the number of loaded chunks in the action bar of all clients. +fn display_loaded_chunk_count(mut layers: Query<&mut ChunkLayer>, mut last_count: Local) { + let mut layer = layers.single_mut(); + + let cnt = layer.chunks().count(); + + if *last_count != cnt { + *last_count = cnt; + layer.send_action_bar_message("Chunk Count: ".into_text() + cnt.color(Color::LIGHT_PURPLE)); + } +} diff --git a/vendor/valence/examples/bench_players.rs b/vendor/valence/examples/bench_players.rs new file mode 100644 index 00000000..d5810c81 --- /dev/null +++ b/vendor/valence/examples/bench_players.rs @@ -0,0 +1,102 @@ +#![allow(clippy::type_complexity)] + +use std::time::Instant; + +use valence::client::{VisibleChunkLayer, VisibleEntityLayers}; +use valence::prelude::*; +use valence::ServerSettings; + +const SPAWN_Y: i32 = 64; + +#[derive(Resource)] +struct TickStart(Instant); + +fn main() { + App::new() + .insert_resource(ServerSettings { + compression_threshold: Default::default(), + ..Default::default() + }) + .insert_resource(NetworkSettings { + connection_mode: ConnectionMode::Offline, + max_connections: 50_000, + max_players: 50_000, + ..Default::default() + }) + .add_plugins(DefaultPlugins) + .add_systems(Startup, setup) + .add_systems(First, record_tick_start_time) + .add_systems(Update, (init_clients, despawn_disconnected_clients)) + .add_systems(Last, print_tick_time) + .run(); +} + +fn record_tick_start_time(mut commands: Commands) { + commands.insert_resource(TickStart(Instant::now())); +} + +fn print_tick_time(server: Res, time: Res, clients: Query<(), With>) { + let tick = server.current_tick(); + if tick % (server.tick_rate().get() as i64 / 2) == 0 { + let client_count = clients.iter().len(); + + let millis = time.0.elapsed().as_secs_f32() * 1000.0; + println!("Tick={tick}, MSPT={millis:.04}ms, Clients={client_count}"); + } +} + +fn setup( + mut commands: Commands, + server: Res, + dimensions: Res, + biomes: Res, +) { + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + for z in -5..5 { + for x in -5..5 { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + for z in -50..50 { + for x in -50..50 { + layer + .chunk + .set_block([x, SPAWN_Y, z], BlockState::GRASS_BLOCK); + } + } + + commands.spawn(layer); +} + +fn init_clients( + mut clients: Query< + ( + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut Position, + &mut GameMode, + ), + Added, + >, + layers: Query, With)>, +) { + for ( + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut pos, + mut game_mode, + ) in &mut clients + { + let layer = layers.single(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + pos.set([0.0, SPAWN_Y as f64 + 1.0, 0.0]); + *game_mode = GameMode::Creative; + } +} diff --git a/vendor/valence/examples/biomes.rs b/vendor/valence/examples/biomes.rs new file mode 100644 index 00000000..1e9c4439 --- /dev/null +++ b/vendor/valence/examples/biomes.rs @@ -0,0 +1,119 @@ +#![allow(clippy::type_complexity)] + +use rand::seq::IteratorRandom; +use rand::Rng; +use valence::prelude::*; +use valence::registry::biome::BiomeEffects; +use valence_server::BiomePos; + +const SPAWN_Y: i32 = 0; +const SIZE: i32 = 5; + +pub fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, setup) + .add_systems( + Update, + (init_clients, despawn_disconnected_clients, set_biomes), + ) + .run(); +} + +fn setup( + mut commands: Commands, + dimensions: Res, + mut biomes: ResMut, + server: Res, +) { + let colors = [ + 0xeb4034, 0xffffff, 0xe3d810, 0x1fdbde, 0x1121d1, 0xe60ed7, 0xe68f0e, 0x840ee6, 0x0ee640, + ]; + + biomes.clear(); + + // Client will be sad if you don't have a "plains" biome. + biomes.insert(ident!("plains"), Biome::default()); + + for color in colors { + let name = Ident::new(format!("biome_{color:x}")).unwrap(); + + let biome = Biome { + effects: BiomeEffects { + grass_color: Some(color), + ..Default::default() + }, + ..Default::default() + }; + + biomes.insert(name, biome); + } + + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + for z in -SIZE..SIZE { + for x in -SIZE..SIZE { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + for x in -SIZE * 16..SIZE * 16 { + for z in -SIZE * 16..SIZE * 16 { + layer + .chunk + .set_block([x, SPAWN_Y, z], BlockState::GRASS_BLOCK); + } + } + + commands.spawn(layer); +} + +fn set_biomes(mut layers: Query<&mut ChunkLayer>, biomes: Res) { + let mut layer = layers.single_mut(); + + let mut rng = rand::thread_rng(); + + for _ in 0..10 { + let x = rng.gen_range(-SIZE * 4..SIZE * 4); + let z = rng.gen_range(-SIZE * 4..SIZE * 4); + + let biome = biomes + .iter() + .choose(&mut rng) + .map(|(biome, _, _)| biome) + .unwrap_or_default(); + + layer.set_biome(BiomePos::new(x, SPAWN_Y / 4, z), biome); + } +} + +fn init_clients( + mut clients: Query< + ( + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut Position, + &mut GameMode, + ), + Added, + >, + layers: Query, With)>, +) { + for ( + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut pos, + mut game_mode, + ) in &mut clients + { + let layer = layers.single(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + pos.set([0.0, SPAWN_Y as f64 + 1.0, 0.0]); + *game_mode = GameMode::Creative; + } +} diff --git a/vendor/valence/examples/block_entities.rs b/vendor/valence/examples/block_entities.rs new file mode 100644 index 00000000..54f9b414 --- /dev/null +++ b/vendor/valence/examples/block_entities.rs @@ -0,0 +1,164 @@ +#![allow(clippy::type_complexity)] + +use valence::interact_block::InteractBlockEvent; +use valence::message::ChatMessageEvent; +use valence::nbt::{compound, List}; +use valence::prelude::*; + +const FLOOR_Y: i32 = 64; +const SIGN_POS: [i32; 3] = [3, FLOOR_Y + 1, 2]; +const SKULL_POS: BlockPos = BlockPos::new(3, FLOOR_Y + 1, 3); + +pub fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, setup) + .add_systems( + Update, + (event_handler, init_clients, despawn_disconnected_clients), + ) + .run(); +} + +fn setup( + mut commands: Commands, + server: Res, + dimensions: Res, + biomes: Res, +) { + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + for z in -5..5 { + for x in -5..5 { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + for z in 0..16 { + for x in 0..8 { + layer + .chunk + .set_block([x, FLOOR_Y, z], BlockState::WHITE_CONCRETE); + } + } + + layer.chunk.set_block( + [3, FLOOR_Y + 1, 1], + BlockState::CHEST.set(PropName::Facing, PropValue::West), + ); + + layer.chunk.set_block( + SIGN_POS, + Block { + state: BlockState::OAK_SIGN.set(PropName::Rotation, PropValue::_4), + nbt: Some(compound! { + "front_text" => compound! { + "messages" => List::String(vec![ + // All 4 lines are required, otherwise no text is displayed. + "Type in chat:".color(Color::RED).into(), + "".into_text().into(), + "".into_text().into(), + "".into_text().into(), + ]), + } + }), + }, + ); + + layer.chunk.set_block( + SKULL_POS, + BlockState::PLAYER_HEAD.set(PropName::Rotation, PropValue::_12), + ); + + commands.spawn(layer); +} + +fn init_clients( + mut clients: Query< + ( + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut Position, + &mut GameMode, + ), + Added, + >, + layers: Query, With)>, +) { + for ( + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut pos, + mut game_mode, + ) in &mut clients + { + let layer = layers.single(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + pos.set([0.0, FLOOR_Y as f64 + 1.0, 0.0]); + *game_mode = GameMode::Creative; + } +} + +fn event_handler( + clients: Query<(&Username, &Properties, &UniqueId)>, + mut messages: EventReader, + mut block_interacts: EventReader, + mut layers: Query<&mut ChunkLayer>, +) { + let mut layer = layers.single_mut(); + + for ChatMessageEvent { + client, message, .. + } in messages.read() + { + let Ok((username, _, _)) = clients.get(*client) else { + continue; + }; + + let nbt = layer.block_entity_mut(SIGN_POS).unwrap(); + nbt.merge(compound! { + "front_text" => compound! { + "messages" => List::String(vec![ + "Type in chat:".color(Color::RED).into(), + message.to_string().color(Color::DARK_GREEN).into(), + format!("~{username}").italic().into(), + "".into_text().into(), + ]), + }, + }); + } + + for InteractBlockEvent { + client, + position, + hand, + .. + } in block_interacts.read() + { + if *hand == Hand::Main && *position == SKULL_POS { + let Ok((_, properties, uuid)) = clients.get(*client) else { + continue; + }; + + let Some(textures) = properties.textures() else { + continue; + }; + + *layer.block_entity_mut(SKULL_POS).unwrap() = compound! { + "SkullOwner" => compound! { + "Id" => uuid.0, + "Properties" => compound! { + "textures" => List::Compound(vec![compound! { + "Value" => textures.value.clone(), + }]) + } + } + }; + } + } +} diff --git a/vendor/valence/examples/boss_bar.rs b/vendor/valence/examples/boss_bar.rs new file mode 100644 index 00000000..868e9a49 --- /dev/null +++ b/vendor/valence/examples/boss_bar.rs @@ -0,0 +1,223 @@ +#![allow(clippy::type_complexity)] + +use rand::seq::SliceRandom; +use valence::prelude::*; +use valence_boss_bar::{ + BossBarBundle, BossBarColor, BossBarDivision, BossBarFlags, BossBarHealth, BossBarStyle, + BossBarTitle, +}; +use valence_server::entity::cow::CowEntityBundle; +use valence_server::message::ChatMessageEvent; +use valence_text::color::NamedColor; + +const SPAWN_Y: i32 = 64; + +#[derive(Component)] +struct CustomBossBar; + +pub fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, setup) + .add_systems( + Update, + (init_clients, despawn_disconnected_clients, listen_messages), + ) + .run(); +} + +fn setup( + mut commands: Commands, + server: Res, + dimensions: Res, + biomes: Res, +) { + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + for z in -5..5 { + for x in -5..5 { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + for z in -25..25 { + for x in -25..25 { + layer + .chunk + .set_block([x, SPAWN_Y, z], BlockState::GRASS_BLOCK); + } + } + + let layer_id = commands.spawn(layer).id(); + + commands.spawn(( + BossBarBundle { + title: BossBarTitle("Boss Bar".into_text()), + health: BossBarHealth(0.5), + layer: EntityLayerId(layer_id), + ..Default::default() + }, + CustomBossBar, + )); + + commands.spawn(( + CowEntityBundle { + position: Position::new([0.0, SPAWN_Y as f64 + 1.0, 0.0]), + layer: EntityLayerId(layer_id), + ..Default::default() + }, + BossBarTitle("Louis XVI".color(NamedColor::Red)), + BossBarHealth(0.5), + BossBarStyle { + color: BossBarColor::Red, + division: BossBarDivision::default(), + }, + BossBarFlags::default(), + )); +} + +fn init_clients( + mut clients_query: Query< + ( + &mut Client, + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut Position, + &mut GameMode, + ), + Added, + >, + layers_query: Query, With)>, +) { + let layer = layers_query.single(); + + for ( + mut client, + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut pos, + mut game_mode, + ) in &mut clients_query + { + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + pos.set([0.5, SPAWN_Y as f64 + 1.0, 0.5]); + *game_mode = GameMode::Creative; + + client.send_chat_message( + "Type 'view' to toggle bar display" + .on_click_suggest_command("view") + .on_hover_show_text("Type 'view'"), + ); + client.send_chat_message( + "Type 'color' to set a random color" + .on_click_suggest_command("color") + .on_hover_show_text("Type 'color'"), + ); + client.send_chat_message( + "Type 'division' to set a random division" + .on_click_suggest_command("division") + .on_hover_show_text("Type 'division'"), + ); + client.send_chat_message( + "Type 'flags' to set random flags" + .on_click_suggest_command("flags") + .on_hover_show_text("Type 'flags'"), + ); + client.send_chat_message( + "Type any string to set the title".on_click_suggest_command("title"), + ); + client.send_chat_message( + "Type any number between 0 and 1 to set the health".on_click_suggest_command("health"), + ); + } +} + +fn listen_messages( + mut message_events: EventReader, + mut boss_bars_query: Query< + ( + &mut BossBarStyle, + &mut BossBarFlags, + &mut BossBarHealth, + &mut BossBarTitle, + &EntityLayerId, + ), + With, + >, + mut clients_query: Query<&mut VisibleEntityLayers, With>, +) { + let ( + mut boss_bar_style, + mut boss_bar_flags, + mut boss_bar_health, + mut boss_bar_title, + entity_layer_id, + ) = boss_bars_query.single_mut(); + + for ChatMessageEvent { + client, message, .. + } in message_events.read() + { + match message.as_ref() { + "view" => { + if let Ok(mut visible_entity_layers) = clients_query.get_mut(*client) { + if visible_entity_layers.0.contains(&entity_layer_id.0) { + visible_entity_layers.0.remove(&entity_layer_id.0); + } else { + visible_entity_layers.0.insert(entity_layer_id.0); + } + } + } + "color" => { + let mut colors = vec![ + BossBarColor::Pink, + BossBarColor::Blue, + BossBarColor::Red, + BossBarColor::Green, + BossBarColor::Yellow, + ]; + colors.retain(|c| *c != boss_bar_style.color); + + let random_color = colors.choose(&mut rand::thread_rng()).unwrap(); + + boss_bar_style.color = *random_color; + } + "division" => { + let mut divisions = vec![ + BossBarDivision::NoDivision, + BossBarDivision::SixNotches, + BossBarDivision::TenNotches, + BossBarDivision::TwelveNotches, + BossBarDivision::TwentyNotches, + ]; + divisions.retain(|d| *d != boss_bar_style.division); + + let random_division = divisions.choose(&mut rand::thread_rng()).unwrap(); + + boss_bar_style.division = *random_division; + } + "flags" => { + let darken_sky: bool = rand::random(); + let dragon_bar: bool = rand::random(); + let create_fog: bool = rand::random(); + + boss_bar_flags.set_darken_sky(darken_sky); + boss_bar_flags.set_dragon_bar(dragon_bar); + boss_bar_flags.set_create_fog(create_fog); + } + _ => { + if let Ok(health) = message.parse::() { + if (0.0..=1.0).contains(&health) { + boss_bar_health.0 = health; + } + } else { + boss_bar_title.0 = message.to_string().into_text(); + } + } + }; + } +} diff --git a/vendor/valence/examples/building.rs b/vendor/valence/examples/building.rs new file mode 100644 index 00000000..de4f69c7 --- /dev/null +++ b/vendor/valence/examples/building.rs @@ -0,0 +1,173 @@ +#![allow(clippy::type_complexity)] + +use valence::interact_block::InteractBlockEvent; +use valence::inventory::HeldItem; +use valence::prelude::*; + +const SPAWN_Y: i32 = 64; + +pub fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, setup) + .add_systems( + Update, + ( + init_clients, + despawn_disconnected_clients, + toggle_gamemode_on_sneak, + digging, + place_blocks, + ), + ) + .run(); +} + +fn setup( + mut commands: Commands, + server: Res, + dimensions: Res, + biomes: Res, +) { + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + for z in -5..5 { + for x in -5..5 { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + for z in -50..50 { + for x in -50..50 { + layer + .chunk + .set_block([x, SPAWN_Y, z], BlockState::GRASS_BLOCK); + } + } + + commands.spawn(layer); +} + +fn init_clients( + mut clients: Query< + ( + &mut Client, + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut Position, + &mut GameMode, + ), + Added, + >, + layers: Query, With)>, +) { + for ( + mut client, + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut pos, + mut game_mode, + ) in &mut clients + { + let layer = layers.single(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + pos.set([0.0, SPAWN_Y as f64 + 1.0, 0.0]); + *game_mode = GameMode::Creative; + + client.send_chat_message("Welcome to Valence! Build something cool.".italic()); + } +} + +fn toggle_gamemode_on_sneak( + mut clients: Query<&mut GameMode>, + mut events: EventReader, +) { + for event in events.read() { + let Ok(mut mode) = clients.get_mut(event.client) else { + continue; + }; + if event.state == SneakState::Start { + *mode = match *mode { + GameMode::Survival => GameMode::Creative, + GameMode::Creative => GameMode::Survival, + _ => GameMode::Creative, + }; + } + } +} + +fn digging( + clients: Query<&GameMode>, + mut layers: Query<&mut ChunkLayer>, + mut events: EventReader, +) { + let mut layer = layers.single_mut(); + + for event in events.read() { + let Ok(game_mode) = clients.get(event.client) else { + continue; + }; + + if (*game_mode == GameMode::Creative && event.state == DiggingState::Start) + || (*game_mode == GameMode::Survival && event.state == DiggingState::Stop) + { + layer.set_block(event.position, BlockState::AIR); + } + } +} + +fn place_blocks( + mut clients: Query<(&mut Inventory, &GameMode, &HeldItem)>, + mut layers: Query<&mut ChunkLayer>, + mut events: EventReader, +) { + let mut layer = layers.single_mut(); + + for event in events.read() { + let Ok((mut inventory, game_mode, held)) = clients.get_mut(event.client) else { + continue; + }; + if event.hand != Hand::Main { + continue; + } + + // get the held item + let slot_id = held.slot(); + let stack = inventory.slot(slot_id); + if stack.is_empty() { + // no item in the slot + continue; + }; + + let Some(block_kind) = BlockKind::from_item_kind(stack.item) else { + // can't place this item as a block + continue; + }; + + if *game_mode == GameMode::Survival { + // check if the player has the item in their inventory and remove + // it. + if stack.count > 1 { + let amount = stack.count - 1; + inventory.set_slot_amount(slot_id, amount); + } else { + inventory.set_slot(slot_id, ItemStack::EMPTY); + } + } + let real_pos = event.position.get_in_direction(event.face); + let state = block_kind.to_state().set( + PropName::Axis, + match event.face { + Direction::Down | Direction::Up => PropValue::Y, + Direction::North | Direction::South => PropValue::Z, + Direction::West | Direction::East => PropValue::X, + }, + ); + layer.set_block(real_pos, state); + } +} diff --git a/vendor/valence/examples/chest.rs b/vendor/valence/examples/chest.rs new file mode 100644 index 00000000..15910ce3 --- /dev/null +++ b/vendor/valence/examples/chest.rs @@ -0,0 +1,121 @@ +#![allow(clippy::type_complexity)] + +use valence::interact_block::InteractBlockEvent; +use valence::prelude::*; + +const SPAWN_Y: i32 = 64; +const CHEST_POS: [i32; 3] = [0, SPAWN_Y + 1, 3]; + +pub fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, setup) + .add_systems( + Update, + ( + init_clients, + toggle_gamemode_on_sneak, + open_chest, + despawn_disconnected_clients, + ), + ) + .run(); +} + +fn setup( + mut commands: Commands, + server: Res, + dimensions: Res, + biomes: Res, +) { + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + for z in -5..5 { + for x in -5..5 { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + for z in -25..25 { + for x in -25..25 { + layer + .chunk + .set_block([x, SPAWN_Y, z], BlockState::GRASS_BLOCK); + } + } + + layer.chunk.set_block(CHEST_POS, BlockState::CHEST); + + commands.spawn(layer); + + let inventory = Inventory::with_title( + InventoryKind::Generic9x3, + "Extra".italic() + " Chesty".not_italic().bold().color(Color::RED) + " Chest".not_italic(), + ); + + commands.spawn(inventory); +} + +fn init_clients( + mut clients: Query< + ( + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut Position, + &mut GameMode, + ), + Added, + >, + layers: Query, With)>, +) { + for ( + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut pos, + mut game_mode, + ) in &mut clients + { + let layer = layers.single(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + pos.set([0.0, SPAWN_Y as f64 + 1.0, 0.0]); + *game_mode = GameMode::Creative; + } +} + +fn toggle_gamemode_on_sneak( + mut clients: Query<&mut GameMode>, + mut events: EventReader, +) { + for event in events.read() { + let Ok(mut mode) = clients.get_mut(event.client) else { + continue; + }; + + if event.state == SneakState::Start { + *mode = match *mode { + GameMode::Survival => GameMode::Creative, + GameMode::Creative => GameMode::Survival, + _ => GameMode::Creative, + }; + } + } +} + +fn open_chest( + mut commands: Commands, + inventories: Query, Without)>, + mut events: EventReader, +) { + for event in events.read() { + if event.position != CHEST_POS.into() { + continue; + } + let open_inventory = OpenInventory::new(inventories.single()); + commands.entity(event.client).insert(open_inventory); + } +} diff --git a/vendor/valence/examples/combat.rs b/vendor/valence/examples/combat.rs new file mode 100644 index 00000000..60573a0e --- /dev/null +++ b/vendor/valence/examples/combat.rs @@ -0,0 +1,181 @@ +#![allow(clippy::type_complexity)] + +use bevy_ecs::query::WorldQuery; +use rand::Rng; +use valence::entity::EntityStatuses; +use valence::math::Vec3Swizzles; +use valence::prelude::*; + +const SPAWN_Y: i32 = 64; +const ARENA_RADIUS: i32 = 32; + +/// Attached to every client. +#[derive(Component)] +struct CombatState { + /// The tick the client was last attacked. + last_attacked_tick: i64, + has_bonus_knockback: bool, +} + +pub fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, setup) + .add_systems(EventLoopUpdate, handle_combat_events) + .add_systems( + Update, + ( + init_clients, + despawn_disconnected_clients, + teleport_oob_clients, + ), + ) + .run(); +} + +fn setup( + mut commands: Commands, + server: Res, + dimensions: Res, + biomes: Res, +) { + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + for z in -5..5 { + for x in -5..5 { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + let mut rng = rand::thread_rng(); + + // Create circular arena. + for z in -ARENA_RADIUS..ARENA_RADIUS { + for x in -ARENA_RADIUS..ARENA_RADIUS { + let dist = f64::hypot(x as _, z as _) / ARENA_RADIUS as f64; + + if dist > 1.0 { + continue; + } + + let block = if rng.gen::() < dist { + BlockState::STONE + } else { + BlockState::DEEPSLATE + }; + + for y in 0..SPAWN_Y { + layer.chunk.set_block([x, y, z], block); + } + } + } + + commands.spawn(layer); +} + +fn init_clients( + mut clients: Query< + ( + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut Position, + &mut GameMode, + ), + Added, + >, + layers: Query, With)>, +) { + for ( + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut pos, + mut game_mode, + ) in &mut clients + { + let layer = layers.single(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + pos.set([0.0, SPAWN_Y as f64 + 1.0, 0.0]); + *game_mode = GameMode::Creative; + } +} + +#[derive(WorldQuery)] +#[world_query(mutable)] +struct CombatQuery { + client: &'static mut Client, + pos: &'static Position, + state: &'static mut CombatState, + statuses: &'static mut EntityStatuses, +} + +fn handle_combat_events( + server: Res, + mut clients: Query, + mut sprinting: EventReader, + mut interact_entity: EventReader, +) { + for &SprintEvent { client, state } in sprinting.read() { + if let Ok(mut client) = clients.get_mut(client) { + client.state.has_bonus_knockback = state == SprintState::Start; + } + } + + for &InteractEntityEvent { + client: attacker_client, + entity: victim_client, + .. + } in interact_entity.read() + { + let Ok([mut attacker, mut victim]) = clients.get_many_mut([attacker_client, victim_client]) + else { + // Victim or attacker does not exist, or the attacker is attacking itself. + continue; + }; + + if server.current_tick() - victim.state.last_attacked_tick < 10 { + // Victim is still on attack cooldown. + continue; + } + + victim.state.last_attacked_tick = server.current_tick(); + + let victim_pos = victim.pos.0.xz(); + let attacker_pos = attacker.pos.0.xz(); + + let dir = (victim_pos - attacker_pos).normalize().as_vec2(); + + let knockback_xz = if attacker.state.has_bonus_knockback { + 18.0 + } else { + 8.0 + }; + let knockback_y = if attacker.state.has_bonus_knockback { + 8.432 + } else { + 6.432 + }; + + victim + .client + .set_velocity([dir.x * knockback_xz, knockback_y, dir.y * knockback_xz]); + + attacker.state.has_bonus_knockback = false; + + victim.client.trigger_status(EntityStatus::PlayAttackSound); + + victim.statuses.trigger(EntityStatus::PlayAttackSound); + } +} + +fn teleport_oob_clients(mut clients: Query<&mut Position, With>) { + for mut pos in &mut clients { + if pos.0.y < 0.0 { + pos.set([0.0, SPAWN_Y as _, 0.0]); + } + } +} diff --git a/vendor/valence/examples/command.rs b/vendor/valence/examples/command.rs new file mode 100644 index 00000000..76402c8a --- /dev/null +++ b/vendor/valence/examples/command.rs @@ -0,0 +1,676 @@ +#![allow(clippy::type_complexity)] + +use std::ops::DerefMut; + +use command::graph::CommandGraphBuilder; +use command::handler::CommandResultEvent; +use command::parsers::entity_selector::{EntitySelector, EntitySelectors}; +use command::parsers::{CommandArg, GreedyString, QuotableString}; +use command::scopes::CommandScopes; +use command::{parsers, AddCommand, Command, CommandScopeRegistry, ModifierValue}; +use command_macros::Command; +use parsers::{Vec2 as Vec2Parser, Vec3 as Vec3Parser}; +use rand::prelude::IteratorRandom; +use valence::entity::living::LivingEntity; +use valence::prelude::*; +use valence::*; +use valence_server::op_level::OpLevel; + +const SPAWN_Y: i32 = 64; + +#[derive(Command, Debug, Clone)] +#[paths("teleport", "tp")] +#[scopes("valence.command.teleport")] +enum TeleportCommand { + #[paths = "{location}"] + ExecutorToLocation { location: Vec3Parser }, + #[paths = "{target}"] + ExecutorToTarget { target: EntitySelector }, + #[paths = "{from} {to}"] + TargetToTarget { + from: EntitySelector, + to: EntitySelector, + }, + #[paths = "{target} {location}"] + TargetToLocation { + target: EntitySelector, + location: Vec3Parser, + }, +} + +#[derive(Command, Debug, Clone)] +#[paths("gamemode", "gm")] +#[scopes("valence.command.gamemode")] +enum GamemodeCommand { + #[paths("survival {target?}", "{/} gms {target?}")] + Survival { target: Option }, + #[paths("creative {target?}", "{/} gmc {target?}")] + Creative { target: Option }, + #[paths("adventure {target?}", "{/} gma {target?}")] + Adventure { target: Option }, + #[paths("spectator {target?}", "{/} gmspec {target?}")] + Spectator { target: Option }, +} + +#[derive(Command, Debug, Clone)] +#[paths("struct {gamemode} {target?}")] +#[scopes("valence.command.gamemode")] +#[allow(dead_code)] +pub(crate) struct StructCommand { + gamemode: GameMode, + target: Option, +} + +#[derive(Command, Debug, Clone)] +#[paths("test", "t")] +#[scopes("valence.command.test")] +#[allow(dead_code)] +enum TestCommand { + // 3 literals with an arg each + #[paths("a {a} b {b} c {c}", "{a} {b} {c}")] + A { a: String, b: i32, c: f32 }, + // 2 literals with an arg last being optional (Because of the greedy string before the end + // this is technically unreachable) + #[paths = "a {a} {b} b {c?}"] + B { + a: Vec3Parser, + b: GreedyString, + c: Option, + }, + // greedy string optional arg + #[paths = "a {a} b {b?}"] + C { a: String, b: Option }, + // greedy string required arg + #[paths = "a {a} b {b}"] + D { a: String, b: GreedyString }, + // five optional args and an ending greedyString + #[paths("options {a?} {b?} {c?} {d?} {e?}", "options {b?} {a?} {d?} {c?} {e?}")] + E { + a: Option, + b: Option, + c: Option, + d: Option, + e: Option, + }, +} + +#[derive(Debug, Clone)] +enum ComplexRedirectionCommand { + A(Vec3Parser), + B, + C(Vec2Parser), + D, + E(Vec3Parser), +} + +impl Command for ComplexRedirectionCommand { + fn assemble_graph(graph: &mut CommandGraphBuilder) + where + Self: Sized, + { + let root = graph.root().id(); + + let command_root = graph + .literal("complex") + .with_scopes(vec!["valence.command.complex"]) + .id(); + let a = graph.literal("a").id(); + + graph + .at(a) + .argument("a") + .with_parser::() + .with_executable(|input| { + ComplexRedirectionCommand::A(Vec3Parser::parse_arg(input).unwrap()) + }); + + let b = graph.literal("b").id(); + + graph + .at(b) + .with_executable(|_| ComplexRedirectionCommand::B); + graph.at(b).redirect_to(root); + + let c = graph.literal("c").id(); + + graph + .at(c) + .argument("c") + .with_parser::() + .with_executable(|input| { + ComplexRedirectionCommand::C(Vec2Parser::parse_arg(input).unwrap()) + }); + + let d = graph + .at(command_root) + .literal("d") + .with_modifier(|_, modifiers| { + let entry = modifiers.entry("d_pass_count".into()).or_insert(0.into()); + if let ModifierValue::I32(i) = entry { + *i += 1; + } + }) + .id(); + + graph + .at(d) + .with_executable(|_| ComplexRedirectionCommand::D); + graph.at(d).redirect_to(command_root); + + let e = graph.literal("e").id(); + + graph + .at(e) + .argument("e") + .with_parser::() + .with_executable(|input| { + ComplexRedirectionCommand::E(Vec3Parser::parse_arg(input).unwrap()) + }); + } +} + +pub fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_command::() + .add_command::() + .add_command::() + .add_command::() + .add_command::() + .add_systems(Startup, setup) + .add_systems( + Update, + ( + init_clients, + despawn_disconnected_clients, + // Command handlers + handle_test_command, + handle_teleport_command, + handle_complex_command, + handle_gamemode_command, + handle_struct_command, + ), + ) + .run(); +} + +enum TeleportTarget { + Targets(Vec), +} + +#[derive(Debug)] +enum TeleportDestination { + Location(Vec3Parser), + Target(Option), +} + +fn handle_teleport_command( + mut events: EventReader>, + living_entities: Query>, + mut clients: Query<(Entity, &mut Client)>, + entity_layers: Query<&EntityLayerId>, + mut positions: Query<&mut Position>, + usernames: Query<(Entity, &Username)>, +) { + for event in events.read() { + let compiled_command = match &event.result { + TeleportCommand::ExecutorToLocation { location } => ( + TeleportTarget::Targets(vec![event.executor]), + TeleportDestination::Location(*location), + ), + TeleportCommand::ExecutorToTarget { target } => ( + TeleportTarget::Targets(vec![event.executor]), + TeleportDestination::Target( + find_targets( + &living_entities, + &mut clients, + &positions, + &entity_layers, + &usernames, + event, + target, + ) + .first() + .copied(), + ), + ), + TeleportCommand::TargetToTarget { from, to } => ( + TeleportTarget::Targets( + find_targets( + &living_entities, + &mut clients, + &positions, + &entity_layers, + &usernames, + event, + from, + ) + .to_vec(), + ), + TeleportDestination::Target( + find_targets( + &living_entities, + &mut clients, + &positions, + &entity_layers, + &usernames, + event, + to, + ) + .first() + .copied(), + ), + ), + TeleportCommand::TargetToLocation { target, location } => ( + TeleportTarget::Targets( + find_targets( + &living_entities, + &mut clients, + &positions, + &entity_layers, + &usernames, + event, + target, + ) + .to_vec(), + ), + TeleportDestination::Location(*location), + ), + }; + + let (TeleportTarget::Targets(targets), destination) = compiled_command; + + println!( + "executing teleport command {:#?} -> {:#?}", + targets, destination + ); + match destination { + TeleportDestination::Location(location) => { + for target in targets { + let mut pos = positions.get_mut(target).unwrap(); + pos.0.x = location.x.get(pos.0.x as f32) as f64; + pos.0.y = location.y.get(pos.0.y as f32) as f64; + pos.0.z = location.z.get(pos.0.z as f32) as f64; + } + } + TeleportDestination::Target(target) => { + let target = target.unwrap(); + let target_pos = **positions.get(target).unwrap(); + for target in targets { + let mut position = positions.get_mut(target).unwrap(); + position.0 = target_pos; + } + } + } + } +} + +fn find_targets( + living_entities: &Query>, + clients: &mut Query<(Entity, &mut Client)>, + positions: &Query<&mut Position>, + entity_layers: &Query<&EntityLayerId>, + usernames: &Query<(Entity, &Username)>, + event: &CommandResultEvent, + target: &EntitySelector, +) -> Vec { + match target { + EntitySelector::SimpleSelector(selector) => match selector { + EntitySelectors::AllEntities => { + let executor_entity_layer = *entity_layers.get(event.executor).unwrap(); + living_entities + .iter() + .filter(|entity| { + let entity_layer = entity_layers.get(*entity).unwrap(); + entity_layer.0 == executor_entity_layer.0 + }) + .collect() + } + EntitySelectors::SinglePlayer(name) => { + let target = usernames.iter().find(|(_, username)| username.0 == *name); + match target { + None => { + let client = &mut clients.get_mut(event.executor).unwrap().1; + client.send_chat_message(format!("Could not find target: {}", name)); + vec![] + } + Some(target_entity) => { + vec![target_entity.0] + } + } + } + EntitySelectors::AllPlayers => { + let executor_entity_layer = *entity_layers.get(event.executor).unwrap(); + clients + .iter_mut() + .filter_map(|(entity, ..)| { + let entity_layer = entity_layers.get(entity).unwrap(); + if entity_layer.0 == executor_entity_layer.0 { + Some(entity) + } else { + None + } + }) + .collect() + } + EntitySelectors::SelfPlayer => { + vec![event.executor] + } + EntitySelectors::NearestPlayer => { + let executor_entity_layer = *entity_layers.get(event.executor).unwrap(); + let executor_pos = positions.get(event.executor).unwrap(); + let target = clients + .iter_mut() + .filter(|(entity, ..)| { + *entity_layers.get(*entity).unwrap() == executor_entity_layer + }) + .filter(|(target, ..)| *target != event.executor) + .map(|(target, ..)| target) + .min_by(|target, target2| { + let target_pos = positions.get(*target).unwrap(); + let target2_pos = positions.get(*target2).unwrap(); + let target_dist = target_pos.distance(**executor_pos); + let target2_dist = target2_pos.distance(**executor_pos); + target_dist.partial_cmp(&target2_dist).unwrap() + }); + match target { + None => { + let mut client = clients.get_mut(event.executor).unwrap().1; + client.send_chat_message("Could not find target".to_string()); + vec![] + } + Some(target_entity) => { + vec![target_entity] + } + } + } + EntitySelectors::RandomPlayer => { + let executor_entity_layer = *entity_layers.get(event.executor).unwrap(); + let target = clients + .iter_mut() + .filter(|(entity, ..)| { + *entity_layers.get(*entity).unwrap() == executor_entity_layer + }) + .choose(&mut rand::thread_rng()) + .map(|(target, ..)| target); + match target { + None => { + let mut client = clients.get_mut(event.executor).unwrap().1; + client.send_chat_message("Could not find target".to_string()); + vec![] + } + Some(target_entity) => { + vec![target_entity] + } + } + } + }, + EntitySelector::ComplexSelector(_, _) => { + let mut client = clients.get_mut(event.executor).unwrap().1; + client.send_chat_message("complex selector not implemented".to_string()); + vec![] + } + } +} + +fn handle_test_command( + mut events: EventReader>, + mut clients: Query<&mut Client>, +) { + for event in events.read() { + let client = &mut clients.get_mut(event.executor).unwrap(); + client.send_chat_message(format!( + "Test command executed with data:\n {:#?}", + &event.result + )); + } +} + +fn handle_complex_command( + mut events: EventReader>, + mut clients: Query<&mut Client>, +) { + for event in events.read() { + let client = &mut clients.get_mut(event.executor).unwrap(); + client.send_chat_message(format!( + "complex command executed with data:\n {:#?}\n and with the modifiers:\n {:#?}", + &event.result, &event.modifiers + )); + } +} + +fn handle_struct_command( + mut events: EventReader>, + mut clients: Query<&mut Client>, +) { + for event in events.read() { + let client = &mut clients.get_mut(event.executor).unwrap(); + client.send_chat_message(format!( + "Struct command executed with data:\n {:#?}", + &event.result + )); + } +} + +fn handle_gamemode_command( + mut events: EventReader>, + mut clients: Query<(&mut Client, &mut GameMode, &Username, Entity)>, + positions: Query<&Position>, +) { + for event in events.read() { + let game_mode_to_set = match &event.result { + GamemodeCommand::Survival { .. } => GameMode::Survival, + GamemodeCommand::Creative { .. } => GameMode::Creative, + GamemodeCommand::Adventure { .. } => GameMode::Adventure, + GamemodeCommand::Spectator { .. } => GameMode::Spectator, + }; + + let selector = match &event.result { + GamemodeCommand::Survival { target } => target.clone(), + GamemodeCommand::Creative { target } => target.clone(), + GamemodeCommand::Adventure { target } => target.clone(), + GamemodeCommand::Spectator { target } => target.clone(), + }; + + match selector { + None => { + let (mut client, mut game_mode, ..) = clients.get_mut(event.executor).unwrap(); + *game_mode = game_mode_to_set; + client.send_chat_message(format!( + "Gamemode command executor -> self executed with data:\n {:#?}", + &event.result + )); + } + Some(selector) => match selector { + EntitySelector::SimpleSelector(selector) => match selector { + EntitySelectors::AllEntities => { + for (mut client, mut game_mode, ..) in &mut clients.iter_mut() { + *game_mode = game_mode_to_set; + client.send_chat_message(format!( + "Gamemode command executor -> all entities executed with data:\n \ + {:#?}", + &event.result + )); + } + } + EntitySelectors::SinglePlayer(name) => { + let target = clients + .iter_mut() + .find(|(.., username, _)| username.0 == *name) + .map(|(.., target)| target); + + match target { + None => { + let client = &mut clients.get_mut(event.executor).unwrap().0; + client + .send_chat_message(format!("Could not find target: {}", name)); + } + Some(target) => { + let mut game_mode = clients.get_mut(target).unwrap().1; + *game_mode = game_mode_to_set; + + let client = &mut clients.get_mut(event.executor).unwrap().0; + client.send_chat_message(format!( + "Gamemode command executor -> single player executed with \ + data:\n {:#?}", + &event.result + )); + } + } + } + EntitySelectors::AllPlayers => { + for (mut client, mut game_mode, ..) in &mut clients.iter_mut() { + *game_mode = game_mode_to_set; + client.send_chat_message(format!( + "Gamemode command executor -> all entities executed with data:\n \ + {:#?}", + &event.result + )); + } + } + EntitySelectors::SelfPlayer => { + let (mut client, mut game_mode, ..) = + clients.get_mut(event.executor).unwrap(); + *game_mode = game_mode_to_set; + client.send_chat_message(format!( + "Gamemode command executor -> self executed with data:\n {:#?}", + &event.result + )); + } + EntitySelectors::NearestPlayer => { + let executor_pos = positions.get(event.executor).unwrap(); + let target = clients + .iter_mut() + .filter(|(.., target)| *target != event.executor) + .min_by(|(.., target), (.., target2)| { + let target_pos = positions.get(*target).unwrap(); + let target2_pos = positions.get(*target2).unwrap(); + let target_dist = target_pos.distance(**executor_pos); + let target2_dist = target2_pos.distance(**executor_pos); + target_dist.partial_cmp(&target2_dist).unwrap() + }) + .map(|(.., target)| target); + + match target { + None => { + let client = &mut clients.get_mut(event.executor).unwrap().0; + client.send_chat_message("Could not find target".to_string()); + } + Some(target) => { + let mut game_mode = clients.get_mut(target).unwrap().1; + *game_mode = game_mode_to_set; + + let client = &mut clients.get_mut(event.executor).unwrap().0; + client.send_chat_message(format!( + "Gamemode command executor -> single player executed with \ + data:\n {:#?}", + &event.result + )); + } + } + } + EntitySelectors::RandomPlayer => { + let target = clients + .iter_mut() + .choose(&mut rand::thread_rng()) + .map(|(.., target)| target); + + match target { + None => { + let client = &mut clients.get_mut(event.executor).unwrap().0; + client.send_chat_message("Could not find target".to_string()); + } + Some(target) => { + let mut game_mode = clients.get_mut(target).unwrap().1; + *game_mode = game_mode_to_set; + + let client = &mut clients.get_mut(event.executor).unwrap().0; + client.send_chat_message(format!( + "Gamemode command executor -> single player executed with \ + data:\n {:#?}", + &event.result + )); + } + } + } + }, + EntitySelector::ComplexSelector(_, _) => { + let client = &mut clients.get_mut(event.executor).unwrap().0; + client + .send_chat_message("Complex selectors are not implemented yet".to_string()); + } + }, + } + } +} + +fn setup( + mut commands: Commands, + server: Res, + mut dimensions: ResMut, + biomes: Res, + mut command_scopes: ResMut, +) { + dimensions + .deref_mut() + .insert(Ident::new("pooland").unwrap(), DimensionType::default()); + + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + for z in -5..5 { + for x in -5..5 { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + for z in -25..25 { + for x in -25..25 { + layer + .chunk + .set_block([x, SPAWN_Y, z], BlockState::GRASS_BLOCK); + } + } + + command_scopes.link("valence.admin", "valence.command"); + + commands.spawn(layer); +} + +fn init_clients( + mut clients: Query< + ( + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut CommandScopes, + &mut Position, + &mut GameMode, + &mut OpLevel, + ), + Added, + >, + layers: Query, With)>, +) { + for ( + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut permissions, + mut pos, + mut game_mode, + mut op_level, + ) in &mut clients + { + let layer = layers.single(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + + pos.0 = [0.0, SPAWN_Y as f64 + 1.0, 0.0].into(); + *game_mode = GameMode::Creative; + op_level.set(4); + + permissions.add("valence.admin"); + } +} diff --git a/vendor/valence/examples/cow_sphere.rs b/vendor/valence/examples/cow_sphere.rs new file mode 100644 index 00000000..dccd2df0 --- /dev/null +++ b/vendor/valence/examples/cow_sphere.rs @@ -0,0 +1,170 @@ +#![allow(clippy::type_complexity)] + +use std::f64::consts::TAU; + +use valence::abilities::{PlayerStartFlyingEvent, PlayerStopFlyingEvent}; +use valence::math::{DQuat, EulerRot}; +use valence::message::SendMessage; +use valence::prelude::*; +use valence_text::color::NamedColor; + +type SpherePartBundle = valence::entity::cow::CowEntityBundle; + +const SPHERE_CENTER: DVec3 = DVec3::new(0.5, SPAWN_POS.y as f64 + 2.0, 0.5); +const SPHERE_AMOUNT: usize = 200; +const SPHERE_MIN_RADIUS: f64 = 6.0; +const SPHERE_MAX_RADIUS: f64 = 12.0; +const SPHERE_FREQ: f64 = 0.5; + +const SPAWN_POS: BlockPos = BlockPos::new(0, 100, -16); + +/// Marker component for entities that are part of the sphere. +#[derive(Component)] +struct SpherePart; + +fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, setup) + .add_systems( + Update, + ( + init_clients, + update_sphere, + despawn_disconnected_clients, + display_is_flying, + ), + ) + .run(); +} + +fn setup( + mut commands: Commands, + server: Res, + dimensions: Res, + biomes: Res, +) { + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + for z in -5..5 { + for x in -5..5 { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + layer.chunk.set_block(SPAWN_POS, BlockState::BEDROCK); + + let layer_id = commands.spawn(layer).id(); + + commands.spawn_batch([0; SPHERE_AMOUNT].map(|_| { + ( + SpherePartBundle { + layer: EntityLayerId(layer_id), + ..Default::default() + }, + SpherePart, + ) + })); +} + +fn init_clients( + mut clients: Query< + ( + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut Position, + &mut GameMode, + ), + Added, + >, + layers: Query, With)>, +) { + for ( + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut pos, + mut game_mode, + ) in &mut clients + { + let layer = layers.single(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + pos.set([ + SPAWN_POS.x as f64 + 0.5, + SPAWN_POS.y as f64 + 1.0, + SPAWN_POS.z as f64 + 0.5, + ]); + *game_mode = GameMode::Creative; + } +} + +fn update_sphere( + server: Res, + mut parts: Query<(&mut Position, &mut Look, &mut HeadYaw), With>, +) { + let time = server.current_tick() as f64 / server.tick_rate().get() as f64; + + let rot_angles = DVec3::new(0.2, 0.4, 0.6) * SPHERE_FREQ * time * TAU % TAU; + let rot = DQuat::from_euler(EulerRot::XYZ, rot_angles.x, rot_angles.y, rot_angles.z); + + let radius = lerp( + SPHERE_MIN_RADIUS, + SPHERE_MAX_RADIUS, + ((time * SPHERE_FREQ * TAU).sin() + 1.0) / 2.0, + ); + + for ((mut pos, mut look, mut head_yaw), p) in + parts.iter_mut().zip(fibonacci_spiral(SPHERE_AMOUNT)) + { + debug_assert!(p.is_normalized()); + + let dir = rot * p; + + pos.0 = SPHERE_CENTER + dir * radius; + look.set_vec(dir.as_vec3()); + head_yaw.0 = look.yaw; + } +} + +/// Distributes N points on the surface of a unit sphere. +fn fibonacci_spiral(n: usize) -> impl Iterator { + let golden_ratio = (1.0 + 5_f64.sqrt()) / 2.0; + + (0..n).map(move |i| { + // Map to unit square + let x = i as f64 / golden_ratio % 1.0; + let y = i as f64 / n as f64; + + // Map from unit square to unit sphere. + let theta = x * TAU; + let phi = (1.0 - 2.0 * y).acos(); + DVec3::new(theta.cos() * phi.sin(), theta.sin() * phi.sin(), phi.cos()) + }) +} + +fn lerp(a: f64, b: f64, t: f64) -> f64 { + a * (1.0 - t) + b * t +} + +// Send an actionbar message to all clients when their flying state changes. +fn display_is_flying( + mut player_start_flying_events: EventReader, + mut player_stop_flying_events: EventReader, + mut clients: Query<&mut Client>, +) { + for event in player_start_flying_events.read() { + if let Ok(mut client) = clients.get_mut(event.client) { + client.send_action_bar_message("You are flying!".color(NamedColor::Green)); + } + } + + for event in player_stop_flying_events.read() { + if let Ok(mut client) = clients.get_mut(event.client) { + client.send_action_bar_message("You are no longer flying!".color(NamedColor::Red)); + } + } +} diff --git a/vendor/valence/examples/ctf.rs b/vendor/valence/examples/ctf.rs new file mode 100644 index 00000000..3f7675de --- /dev/null +++ b/vendor/valence/examples/ctf.rs @@ -0,0 +1,1050 @@ +#![allow(clippy::type_complexity)] + +use std::collections::HashMap; + +use bevy_ecs::query::WorldQuery; +use valence::entity::cow::CowEntityBundle; +use valence::entity::entity::Flags; +use valence::entity::living::Health; +use valence::entity::pig::PigEntityBundle; +use valence::entity::player::PlayerEntityBundle; +use valence::entity::{EntityAnimations, EntityStatuses, OnGround, Velocity}; +use valence::interact_block::InteractBlockEvent; +use valence::inventory::HeldItem; +use valence::log::debug; +use valence::math::Vec3Swizzles; +use valence::nbt::{compound, List}; +use valence::prelude::*; +use valence::scoreboard::*; +use valence::status::RequestRespawnEvent; + +const ARENA_Y: i32 = 64; +const ARENA_MID_WIDTH: i32 = 2; +const SPAWN_BOX: [i32; 3] = [0, ARENA_Y + 20, 0]; +const SPAWN_POS: [f64; 3] = [ + SPAWN_BOX[0] as f64, + SPAWN_BOX[1] as f64 + 1.0, + SPAWN_BOX[2] as f64, +]; +const SPAWN_BOX_WIDTH: i32 = 5; +const SPAWN_BOX_HEIGHT: i32 = 4; +const PLAYER_MAX_HEALTH: f32 = 20.0; + +pub fn main() { + App::new() + .insert_resource(NetworkSettings { + connection_mode: ConnectionMode::Offline, + ..Default::default() + }) + .add_plugins(DefaultPlugins) + .add_systems(Startup, setup) + .add_systems(EventLoopUpdate, handle_combat_events) + .add_systems( + Update, + ( + init_clients, + despawn_disconnected_clients, + digging, + place_blocks, + do_team_selector_portals, + update_flag_visuals, + do_flag_capturing, + // visualize_triggers, + update_clones, + teleport_oob_clients, + necromancy, + update_scoreboard, + ), + ) + .run(); +} + +fn setup( + mut commands: Commands, + server: Res, + dimensions: Res, + biomes: Res, +) { + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + for z in -5..5 { + for x in -5..5 { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + for z in -50..50 { + for x in -50..50 { + let block = match x { + x if x < -ARENA_MID_WIDTH => BlockState::RED_CONCRETE, + x if x > ARENA_MID_WIDTH => BlockState::BLUE_CONCRETE, + _ => BlockState::WHITE_CONCRETE, + }; + layer.chunk.set_block([x, ARENA_Y, z], block); + } + } + + let red_flag = build_flag( + &mut layer, + Team::Red, + BlockPos { + x: -48, + y: ARENA_Y + 1, + z: 0, + }, + ); + let blue_flag = build_flag( + &mut layer, + Team::Blue, + BlockPos { + x: 48, + y: ARENA_Y + 1, + z: 0, + }, + ); + + build_spawn_box(&mut layer, SPAWN_BOX, &mut commands); + + commands.spawn(layer); + + let ctf_objective_layer = commands.spawn(EntityLayer::new(&server)).id(); + let ctf_objective = ObjectiveBundle { + name: Objective::new("ctf-captures"), + display: ObjectiveDisplay("Captures".into_text()), + layer: EntityLayerId(ctf_objective_layer), + ..Default::default() + }; + commands.spawn(ctf_objective); + + let red_capture_trigger = + TriggerArea::new(red_flag.offset(-5, -3, -5), red_flag.offset(5, 3, 5)); + let blue_capture_trigger = + TriggerArea::new(blue_flag.offset(-5, -3, -5), blue_flag.offset(5, 3, 5)); + let mappos = CtfGlobals { + scoreboard_layer: ctf_objective_layer, + + red_flag, + blue_flag, + + red_capture_trigger, + blue_capture_trigger, + }; + + commands.insert_resource(mappos); + commands.insert_resource(FlagManager { + red: None, + blue: None, + }); + + let ctf_team_layers = CtfLayers::init(&mut commands, &server); + + // add some debug entities to the ctf entity layers + let mut flags = Flags::default(); + flags.set_glowing(true); + let mut pig = commands.spawn(PigEntityBundle { + layer: EntityLayerId(ctf_team_layers.friendly_layers[&Team::Red]), + position: Position([-30.0, 65.0, 2.0].into()), + entity_flags: flags.clone(), + ..Default::default() + }); + pig.insert(Team::Red); + + let mut cow = commands.spawn(CowEntityBundle { + layer: EntityLayerId(ctf_team_layers.friendly_layers[&Team::Blue]), + position: Position([30.0, 65.0, 2.0].into()), + entity_flags: flags, + ..Default::default() + }); + cow.insert(Team::Blue); + + commands.insert_resource(ctf_team_layers); + commands.insert_resource(Score::default()); +} + +/// Build a flag at the given position. `pos` should be the position of the +/// bottom of the flag. +/// +/// Returns the block position of the flag. +fn build_flag(layer: &mut LayerBundle, team: Team, pos: impl Into) -> BlockPos { + let mut pos = pos.into(); + + // build the flag pole + for _ in 0..3 { + layer.chunk.set_block(pos, BlockState::OAK_FENCE); + pos.y += 1; + } + let moving_east = pos.x < 0; + layer.chunk.set_block( + pos, + BlockState::OAK_FENCE.set( + if moving_east { + PropName::East + } else { + PropName::West + }, + PropValue::True, + ), + ); + pos.x += if pos.x < 0 { 1 } else { -1 }; + layer.chunk.set_block( + pos, + BlockState::OAK_FENCE + .set(PropName::East, PropValue::True) + .set(PropName::West, PropValue::True), + ); + pos.x += if pos.x < 0 { 1 } else { -1 }; + layer.chunk.set_block( + pos, + BlockState::OAK_FENCE.set( + if moving_east { + PropName::West + } else { + PropName::East + }, + PropValue::True, + ), + ); + pos.y -= 1; + + // build the flag + layer.chunk.set_block( + pos, + match team { + Team::Red => BlockState::RED_WOOL, + Team::Blue => BlockState::BLUE_WOOL, + }, + ); + + pos +} + +fn build_spawn_box(layer: &mut LayerBundle, pos: impl Into, commands: &mut Commands) { + let pos = pos.into(); + + let spawn_box_block = BlockState::GLASS; + + // build floor and roof + for z in -SPAWN_BOX_WIDTH..=SPAWN_BOX_WIDTH { + for x in -SPAWN_BOX_WIDTH..=SPAWN_BOX_WIDTH { + layer + .chunk + .set_block([pos.x + x, pos.y, pos.z + z], spawn_box_block); + layer.chunk.set_block( + [pos.x + x, pos.y + SPAWN_BOX_HEIGHT, pos.z + z], + spawn_box_block, + ); + } + } + + // build walls + for z in [-SPAWN_BOX_WIDTH, SPAWN_BOX_WIDTH] { + for x in -SPAWN_BOX_WIDTH..=SPAWN_BOX_WIDTH { + for y in pos.y..=pos.y + SPAWN_BOX_HEIGHT - 1 { + layer + .chunk + .set_block([pos.x + x, y, pos.z + z], spawn_box_block); + } + } + } + + for x in [-SPAWN_BOX_WIDTH, SPAWN_BOX_WIDTH] { + for z in -SPAWN_BOX_WIDTH..=SPAWN_BOX_WIDTH { + for y in pos.y..=pos.y + SPAWN_BOX_HEIGHT - 1 { + layer + .chunk + .set_block([pos.x + x, y, pos.z + z], spawn_box_block); + } + } + } + + // build team selector portals + for (block, offset) in [ + ( + BlockState::RED_CONCRETE, + BlockPos::new(-SPAWN_BOX_WIDTH, 0, SPAWN_BOX_WIDTH - 2), + ), + ( + BlockState::BLUE_CONCRETE, + BlockPos::new(SPAWN_BOX_WIDTH - 2, 0, SPAWN_BOX_WIDTH - 2), + ), + ] { + for z in 0..3 { + for x in 0..3 { + layer.chunk.set_block( + [pos.x + offset.x + x, pos.y + offset.y, pos.z + offset.z + z], + block, + ); + } + } + } + + let red = [ + pos.x - SPAWN_BOX_WIDTH + 1, + pos.y, + pos.z + SPAWN_BOX_WIDTH - 1, + ]; + let red_area = TriggerArea::new(red, red); + let blue = [ + pos.x + SPAWN_BOX_WIDTH - 1, + pos.y, + pos.z + SPAWN_BOX_WIDTH - 1, + ]; + let blue_area = TriggerArea::new(blue, blue); + let portals = Portals { + portals: HashMap::from_iter(vec![(Team::Red, red_area), (Team::Blue, blue_area)]), + }; + + for area in portals.portals.values() { + for pos in area.iter_block_pos() { + layer.chunk.set_block(pos, BlockState::AIR); + } + layer + .chunk + .set_block(area.a.offset(0, -1, 0), BlockState::BARRIER); + } + + commands.insert_resource(portals); + + // build instruction signs + + let sign_pos = pos.offset(0, 2, SPAWN_BOX_WIDTH - 1); + layer.chunk.set_block( + sign_pos, + Block { + state: BlockState::OAK_WALL_SIGN.set(PropName::Rotation, PropValue::_3), + nbt: Some(compound! { + "front_text" => compound! { + "messages" => List::String(vec![ + "Capture".color(Color::YELLOW).bold().to_string(), + "the".color(Color::YELLOW).bold().to_string(), + "Flag!".color(Color::YELLOW).bold().to_string(), + "Select a Team".color(Color::WHITE).italic().to_string(), + ]) + }, + }), + }, + ); + + layer.chunk.set_block( + sign_pos.offset(-1, 0, 0), + Block { + state: BlockState::OAK_WALL_SIGN.set(PropName::Rotation, PropValue::_3), + nbt: Some(compound! { + "front_text" => compound! { + "messages" => List::String(vec![ + "".into_text().to_string(), + ("Join ".bold().color(Color::WHITE) + Team::Red.team_text()).to_string(), + "=>".bold().color(Color::WHITE).to_string(), + "".into_text().to_string(), + ]) + }, + }), + }, + ); + + layer.chunk.set_block( + sign_pos.offset(1, 0, 0), + Block { + state: BlockState::OAK_WALL_SIGN.set(PropName::Rotation, PropValue::_3), + nbt: Some(compound! { + "front_text" => compound! { + "messages" => List::String(vec![ + "".into_text().to_string(), + ("Join ".bold().color(Color::WHITE) + Team::Blue.team_text()).to_string(), + "<=".bold().color(Color::WHITE).to_string(), + "".into_text().to_string(), + ]) + }, + }), + }, + ); +} + +fn init_clients( + mut clients: Query< + ( + &mut Client, + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut Position, + &mut GameMode, + &mut Health, + ), + Added, + >, + main_layers: Query, With)>, + globals: Res, +) { + for ( + mut client, + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut pos, + mut game_mode, + mut health, + ) in &mut clients + { + let layer = main_layers.single(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + visible_entity_layers.0.insert(globals.scoreboard_layer); + pos.set(SPAWN_POS); + *game_mode = GameMode::Adventure; + health.0 = PLAYER_MAX_HEALTH; + + client.send_chat_message( + "Welcome to Valence! Select a team by jumping in the team's portal.".italic(), + ); + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Component)] +enum Team { + Red, + Blue, +} + +impl Team { + pub fn spawn_pos(&self) -> DVec3 { + [ + match self { + Team::Red => -40.0, + Team::Blue => 40.0, + }, + ARENA_Y as f64 + 1.0, + 0.0, + ] + .into() + } + + pub fn team_text(&self) -> Text { + match self { + Team::Red => "RED".color(Color::RED).bold(), + Team::Blue => "BLUE".color(Color::BLUE).bold(), + } + } + + pub fn iter() -> impl Iterator { + [Team::Red, Team::Blue].iter().copied() + } +} + +fn digging( + mut clients: Query<(&GameMode, &Team, Entity, &mut Client, &mut Inventory)>, + mut layers: Query<&mut ChunkLayer>, + mut events: EventReader, + mut commands: Commands, + globals: Res, + mut flag_manager: ResMut, +) { + let mut layer = layers.single_mut(); + + for event in events.read() { + let Ok((game_mode, team, ent, mut client, mut inv)) = clients.get_mut(event.client) else { + continue; + }; + + if (*game_mode == GameMode::Creative && event.state == DiggingState::Start) + || (*game_mode == GameMode::Survival && event.state == DiggingState::Stop) + { + let Some(block) = layer.block(event.position) else { + continue; + }; + let is_flag = event.position == globals.red_flag || event.position == globals.blue_flag; + + match (team, block.state) { + (Team::Blue, BlockState::RED_WOOL) => { + if event.position == globals.red_flag { + commands.entity(event.client).insert(HasFlag(Team::Red)); + client.send_chat_message("You have the flag!".italic()); + flag_manager.red = Some(ent); + return; + } + } + (Team::Red, BlockState::BLUE_WOOL) => { + if event.position == globals.blue_flag { + commands.entity(event.client).insert(HasFlag(Team::Blue)); + client.send_chat_message("You have the flag!".italic()); + flag_manager.blue = Some(ent); + return; + } + } + _ => {} + } + + if event.position.y <= ARENA_Y + || block.state.to_kind() == BlockKind::OakFence + || is_flag + { + continue; + } + + let prev = layer.set_block(event.position, BlockState::AIR); + + if let Some(prev) = prev { + let kind: ItemKind = prev.state.to_kind().to_item_kind(); + if let Some(slot) = inv.first_slot_with_item_in(kind, 64, 9..45) { + let count = inv.slot(slot).count; + inv.set_slot_amount(slot, count + 1); + } else { + let stack = ItemStack::new(kind, 1, None); + if let Some(empty_slot) = inv.first_empty_slot_in(9..45) { + inv.set_slot(empty_slot, stack); + } else { + debug!("No empty slot to give item to player: {:?}", kind); + } + } + } + } + } +} + +fn place_blocks( + mut clients: Query<(&mut Inventory, &GameMode, &HeldItem)>, + mut layers: Query<&mut ChunkLayer>, + mut events: EventReader, +) { + let mut layer = layers.single_mut(); + + for event in events.read() { + let Ok((mut inventory, game_mode, held)) = clients.get_mut(event.client) else { + continue; + }; + if event.hand != Hand::Main { + continue; + } + + // get the held item + let slot_id = held.slot(); + let stack = inventory.slot(slot_id); + if stack.is_empty() { + continue; + } + + let Some(block_kind) = BlockKind::from_item_kind(stack.item) else { + // can't place this item as a block + continue; + }; + + if *game_mode == GameMode::Survival { + // check if the player has the item in their inventory and remove + // it. + if stack.count > 1 { + let count = stack.count; + inventory.set_slot_amount(slot_id, count - 1); + } else { + inventory.set_slot(slot_id, ItemStack::EMPTY); + } + } + let real_pos = event.position.get_in_direction(event.face); + layer.set_block(real_pos, block_kind.to_state()); + } +} + +#[derive(Debug, Resource)] +struct Portals { + portals: HashMap, +} + +fn do_team_selector_portals( + mut players: Query< + ( + Entity, + &mut Position, + &mut Look, + &mut HeadYaw, + &mut GameMode, + &mut Client, + &mut VisibleEntityLayers, + &UniqueId, + ), + Without, + >, + portals: Res, + mut commands: Commands, + ctf_layers: Res, + main_layers: Query, With)>, +) { + for player in players.iter_mut() { + let ( + player, + mut pos, + mut look, + mut head_yaw, + mut game_mode, + mut client, + mut ent_layers, + unique_id, + ) = player; + if pos.0.y < SPAWN_BOX[1] as f64 - 5.0 { + pos.0 = SPAWN_POS.into(); + continue; + } + + let team = portals + .portals + .iter() + .filter(|(_, area)| area.contains_pos(pos.0)) + .map(|(team, _)| team) + .next() + .copied(); + + if let Some(team) = team { + *game_mode = GameMode::Survival; + let mut inventory = Inventory::new(InventoryKind::Player); + inventory.set_slot(36, ItemStack::new(ItemKind::WoodenSword, 1, None)); + inventory.set_slot( + 37, + ItemStack::new( + match team { + Team::Red => ItemKind::RedWool, + Team::Blue => ItemKind::BlueWool, + }, + 64, + None, + ), + ); + let combat_state = CombatState::default(); + commands + .entity(player) + .insert((team, inventory, combat_state)); + pos.0 = team.spawn_pos(); + let yaw = match team { + Team::Red => -90.0, + Team::Blue => 90.0, + }; + look.yaw = yaw; + look.pitch = 0.0; + head_yaw.0 = yaw; + let chat_text: Text = "You are on team ".into_text() + team.team_text() + "!"; + client.send_chat_message(chat_text); + + let main_layer = main_layers.single(); + ent_layers.as_mut().0.remove(&main_layer); + for t in Team::iter() { + let enemy_layer = ctf_layers.enemy_layers[&t]; + if t == team { + ent_layers.as_mut().0.remove(&enemy_layer); + } else { + ent_layers.as_mut().0.insert(enemy_layer); + } + } + let friendly_layer = ctf_layers.friendly_layers[&team]; + ent_layers.as_mut().0.insert(friendly_layer); + + // Copy the player entity to the friendly layer, and make them glow. + let mut flags = Flags::default(); + flags.set_glowing(true); + let mut player_glowing = commands.spawn(PlayerEntityBundle { + layer: EntityLayerId(friendly_layer), + uuid: *unique_id, + entity_flags: flags, + position: *pos, + ..Default::default() + }); + player_glowing.insert(ClonedEntity(player)); + + let enemy_layer = ctf_layers.enemy_layers[&team]; + let mut player_enemy = commands.spawn(PlayerEntityBundle { + layer: EntityLayerId(enemy_layer), + uuid: *unique_id, + position: *pos, + ..Default::default() + }); + player_enemy.insert(ClonedEntity(player)); + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +struct TriggerArea { + pub a: BlockPos, + pub b: BlockPos, +} + +impl TriggerArea { + pub fn new(a: impl Into, b: impl Into) -> Self { + Self { + a: a.into(), + b: b.into(), + } + } + + pub fn contains(&self, pos: BlockPos) -> bool { + let min = BlockPos::new( + self.a.x.min(self.b.x), + self.a.y.min(self.b.y), + self.a.z.min(self.b.z), + ); + let max = BlockPos::new( + self.a.x.max(self.b.x), + self.a.y.max(self.b.y), + self.a.z.max(self.b.z), + ); + + pos.x >= min.x + && pos.x <= max.x + && pos.y >= min.y + && pos.y <= max.y + && pos.z >= min.z + && pos.z <= max.z + } + + pub fn contains_pos(&self, pos: DVec3) -> bool { + self.contains(pos.into()) + } + + pub fn iter_block_pos(&self) -> impl Iterator { + let min = BlockPos::new( + self.a.x.min(self.b.x), + self.a.y.min(self.b.y), + self.a.z.min(self.b.z), + ); + let max = BlockPos::new( + self.a.x.max(self.b.x), + self.a.y.max(self.b.y), + self.a.z.max(self.b.z), + ); + + (min.x..=max.x) + .flat_map(move |x| (min.y..=max.y).map(move |y| (x, y))) + .flat_map(move |(x, y)| (min.z..=max.z).map(move |z| BlockPos::new(x, y, z))) + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Component)] +#[component(storage = "SparseSet")] +struct HasFlag(Team); + +#[derive(Debug, Resource)] +struct FlagManager { + red: Option, + blue: Option, +} + +#[derive(Debug, Resource)] +struct CtfGlobals { + pub scoreboard_layer: Entity, + + pub red_flag: BlockPos, + pub blue_flag: BlockPos, + + pub red_capture_trigger: TriggerArea, + pub blue_capture_trigger: TriggerArea, +} + +fn update_flag_visuals( + flag_manager: Res, + globals: Res, + mut layers: Query<&mut ChunkLayer>, +) { + if !flag_manager.is_changed() { + return; + } + let red_flag_block = match flag_manager.red { + Some(_) => BlockState::AIR, + None => BlockState::RED_WOOL, + }; + let blue_flag_block = match flag_manager.blue { + Some(_) => BlockState::AIR, + None => BlockState::BLUE_WOOL, + }; + + layers + .single_mut() + .set_block(globals.red_flag, red_flag_block); + layers + .single_mut() + .set_block(globals.blue_flag, blue_flag_block); +} + +fn do_flag_capturing( + globals: Res, + mut players: Query<(Entity, &mut Client, &Team, &Position, &HasFlag)>, + mut commands: Commands, + mut flag_manager: ResMut, + mut score: ResMut, +) { + for (ent, mut client, team, position, has_flag) in players.iter_mut() { + let capture_trigger = match team { + Team::Red => &globals.red_capture_trigger, + Team::Blue => &globals.blue_capture_trigger, + }; + + if capture_trigger.contains_pos(position.0) { + client.send_chat_message("You captured the flag!".italic()); + score + .scores + .entry(*team) + .and_modify(|score| *score += 1) + .or_insert(1); + client.send_chat_message(score.render_scores()); + commands.entity(ent).remove::(); + match has_flag.0 { + Team::Red => flag_manager.red = None, + Team::Blue => flag_manager.blue = None, + } + } + } +} + +#[derive(Debug, Default, Resource)] +struct Score { + pub scores: HashMap, +} + +impl Score { + pub fn render_scores(&self) -> Text { + let mut text = "Scores:\n".into_text(); + for team in Team::iter() { + let score = self.scores.get(&team).unwrap_or(&0); + text += team.team_text() + ": " + score.to_string() + "\n"; + } + text + } +} + +#[allow(dead_code)] +/// Visualizes the trigger areas, for debugging. +fn visualize_triggers(globals: Res, mut layers: Query<&mut ChunkLayer>) { + fn vis_trigger(trigger: &TriggerArea, layer: &mut ChunkLayer) { + for pos in trigger.iter_block_pos() { + layer.play_particle( + &Particle::Crit, + false, + [pos.x as f64 + 0.5, pos.y as f64 + 0.5, pos.z as f64 + 0.5], + [0., 0., 0.], + 0.0, + 1, + ); + } + } + + for mut layer in layers.iter_mut() { + vis_trigger(&globals.red_capture_trigger, &mut layer); + vis_trigger(&globals.blue_capture_trigger, &mut layer); + } +} + +/// Keeps track of the entity layers per team. +#[derive(Debug, Resource)] +struct CtfLayers { + /// Maps a team to the entity layer that contains how friendly players + /// should be viewed. + /// + /// This is used to make friendly players glow. + pub friendly_layers: HashMap, + /// Ditto, but for enemy players. + pub enemy_layers: HashMap, +} + +impl CtfLayers { + pub fn init(commands: &mut Commands, server: &Server) -> Self { + let mut friendly_layers = HashMap::new(); + let mut enemy_layers = HashMap::new(); + + for team in Team::iter() { + let friendly_layer = commands.spawn((EntityLayer::new(server), team)).id(); + friendly_layers.insert(team, friendly_layer); + let enemy_layer = commands.spawn((EntityLayer::new(server), team)).id(); + enemy_layers.insert(team, enemy_layer); + } + + Self { + friendly_layers, + enemy_layers, + } + } +} + +/// A marker component for entities that have been cloned, and the primary +/// entity they were cloned from. +#[derive(Debug, Component)] +struct ClonedEntity(Entity); + +#[derive(Debug, WorldQuery)] +#[world_query(mutable)] +struct CloneQuery { + position: &'static mut Position, + head_yaw: &'static mut HeadYaw, + velocity: &'static mut Velocity, + look: &'static mut Look, + animations: &'static mut EntityAnimations, + on_ground: &'static mut OnGround, + statuses: &'static mut EntityStatuses, +} + +fn update_clones( + ents: Query>, + mut clone_ents: Query<(CloneQuery, &ClonedEntity, Entity)>, + mut commands: Commands, +) { + for clone in clone_ents.iter_mut() { + let (mut clone, cloned_from, ent) = clone; + let Ok(src) = ents.get(cloned_from.0) else { + commands.entity(ent).insert(Despawned); + return; + }; + + *clone.position = *src.position; + *clone.head_yaw = *src.head_yaw; + *clone.velocity = *src.velocity; + *clone.look = *src.look; + *clone.animations = *src.animations; + *clone.on_ground = *src.on_ground; + *clone.statuses = *src.statuses; + } +} + +/// Attached to every client. +#[derive(Component, Default)] +struct CombatState { + /// The tick the client was last attacked. + last_attacked_tick: i64, + has_bonus_knockback: bool, +} + +#[derive(WorldQuery)] +#[world_query(mutable)] +struct CombatQuery { + client: &'static mut Client, + pos: &'static Position, + state: &'static mut CombatState, + statuses: &'static mut EntityStatuses, + health: &'static mut Health, + inventory: &'static Inventory, + held_item: &'static HeldItem, + team: &'static Team, +} + +fn handle_combat_events( + server: Res, + mut clients: Query, + mut sprinting: EventReader, + mut interact_entity: EventReader, + clones: Query<&ClonedEntity>, +) { + for &SprintEvent { client, state } in sprinting.read() { + if let Ok(mut client) = clients.get_mut(client) { + client.state.has_bonus_knockback = state == SprintState::Start; + } + } + + for &InteractEntityEvent { + client: attacker_client, + entity: victim_client, + .. + } in interact_entity.read() + { + let true_victim_ent = clones + .get(victim_client) + .map(|cloned| cloned.0) + .unwrap_or(victim_client); + let Ok([mut attacker, mut victim]) = + clients.get_many_mut([attacker_client, true_victim_ent]) + else { + debug!("Failed to get clients for combat event"); + // Victim or attacker does not exist, or the attacker is attacking itself. + continue; + }; + + if attacker.team == victim.team { + // Attacker and victim are on the same team. + continue; + } + + if server.current_tick() - victim.state.last_attacked_tick < 10 { + // Victim is still on attack cooldown. + continue; + } + + victim.state.last_attacked_tick = server.current_tick(); + + let victim_pos = victim.pos.0.xz(); + let attacker_pos = attacker.pos.0.xz(); + + let dir = (victim_pos - attacker_pos).normalize().as_vec2(); + + let knockback_xz = if attacker.state.has_bonus_knockback { + 18.0 + } else { + 8.0 + }; + let knockback_y = if attacker.state.has_bonus_knockback { + 8.432 + } else { + 6.432 + }; + + victim + .client + .set_velocity([dir.x * knockback_xz, knockback_y, dir.y * knockback_xz]); + + attacker.state.has_bonus_knockback = false; + + victim.client.trigger_status(EntityStatus::PlayAttackSound); + victim.statuses.trigger(EntityStatus::PlayAttackSound); + + let stack = attacker.inventory.slot(attacker.held_item.slot()); + + let damage = match stack.item { + ItemKind::WoodenSword => 4.0, + ItemKind::StoneSword => 5.0, + ItemKind::IronSword => 6.0, + ItemKind::DiamondSword => 7.0, + _ => 1.0, + }; + + victim.health.0 -= damage; + } +} + +fn teleport_oob_clients(mut clients: Query<(&mut Position, &Team), With>) { + for (mut pos, team) in &mut clients { + if pos.0.y < 0.0 { + pos.set(team.spawn_pos()); + } + } +} + +/// Handles respawning dead players. +fn necromancy( + mut clients: Query<( + &mut VisibleChunkLayer, + &mut RespawnPosition, + &Team, + &mut Health, + )>, + mut events: EventReader, + layers: Query, With)>, +) { + for event in events.read() { + if let Ok((mut visible_chunk_layer, mut respawn_pos, team, mut health)) = + clients.get_mut(event.client) + { + respawn_pos.pos = team.spawn_pos().into(); + health.0 = PLAYER_MAX_HEALTH; + + let main_layer = layers.single(); + + // this gets the client to get rid of the respawn screen + visible_chunk_layer.0 = main_layer; + } + } +} + +fn update_scoreboard( + mut objectives: Query<&mut ObjectiveScores, With>, + score: Res, +) { + if !score.is_changed() { + return; + } + let mut s = objectives.single_mut(); + s.insert("Red", *score.scores.get(&Team::Red).unwrap_or(&0) as i32); + s.insert("Blue", *score.scores.get(&Team::Blue).unwrap_or(&0) as i32); +} diff --git a/vendor/valence/examples/custom_npc.rs b/vendor/valence/examples/custom_npc.rs new file mode 100644 index 00000000..2a5fbc5a --- /dev/null +++ b/vendor/valence/examples/custom_npc.rs @@ -0,0 +1,109 @@ +use valence::entity::player::PlayerEntityBundle; +use valence::player_list::{DisplayName, Listed, PlayerListEntryBundle}; +use valence::prelude::*; +use valence::text::IntoText; + +const SPAWN_Y: i32 = 64; + +pub fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, setup) + .add_systems( + Update, + ( + init_clients, + despawn_disconnected_clients, + apply_custom_skin, + ), + ) + .run(); +} + +fn setup( + mut commands: Commands, + server: Res, + dimensions: Res, + biomes: Res, +) { + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + for z in -5..5 { + for x in -5..5 { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + for z in -25..25 { + for x in -25..25 { + layer + .chunk + .set_block([x, SPAWN_Y, z], BlockState::GRASS_BLOCK); + } + } + + let layer_id = commands.spawn(layer).id(); + + let npc_id = UniqueId::default(); + + commands.spawn(PlayerEntityBundle { + layer: EntityLayerId(layer_id), + uuid: npc_id, + position: Position::new((0.0, SPAWN_Y as f64 + 1.0, 6.0)), + look: Look::new(180.0, 0.0), + head_yaw: HeadYaw(180.0), + ..Default::default() + }); + + // In order for the player entity to be visible to other players, there must + // be an entry in the player list. + commands.spawn(PlayerListEntryBundle { + uuid: npc_id, + username: Username("Alice".into()), + // adjusts the appearance of the name in the player list only + display_name: DisplayName("Alice".color(Color::RED).into()), + // makes the fake player not appear in the player list + listed: Listed(false), + ..Default::default() + }); +} + +fn init_clients( + mut clients: Query< + ( + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut Position, + &mut GameMode, + ), + Added, + >, + layers: Query, With)>, +) { + for ( + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut pos, + mut game_mode, + ) in &mut clients + { + let layer = layers.single(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + pos.set([0.0, 65.0, 0.0]); + *game_mode = GameMode::Creative; + } +} + +fn apply_custom_skin(mut query: Query<&mut Properties, (Added, Without)>) { + for mut props in query.iter_mut() { + props.set_skin( + "ewogICJ0aW1lc3RhbXAiIDogMTY5MTcwNjU3MzE1NiwKICAicHJvZmlsZUlkIiA6ICJlODgyNzRlYjNmNTE0ZDYwYmMxYWQ5NTQ4MTIxODMwMyIsCiAgInByb2ZpbGVOYW1lIiA6ICJBbmltYWxUaGVHYW1lciIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS8xZGUyYzgzZjhmNGZiMzgwNjlmNTVmNTJlNGY4ZWU1ZjA4NjcyMjllYWQ5MWI3ZTc5ZGVmNzU0YjcwZWE5NDMzIiwKICAgICAgIm1ldGFkYXRhIiA6IHsKICAgICAgICAibW9kZWwiIDogInNsaW0iCiAgICAgIH0KICAgIH0KICB9Cn0=", + "k/g8JTYB0A5O+h8+XSdw3QFEVHnzomDsGl6eubV/sE396yAL7E4qCT24r3Uv88YYforuET1BXG0GBOewcij3uMajm+mc/P7v+0+C+NSS9g5dpSs2e9MdeGZBgDEr1kTnXzQmayZUvLGitW23GuRDHdVHx76JZpxBk3q0VsjgncNs6UVZwfYNCaUGZZx38bqG5FXGxE0MfFHKiJawKwWRaoAbHjrfsByLipIKUhssUF3pt+HPWbgaOD2rO0EOLBrGzvEnu9oeLPH4tqdlvurjGrdpM4wKCmS3j8K91OBTABciVR9xt0fRnhbL4JoZuLK+iefNXx8nBCVEOm9sNk4pXHNWZvKEkqMb3jvpxuYHsSZPm0IdN+74FEmjHy0sY/7+ZG/h/IUHs4CyrPAtR/rqON6MG8nVVBxUq4kWV+2Xj+U+O02gQUVFqMM77AqArRsPIkeFIgVQ6+WvBZYXuRe1Ryo6qwjmYGc4AeTZTtvafzv8vfAMFfJJmT69nkTTDO5hAtDTUnCd86nNFQ3qijdO9CW7OFDyysb9M0a1O7pQ7Nu10rkNwY+6uTfKoATtT80+RoMzvKwcIAG4cY+PR5jhsKP+sf+AEymovD+cPVnLOuZQ6bAyKW6yjf9Xd0vyirCgNaU1CGmDE1mihGK2kC0fm11RaoDbyKvMcLKAq+OFos0=", + ); + } +} diff --git a/vendor/valence/examples/death.rs b/vendor/valence/examples/death.rs new file mode 100644 index 00000000..f6248421 --- /dev/null +++ b/vendor/valence/examples/death.rs @@ -0,0 +1,132 @@ +#![allow(clippy::type_complexity)] + +use valence::prelude::*; +use valence::status::RequestRespawnEvent; + +const SPAWN_Y: i32 = 64; + +pub fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, setup) + .add_systems( + Update, + ( + init_clients, + squat_and_die, + necromancy, + despawn_disconnected_clients, + ), + ) + .run(); +} + +fn setup( + mut commands: Commands, + server: Res, + dimensions: Res, + biomes: Res, +) { + for block in [ + BlockState::GRASS_BLOCK, + BlockState::DEEPSLATE, + BlockState::MAGMA_BLOCK, + ] { + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + for z in -5..5 { + for x in -5..5 { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + for z in -25..25 { + for x in -25..25 { + layer.chunk.set_block([x, SPAWN_Y, z], block); + } + } + + commands.spawn(layer); + } +} + +fn init_clients( + mut clients: Query< + ( + &mut Client, + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut Position, + &mut GameMode, + ), + Added, + >, + layers: Query, With)>, +) { + for ( + mut client, + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut pos, + mut game_mode, + ) in &mut clients + { + let layer = layers.iter().next().unwrap(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + pos.set([0.0, SPAWN_Y as f64 + 1.0, 0.0]); + *game_mode = GameMode::Creative; + + client.send_chat_message( + "Welcome to Valence! Sneak to die in the game (but not in real life).".italic(), + ); + } +} + +fn squat_and_die(mut clients: Query<&mut Client>, mut events: EventReader) { + for event in events.read() { + if event.state == SneakState::Start { + if let Ok(mut client) = clients.get_mut(event.client) { + client.kill("Squatted too hard."); + } + } + } +} + +fn necromancy( + mut clients: Query<( + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut RespawnPosition, + )>, + mut events: EventReader, + layers: Query, With)>, +) { + for event in events.read() { + if let Ok(( + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut respawn_pos, + )) = clients.get_mut(event.client) + { + respawn_pos.pos = BlockPos::new(0, SPAWN_Y, 0); + + // make the client respawn in another chunk layer. + + let idx = layers.iter().position(|l| l == layer_id.0).unwrap(); + let count = layers.iter().len(); + let layer = layers.into_iter().nth((idx + 1) % count).unwrap(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.clear(); + visible_entity_layers.0.insert(layer); + } + } +} diff --git a/vendor/valence/examples/entity_hitbox.rs b/vendor/valence/examples/entity_hitbox.rs new file mode 100644 index 00000000..29a4e24e --- /dev/null +++ b/vendor/valence/examples/entity_hitbox.rs @@ -0,0 +1,171 @@ +#![allow(clippy::type_complexity)] + +use std::collections::HashMap; + +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use entity::NameVisible; +use valence::entity::hoglin::HoglinEntityBundle; +use valence::entity::pig::PigEntityBundle; +use valence::entity::sheep::SheepEntityBundle; +use valence::entity::warden::WardenEntityBundle; +use valence::entity::zombie::ZombieEntityBundle; +use valence::entity::zombie_horse::ZombieHorseEntityBundle; +use valence::entity::{entity, Pose}; +use valence::prelude::*; +use valence::rand::Rng; + +pub fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, setup) + .add_systems(Update, (init_clients, spawn_entity, intersections)) + .run(); +} + +fn setup( + mut commands: Commands, + server: Res, + dimensions: Res, + biomes: Res, +) { + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + for z in -5..5 { + for x in -5..5 { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + for z in -25..25 { + for x in -25..25 { + layer.chunk.set_block([x, 64, z], BlockState::GRASS_BLOCK); + } + } + + commands.spawn(layer); +} + +fn init_clients( + mut clients: Query< + ( + &mut Client, + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut Position, + &mut GameMode, + ), + Added, + >, + layers: Query, With)>, +) { + for ( + mut client, + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut pos, + mut game_mode, + ) in &mut clients + { + let layer = layers.single(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + pos.set([0.0, 65.0, 0.0]); + *game_mode = GameMode::Creative; + + client.send_chat_message("To spawn an entity, press shift. F3 + B to activate hitboxes"); + } +} + +fn spawn_entity( + mut commands: Commands, + mut sneaking: EventReader, + client_query: Query<(&Position, &EntityLayerId)>, +) { + for sneaking in sneaking.read() { + if sneaking.state == SneakState::Start { + continue; + } + + let (position, layer) = client_query.get(sneaking.client).unwrap(); + + let position = *position; + let layer = *layer; + + match rand::thread_rng().gen_range(0..7) { + 0 => commands.spawn(SheepEntityBundle { + position, + layer, + entity_name_visible: NameVisible(true), + ..Default::default() + }), + 1 => commands.spawn(PigEntityBundle { + position, + layer, + entity_name_visible: NameVisible(true), + ..Default::default() + }), + 2 => commands.spawn(ZombieEntityBundle { + position, + layer, + entity_name_visible: NameVisible(true), + ..Default::default() + }), + 3 => commands.spawn(ZombieHorseEntityBundle { + position, + layer, + entity_name_visible: NameVisible(true), + ..Default::default() + }), + 4 => commands.spawn(WardenEntityBundle { + position, + layer, + entity_name_visible: NameVisible(true), + entity_pose: entity::Pose(Pose::Digging), + ..Default::default() + }), + 5 => commands.spawn(WardenEntityBundle { + position, + layer, + entity_name_visible: NameVisible(true), + ..Default::default() + }), + 6 => commands.spawn(HoglinEntityBundle { + position, + layer, + entity_name_visible: NameVisible(true), + ..Default::default() + }), + _ => unreachable!(), + }; + } +} + +fn intersections(query: Query<(Entity, &Hitbox)>, mut name_query: Query<&mut entity::CustomName>) { + // This code only to show how hitboxes can be used + let mut intersections = HashMap::new(); + + for [(entity1, hitbox1), (entity2, hitbox2)] in query.iter_combinations() { + let aabb1 = hitbox1.get(); + let aabb2 = hitbox2.get(); + + let _ = *intersections.entry(entity1).or_insert(0); + let _ = *intersections.entry(entity2).or_insert(0); + + if aabb1.intersects(aabb2) { + *intersections.get_mut(&entity1).unwrap() += 1; + *intersections.get_mut(&entity2).unwrap() += 1; + } + } + + for (entity, value) in intersections { + let Ok(mut name) = name_query.get_mut(entity) else { + continue; + }; + name.0 = Some(format!("{value}").into()); + } +} diff --git a/vendor/valence/examples/game_of_life.rs b/vendor/valence/examples/game_of_life.rs new file mode 100644 index 00000000..0f8add53 --- /dev/null +++ b/vendor/valence/examples/game_of_life.rs @@ -0,0 +1,240 @@ +#![allow(clippy::type_complexity)] + +use std::mem; + +use valence::prelude::*; + +const BOARD_MIN_X: i32 = -30; +const BOARD_MAX_X: i32 = 30; +const BOARD_MIN_Z: i32 = -30; +const BOARD_MAX_Z: i32 = 30; +const BOARD_Y: i32 = 64; + +const BOARD_SIZE_X: usize = (BOARD_MAX_X - BOARD_MIN_X + 1) as usize; +const BOARD_SIZE_Z: usize = (BOARD_MAX_Z - BOARD_MIN_Z + 1) as usize; + +const SPAWN_POS: DVec3 = DVec3::new( + (BOARD_MIN_X + BOARD_MAX_X) as f64 / 2.0, + BOARD_Y as f64 + 1.0, + (BOARD_MIN_Z + BOARD_MAX_Z) as f64 / 2.0, +); + +pub fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, setup) + .add_systems( + Update, + ( + init_clients, + despawn_disconnected_clients, + toggle_cell_on_dig, + update_board, + pause_on_crouch, + reset_oob_clients, + ), + ) + .run(); +} + +fn setup( + mut commands: Commands, + server: Res, + dimensions: ResMut, + mut biomes: ResMut, +) { + for (_, _, biome) in biomes.iter_mut() { + biome.effects.grass_color = Some(0x00ff00); + } + + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + for z in -10..10 { + for x in -10..10 { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + for z in BOARD_MIN_Z..=BOARD_MAX_Z { + for x in BOARD_MIN_X..=BOARD_MAX_X { + layer.chunk.set_block([x, BOARD_Y, z], BlockState::DIRT); + } + } + + commands.spawn(layer); + + commands.insert_resource(LifeBoard { + playing: false, + board: vec![false; BOARD_SIZE_X * BOARD_SIZE_Z].into(), + board_buf: vec![false; BOARD_SIZE_X * BOARD_SIZE_Z].into(), + }); +} + +fn init_clients( + mut clients: Query< + ( + &mut Client, + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut Position, + &mut GameMode, + ), + Added, + >, + layers: Query, With)>, +) { + for ( + mut client, + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut pos, + mut game_mode, + ) in &mut clients + { + let layer = layers.single(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + pos.set([0.0, 65.0, 0.0]); + *game_mode = GameMode::Survival; + + client.send_chat_message("Welcome to Conway's game of life in Minecraft!".italic()); + client.send_chat_message( + "Sneak to toggle running the simulation and the left mouse button to bring blocks to \ + life." + .italic(), + ); + } +} + +#[derive(Resource)] +struct LifeBoard { + pub playing: bool, + board: Box<[bool]>, + board_buf: Box<[bool]>, +} + +impl LifeBoard { + pub fn get(&self, x: i32, z: i32) -> bool { + if (BOARD_MIN_X..=BOARD_MAX_X).contains(&x) && (BOARD_MIN_Z..=BOARD_MAX_Z).contains(&z) { + let x = (x - BOARD_MIN_X) as usize; + let z = (z - BOARD_MIN_Z) as usize; + + self.board[x + z * BOARD_SIZE_X] + } else { + false + } + } + + pub fn set(&mut self, x: i32, z: i32, value: bool) { + if (BOARD_MIN_X..=BOARD_MAX_X).contains(&x) && (BOARD_MIN_Z..=BOARD_MAX_Z).contains(&z) { + let x = (x - BOARD_MIN_X) as usize; + let z = (z - BOARD_MIN_Z) as usize; + + self.board[x + z * BOARD_SIZE_X] = value; + } + } + + pub fn update(&mut self) { + for (idx, cell) in self.board_buf.iter_mut().enumerate() { + let x = (idx % BOARD_SIZE_X) as i32; + let z = (idx / BOARD_SIZE_X) as i32; + + let mut live_neighbors = 0; + + for cz in z - 1..=z + 1 { + for cx in x - 1..=x + 1 { + if !(cx == x && cz == z) { + let idx = cx.rem_euclid(BOARD_SIZE_X as i32) as usize + + cz.rem_euclid(BOARD_SIZE_Z as i32) as usize * BOARD_SIZE_X; + + live_neighbors += self.board[idx] as i32; + } + } + } + + let live = self.board[idx]; + if live { + *cell = (2..=3).contains(&live_neighbors); + } else { + *cell = live_neighbors == 3; + } + } + + mem::swap(&mut self.board, &mut self.board_buf); + } + + pub fn clear(&mut self) { + self.board.fill(false); + } +} + +fn toggle_cell_on_dig(mut events: EventReader, mut board: ResMut) { + for event in events.read() { + if event.state == DiggingState::Start { + let (x, z) = (event.position.x, event.position.z); + + let live = board.get(x, z); + board.set(x, z, !live); + } + } +} + +fn update_board( + mut board: ResMut, + mut layers: Query<&mut ChunkLayer>, + server: Res, +) { + if board.playing && server.current_tick() % 2 == 0 { + board.update(); + } + + let mut layer = layers.single_mut(); + + for z in BOARD_MIN_Z..=BOARD_MAX_Z { + for x in BOARD_MIN_X..=BOARD_MAX_X { + let block = if board.get(x, z) { + BlockState::GRASS_BLOCK + } else { + BlockState::DIRT + }; + + layer.set_block([x, BOARD_Y, z], block); + } + } +} + +fn pause_on_crouch( + mut events: EventReader, + mut board: ResMut, + mut layers: Query<&mut EntityLayer>, +) { + for event in events.read() { + if event.state == SneakState::Start { + let mut layer = layers.single_mut(); + + if board.playing { + board.playing = false; + layer.set_action_bar("Paused".italic().color(Color::RED)); + } else { + board.playing = true; + layer.set_action_bar("Playing".italic().color(Color::GREEN)); + } + } + } +} + +fn reset_oob_clients( + mut clients: Query<&mut Position, With>, + mut board: ResMut, +) { + for mut pos in &mut clients { + if pos.0.y < 0.0 { + pos.0 = SPAWN_POS; + board.clear(); + } + } +} diff --git a/vendor/valence/examples/parkour.rs b/vendor/valence/examples/parkour.rs new file mode 100644 index 00000000..806d1cdd --- /dev/null +++ b/vendor/valence/examples/parkour.rs @@ -0,0 +1,255 @@ +#![allow(clippy::type_complexity)] + +use std::collections::VecDeque; +use std::time::{SystemTime, UNIX_EPOCH}; + +use rand::seq::SliceRandom; +use rand::Rng; +use valence::prelude::*; +use valence::protocol::sound::{Sound, SoundCategory}; +use valence::spawn::IsFlat; + +const START_POS: BlockPos = BlockPos::new(0, 100, 0); +const VIEW_DIST: u8 = 10; + +const BLOCK_TYPES: [BlockState; 7] = [ + BlockState::GRASS_BLOCK, + BlockState::OAK_LOG, + BlockState::BIRCH_LOG, + BlockState::OAK_LEAVES, + BlockState::BIRCH_LEAVES, + BlockState::DIRT, + BlockState::MOSS_BLOCK, +]; + +pub fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems( + Update, + ( + init_clients, + reset_clients.after(init_clients), + manage_chunks.after(reset_clients).before(manage_blocks), + manage_blocks, + despawn_disconnected_clients, + ), + ) + .run(); +} + +#[derive(Component)] +struct GameState { + blocks: VecDeque, + score: u32, + combo: u32, + target_y: i32, + last_block_timestamp: u128, +} + +fn init_clients( + mut clients: Query< + ( + Entity, + &mut Client, + &mut VisibleChunkLayer, + &mut IsFlat, + &mut GameMode, + ), + Added, + >, + server: Res, + dimensions: Res, + biomes: Res, + mut commands: Commands, +) { + for (entity, mut client, mut visible_chunk_layer, mut is_flat, mut game_mode) in + clients.iter_mut() + { + visible_chunk_layer.0 = entity; + is_flat.0 = true; + *game_mode = GameMode::Adventure; + + client.send_chat_message("Welcome to epic infinite parkour game!".italic()); + + let state = GameState { + blocks: VecDeque::new(), + score: 0, + combo: 0, + target_y: 0, + last_block_timestamp: 0, + }; + + let layer = ChunkLayer::new(ident!("overworld"), &dimensions, &biomes, &server); + + commands.entity(entity).insert((state, layer)); + } +} + +fn reset_clients( + mut clients: Query<( + &mut Client, + &mut Position, + &mut Look, + &mut GameState, + &mut ChunkLayer, + )>, +) { + for (mut client, mut pos, mut look, mut state, mut layer) in clients.iter_mut() { + let out_of_bounds = (pos.0.y as i32) < START_POS.y - 32; + + if out_of_bounds || state.is_added() { + if out_of_bounds && !state.is_added() { + client.send_chat_message( + "Your score was ".italic() + + state + .score + .to_string() + .color(Color::GOLD) + .bold() + .not_italic(), + ); + } + + // Init chunks. + for pos in ChunkView::new(START_POS.into(), VIEW_DIST).iter() { + layer.insert_chunk(pos, UnloadedChunk::new()); + } + + state.score = 0; + state.combo = 0; + + for block in &state.blocks { + layer.set_block(*block, BlockState::AIR); + } + state.blocks.clear(); + state.blocks.push_back(START_POS); + layer.set_block(START_POS, BlockState::STONE); + + for _ in 0..10 { + generate_next_block(&mut state, &mut layer, false); + } + + pos.set([ + START_POS.x as f64 + 0.5, + START_POS.y as f64 + 1.0, + START_POS.z as f64 + 0.5, + ]); + look.yaw = 0.0; + look.pitch = 0.0; + } + } +} + +fn manage_blocks(mut clients: Query<(&mut Client, &Position, &mut GameState, &mut ChunkLayer)>) { + for (mut client, pos, mut state, mut layer) in clients.iter_mut() { + let pos_under_player = BlockPos::new( + (pos.0.x - 0.5).round() as i32, + pos.0.y as i32 - 1, + (pos.0.z - 0.5).round() as i32, + ); + + if let Some(index) = state + .blocks + .iter() + .position(|block| *block == pos_under_player) + { + if index > 0 { + let power_result = 2.0f32.powf((state.combo as f32) / 45.0); + let max_time_taken = (1000.0f32 * (index as f32) / power_result) as u128; + + let current_time_millis = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_millis(); + + if current_time_millis - state.last_block_timestamp < max_time_taken { + state.combo += index as u32 + } else { + state.combo = 0 + } + + for _ in 0..index { + generate_next_block(&mut state, &mut layer, true) + } + + let pitch = 0.9 + ((state.combo as f32) - 1.0) * 0.05; + client.play_sound( + Sound::BlockNoteBlockBass, + SoundCategory::Master, + pos.0, + 1.0, + pitch, + ); + + client.set_title(""); + client.set_subtitle(state.score.to_string().color(Color::LIGHT_PURPLE).bold()); + } + } + } +} + +fn manage_chunks(mut clients: Query<(&Position, &OldPosition, &mut ChunkLayer), With>) { + for (pos, old_pos, mut layer) in &mut clients { + let old_view = ChunkView::new(old_pos.get().into(), VIEW_DIST); + let view = ChunkView::new(pos.0.into(), VIEW_DIST); + + if old_view != view { + for pos in old_view.diff(view) { + layer.remove_chunk(pos); + } + + for pos in view.diff(old_view) { + layer.chunk_entry(pos).or_default(); + } + } + } +} + +fn generate_next_block(state: &mut GameState, layer: &mut ChunkLayer, in_game: bool) { + if in_game { + let removed_block = state.blocks.pop_front().unwrap(); + layer.set_block(removed_block, BlockState::AIR); + + state.score += 1 + } + + let last_pos = *state.blocks.back().unwrap(); + let block_pos = generate_random_block(last_pos, state.target_y); + + if last_pos.y == START_POS.y { + state.target_y = 0 + } else if last_pos.y < START_POS.y - 30 || last_pos.y > START_POS.y + 30 { + state.target_y = START_POS.y; + } + + let mut rng = rand::thread_rng(); + + layer.set_block(block_pos, *BLOCK_TYPES.choose(&mut rng).unwrap()); + state.blocks.push_back(block_pos); + + // Combo System + state.last_block_timestamp = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_millis(); +} + +fn generate_random_block(pos: BlockPos, target_y: i32) -> BlockPos { + let mut rng = rand::thread_rng(); + + // if above or below target_y, change y to gradually reach it + let y = match target_y { + 0 => rng.gen_range(-1..2), + y if y > pos.y => 1, + _ => -1, + }; + let z = match y { + 1 => rng.gen_range(1..3), + -1 => rng.gen_range(2..5), + _ => rng.gen_range(1..4), + }; + let x = rng.gen_range(-3..4); + + BlockPos::new(pos.x + x, pos.y + y, pos.z + z) +} diff --git a/vendor/valence/examples/particles.rs b/vendor/valence/examples/particles.rs new file mode 100644 index 00000000..f230cd9f --- /dev/null +++ b/vendor/valence/examples/particles.rs @@ -0,0 +1,223 @@ +#![allow(clippy::type_complexity)] + +use std::fmt; + +use valence::prelude::*; + +const SPAWN_Y: i32 = 64; + +pub fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, setup) + .add_systems( + Update, + (init_clients, despawn_disconnected_clients, manage_particles), + ) + .run(); +} + +#[derive(Resource)] +struct ParticleVec(Vec); + +fn setup( + mut commands: Commands, + server: Res, + dimensions: Res, + biomes: Res, +) { + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + for z in -5..5 { + for x in -5..5 { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + layer.chunk.set_block([0, SPAWN_Y, 0], BlockState::BEDROCK); + + commands.spawn(layer); + + commands.insert_resource(ParticleVec(create_particle_vec())); +} + +fn init_clients( + mut clients: Query< + ( + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut Position, + &mut GameMode, + ), + Added, + >, + layers: Query, With)>, +) { + for ( + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut pos, + mut game_mode, + ) in &mut clients + { + let layer = layers.single(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + pos.set([0.0, SPAWN_Y as f64 + 1.0, 0.0]); + *game_mode = GameMode::Creative; + } +} + +fn manage_particles( + particles: Res, + server: Res, + mut layers: Query<&mut ChunkLayer>, + mut particle_idx: Local, +) { + if server.current_tick() % 10 != 0 { + return; + } + + let particle = &particles.0[*particle_idx]; + + *particle_idx = (*particle_idx + 1) % particles.0.len(); + + let name = dbg_name(particle); + + let pos = [0.5, SPAWN_Y as f64 + 2.0, 5.0]; + let offset = [0.5, 0.5, 0.5]; + + let mut layer = layers.single_mut(); + + layer.play_particle(particle, true, pos, offset, 0.1, 100); + layer.set_action_bar(name.bold()); +} + +fn dbg_name(dbg: &impl fmt::Debug) -> String { + let string = format!("{dbg:?}"); + + string + .split_once(|ch: char| !ch.is_ascii_alphabetic()) + .map(|(fst, _)| fst.to_owned()) + .unwrap_or(string) +} + +fn create_particle_vec() -> Vec { + vec![ + Particle::AmbientEntityEffect, + Particle::AngryVillager, + Particle::Block(BlockState::OAK_PLANKS), + Particle::BlockMarker(BlockState::GOLD_BLOCK), + Particle::Bubble, + Particle::Cloud, + Particle::Crit, + Particle::DamageIndicator, + Particle::DragonBreath, + Particle::DrippingLava, + Particle::FallingLava, + Particle::LandingLava, + Particle::DrippingWater, + Particle::FallingWater, + Particle::Dust { + rgb: Vec3::new(1.0, 1.0, 0.0), + scale: 2.0, + }, + Particle::DustColorTransition { + from_rgb: Vec3::new(1.0, 0.0, 0.0), + scale: 2.0, + to_rgb: Vec3::new(0.0, 1.0, 0.0), + }, + Particle::Effect, + Particle::ElderGuardian, + Particle::EnchantedHit, + Particle::Enchant, + Particle::EndRod, + Particle::EntityEffect, + Particle::ExplosionEmitter, + Particle::Explosion, + Particle::SonicBoom, + Particle::FallingDust(BlockState::RED_SAND), + Particle::Firework, + Particle::Fishing, + Particle::Flame, + Particle::CherryLeaves, + Particle::SculkSoul, + Particle::SculkCharge { roll: 1.0 }, + Particle::SculkChargePop, + Particle::SoulFireFlame, + Particle::Soul, + Particle::Flash, + Particle::HappyVillager, + Particle::Composter, + Particle::Heart, + Particle::InstantEffect, + Particle::Item(ItemStack::EMPTY), + Particle::Item(ItemStack::new(ItemKind::IronPickaxe, 1, None)), + Particle::VibrationBlock { + block_pos: [0, SPAWN_Y, 0].into(), + ticks: 50, + }, + Particle::VibrationEntity { + entity_id: 0, + entity_eye_height: 1.0, + ticks: 50, + }, + Particle::ItemSlime, + Particle::ItemSnowball, + Particle::LargeSmoke, + Particle::Lava, + Particle::Mycelium, + Particle::Note, + Particle::Poof, + Particle::Portal, + Particle::Rain, + Particle::Smoke, + Particle::Sneeze, + Particle::Spit, + Particle::SquidInk, + Particle::SweepAttack, + Particle::TotemOfUndying, + Particle::Underwater, + Particle::Splash, + Particle::Witch, + Particle::BubblePop, + Particle::CurrentDown, + Particle::BubbleColumnUp, + Particle::Nautilus, + Particle::Dolphin, + Particle::CampfireCosySmoke, + Particle::CampfireSignalSmoke, + Particle::DrippingHoney, + Particle::FallingHoney, + Particle::LandingHoney, + Particle::FallingNectar, + Particle::FallingSporeBlossom, + Particle::Ash, + Particle::CrimsonSpore, + Particle::WarpedSpore, + Particle::SporeBlossomAir, + Particle::DrippingObsidianTear, + Particle::FallingObsidianTear, + Particle::LandingObsidianTear, + Particle::ReversePortal, + Particle::WhiteAsh, + Particle::SmallFlame, + Particle::Snowflake, + Particle::DrippingDripstoneLava, + Particle::FallingDripstoneLava, + Particle::DrippingDripstoneWater, + Particle::FallingDripstoneWater, + Particle::GlowSquidInk, + Particle::Glow, + Particle::WaxOn, + Particle::WaxOff, + Particle::ElectricSpark, + Particle::Scrape, + Particle::Shriek { delay: 0 }, + Particle::EggCrack, + ] +} diff --git a/vendor/valence/examples/player_list.rs b/vendor/valence/examples/player_list.rs new file mode 100644 index 00000000..8b363528 --- /dev/null +++ b/vendor/valence/examples/player_list.rs @@ -0,0 +1,140 @@ +#![allow(clippy::type_complexity)] + +use rand::Rng; +use valence::keepalive::Ping; +use valence::player_list::{DisplayName, PlayerListEntryBundle}; +use valence::prelude::*; + +const SPAWN_Y: i32 = 64; +const PLAYER_UUID_1: Uuid = Uuid::from_u128(1); +const PLAYER_UUID_2: Uuid = Uuid::from_u128(2); + +fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, setup) + .add_systems( + Update, + ( + init_clients, + override_display_name, + update_player_list, + despawn_disconnected_clients, + ), + ) + .run(); +} + +fn setup( + mut commands: Commands, + server: Res, + dimensions: Res, + biomes: Res, +) { + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + for z in -5..5 { + for x in -5..5 { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + for z in -25..25 { + for x in -25..25 { + layer + .chunk + .set_block([x, SPAWN_Y, z], BlockState::LIGHT_GRAY_WOOL); + } + } + + commands.spawn(layer); + + commands.spawn(PlayerListEntryBundle { + uuid: UniqueId(PLAYER_UUID_1), + display_name: DisplayName(Some("persistent entry with no ping".into())), + ..Default::default() + }); +} + +fn init_clients( + mut clients: Query< + ( + &mut Client, + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut Position, + &mut GameMode, + ), + Added, + >, + layers: Query, With)>, +) { + for ( + mut client, + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut pos, + mut game_mode, + ) in &mut clients + { + let layer = layers.single(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + pos.set([0.0, SPAWN_Y as f64 + 1.0, 0.0]); + *game_mode = GameMode::Creative; + + client.send_chat_message( + "Please open your player list (tab key)." + .italic() + .color(Color::WHITE), + ); + } +} + +fn override_display_name(mut clients: Query<&mut DisplayName, (Added, With)>) { + for mut display_name in &mut clients { + display_name.0 = Some("ą¶ž".color(Color::rgb(255, 87, 66))); + } +} + +fn update_player_list( + mut player_list: ResMut, + server: Res, + mut entries: Query<(Entity, &UniqueId, &mut DisplayName), With>, + mut commands: Commands, +) { + let tick = server.current_tick(); + + player_list.set_header("Current tick: ".into_text() + tick); + player_list + .set_footer("Current tick but in purple: ".into_text() + tick.color(Color::LIGHT_PURPLE)); + + if tick % 5 == 0 { + for (_, uuid, mut display_name) in &mut entries { + if uuid.0 == PLAYER_UUID_1 { + let mut rng = rand::thread_rng(); + let color = Color::rgb(rng.gen(), rng.gen(), rng.gen()); + + let new_name = display_name.0.clone().unwrap_or_default().color(color); + display_name.0 = Some(new_name); + } + } + } + + if tick % 20 == 0 { + if let Some((entity, _, _)) = entries.iter().find(|(_, uuid, _)| uuid.0 == PLAYER_UUID_2) { + commands.entity(entity).insert(Despawned); + } else { + commands.spawn(PlayerListEntryBundle { + uuid: UniqueId(PLAYER_UUID_2), + display_name: DisplayName(Some("Hello!".into())), + ping: Ping(300), + ..Default::default() + }); + } + } +} diff --git a/vendor/valence/examples/potions.rs b/vendor/valence/examples/potions.rs new file mode 100644 index 00000000..607610a9 --- /dev/null +++ b/vendor/valence/examples/potions.rs @@ -0,0 +1,334 @@ +use rand::seq::SliceRandom; +use rand::Rng; +use valence::client::despawn_disconnected_clients; +use valence::entity::active_status_effects::{ActiveStatusEffect, ActiveStatusEffects}; +use valence::log::LogPlugin; +use valence::network::ConnectionMode; +use valence::prelude::*; +use valence::status_effects::{AttributeModifier, StatusEffect}; +use valence_server::entity::attributes::{EntityAttribute, EntityAttributes}; +use valence_server::entity::entity::Flags; +use valence_server::entity::living::{Absorption, Health}; +use valence_server::status_effect::{StatusEffectAdded, StatusEffectRemoved}; + +const SPAWN_Y: i32 = 64; + +// Notes: Some potion effects are implemented by the client (i.e. we don't need +// to send any more packets than just telling the client about them) and some +// are implemented by the server. The ones implemented by the client are: +// - Jump Boost +// - Night Vision +// - Nausea +// - Blindness +// - Darkness +// - Slow Falling +// - Levitation +// Perhaps also (haven't tested): +// - Dolphin's Grace +// - Conduit Power +// +// There are also a few different potion effects that are implemented by the +// server. Some can be implemented right now, for example: +// - Speed +// - Instant Health +// - Regeneration +// - Absorption +// - Glowing +// - etc. (i.e. the ones with AttributeModifiers, direct health changes or other +// trivial effects) +// +// Some can't be implemented right now because they require features that aren't +// implemented yet or must be implemented yourself, for example: +// - Water Breathing (requires the ability to breathe underwater) +// - Fire Resistance (requires the ability to not take damage from fire) +// - Hunger (requires the ability to get hungry) +// - Bad Omen (requires the ability to get a raid) +fn main() { + App::new() + .insert_resource(NetworkSettings { + connection_mode: ConnectionMode::Offline, + ..Default::default() + }) + .add_plugins(DefaultPlugins.build().disable::()) + .add_systems(Startup, setup) + .add_systems( + EventLoopUpdate, + ( + add_potion_effect, + handle_status_effect_added, + handle_status_effect_removed, + ), + ) + .add_systems( + Update, + ( + init_clients, + despawn_disconnected_clients, + handle_status_effect_update, + ), + ) + .run(); +} + +fn setup( + mut commands: Commands, + server: Res, + biomes: Res, + dimensions: Res, +) { + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + for z in -5..5 { + for x in -5..5 { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + for z in -25..25 { + for x in -25..25 { + layer + .chunk + .set_block([x, SPAWN_Y, z], BlockState::GRASS_BLOCK); + } + } + + commands.spawn(layer); +} + +#[allow(clippy::type_complexity)] +fn init_clients( + mut clients: Query< + ( + &mut Client, + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut Position, + &mut GameMode, + ), + Added, + >, + layers: Query, With)>, +) { + for ( + mut client, + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut pos, + mut game_mode, + ) in &mut clients + { + let layer = layers.single(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + pos.set([0.0, SPAWN_Y as f64 + 1.0, 0.0]); + *game_mode = GameMode::Survival; + + client.send_chat_message("Welcome to the potions example.".bold()); + client.send_chat_message("Sneak to apply a random potion effect.".into_text()); + client.send_chat_message("Note: Some potion effects are not implemented yet.".into_text()); + } +} + +pub fn add_potion_effect( + mut clients: Query<&mut ActiveStatusEffects>, + mut events: EventReader, +) { + let mut rng = rand::thread_rng(); + for event in events.read() { + if event.state == SneakState::Start { + if let Ok(mut status) = clients.get_mut(event.client) { + status.apply( + ActiveStatusEffect::from_effect(*StatusEffect::ALL.choose(&mut rng).unwrap()) + .with_duration(rng.gen_range(10..1000)) + .with_amplifier(rng.gen_range(0..5)), + ); + } + } + } +} + +fn adjust_modifier_amount(amplifier: u8, amount: f64) -> f64 { + amount * (amplifier + 1) as f64 +} + +fn apply_potion_attribute( + attributes: &mut Mut, + health: &mut Option>, + amplifier: u8, + attr: AttributeModifier, +) { + attributes.remove_modifier(attr.attribute, attr.uuid); + + let amount = adjust_modifier_amount(amplifier, attr.value); + + attributes.set_modifier(attr.attribute, attr.uuid, amount, attr.operation); + + // not quite how vanilla does it, but it's close enough + if attr.attribute == EntityAttribute::GenericMaxHealth { + if let Some(ref mut health) = health { + health.0 = health.0.min( + attributes + .get_compute_value(EntityAttribute::GenericMaxHealth) + .unwrap_or(0.0) as f32, + ); + } + } +} + +fn remove_potion_attribute( + attributes: &mut Mut, + health: &mut Option>, + attr: AttributeModifier, +) { + attributes.remove_modifier(attr.attribute, attr.uuid); + + if attr.attribute == EntityAttribute::GenericMaxHealth { + if let Some(ref mut health) = health { + health.0 = health.0.min( + attributes + .get_compute_value(EntityAttribute::GenericMaxHealth) + .unwrap_or(0.0) as f32, + ); + } + } +} + +#[allow(clippy::type_complexity)] +pub fn handle_status_effect_added( + mut clients: Query<( + &ActiveStatusEffects, + &mut EntityAttributes, + Option<&mut Health>, + Option<&mut Absorption>, + &mut Flags, + )>, + mut events: EventReader, +) { + for event in events.read() { + if let Ok((status, mut attributes, mut health, absorption, mut flags)) = + clients.get_mut(event.entity) + { + let effect = status.get_current_effect(event.status_effect).unwrap(); + + match event.status_effect { + StatusEffect::Absorption => { + // not quite how vanilla does it. if you want to do it the vanilla way, you'll + // need to keep track of the previous absorption value and subtract that from + // the new value (because you can take damage while having absorption) + if let Some(mut absorption) = absorption { + absorption.0 += (effect.amplifier() + 1) as f32 * 4.0; + } + } + StatusEffect::InstantHealth => { + if let Some(mut health) = health { + health.0 += (4 << effect.amplifier().min(31)) as f32; + } + } + StatusEffect::InstantDamage => { + if let Some(mut health) = health { + health.0 -= (6 << effect.amplifier().min(31)) as f32; + } + } + StatusEffect::Glowing => { + flags.set_glowing(true); + } + StatusEffect::Invisibility => { + flags.set_invisible(true); + } + status => { + for attr in status.attribute_modifiers() { + apply_potion_attribute( + &mut attributes, + &mut health, + effect.amplifier(), + attr, + ); + } + } + } + } + } +} + +pub fn handle_status_effect_removed( + mut clients: Query<( + &mut EntityAttributes, + Option<&mut Health>, + Option<&mut Absorption>, + &mut Flags, + )>, + mut events: EventReader, +) { + for event in events.read() { + if let Ok((mut attributes, mut health, absorption, mut flags)) = + clients.get_mut(event.entity) + { + let effect = &event.status_effect; + match effect.status_effect() { + StatusEffect::Absorption => { + if let Some(mut absorption) = absorption { + absorption.0 -= (effect.amplifier() + 1) as f32 * 4.0; + } + } + StatusEffect::Glowing => { + flags.set_glowing(false); + } + StatusEffect::Invisibility => { + flags.set_invisible(false); + } + status => { + for attr in status.attribute_modifiers() { + remove_potion_attribute(&mut attributes, &mut health, attr); + } + } + } + } + } +} + +pub fn handle_status_effect_update( + mut clients: Query<(&ActiveStatusEffects, &EntityAttributes, Option<&mut Health>)>, +) { + for (status, attributes, mut health) in &mut clients.iter_mut() { + for effect in status.get_current_effects() { + match effect.status_effect() { + StatusEffect::Regeneration => { + let i = 50 >> effect.amplifier().min(31) as u32; + + if i == 0 || effect.active_ticks() % i == 0 { + if let Some(ref mut health) = health { + health.0 = (health.0 + 1.0).min( + attributes + .get_compute_value(EntityAttribute::GenericMaxHealth) + .unwrap_or(0.0) as f32, + ); + } + } + } + StatusEffect::Poison => { + let i = 25 >> effect.amplifier().min(31) as u32; + + if i == 0 || effect.active_ticks() % i == 0 { + if let Some(ref mut health) = health { + health.0 = (health.0 - 1.0).max(1.0); + } + } + } + StatusEffect::Wither => { + let i = 40 >> effect.amplifier().min(31) as u32; + + if i == 0 || effect.active_ticks() % i == 0 { + if let Some(ref mut health) = health { + health.0 = (health.0 - 1.0).max(0.0); + } + } + } + _ => {} + } + } + } +} diff --git a/vendor/valence/examples/resource_pack.rs b/vendor/valence/examples/resource_pack.rs new file mode 100644 index 00000000..fa7228cd --- /dev/null +++ b/vendor/valence/examples/resource_pack.rs @@ -0,0 +1,132 @@ +#![allow(clippy::type_complexity)] + +use valence::entity::sheep::SheepEntityBundle; +use valence::message::SendMessage; +use valence::prelude::*; +use valence::protocol::packets::play::ResourcePackStatusC2s; +use valence::resource_pack::ResourcePackStatusEvent; + +const SPAWN_Y: i32 = 64; + +pub fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, setup) + .add_systems( + Update, + ( + init_clients, + prompt_on_punch, + on_resource_pack_status, + despawn_disconnected_clients, + ), + ) + .run(); +} + +fn setup( + mut commands: Commands, + server: Res, + dimensions: Res, + biomes: Res, +) { + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + for z in -5..5 { + for x in -5..5 { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + for z in -25..25 { + for x in -25..25 { + layer.chunk.set_block([x, SPAWN_Y, z], BlockState::BEDROCK); + } + } + + let layer_ent = commands.spawn(layer).id(); + + commands.spawn(SheepEntityBundle { + layer: EntityLayerId(layer_ent), + position: Position::new([0.0, SPAWN_Y as f64 + 1.0, 2.0]), + look: Look::new(180.0, 0.0), + head_yaw: HeadYaw(180.0), + ..Default::default() + }); +} + +fn init_clients( + mut clients: Query< + ( + &mut Client, + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut Position, + &mut GameMode, + ), + Added, + >, + layers: Query, With)>, +) { + for ( + mut client, + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut pos, + mut game_mode, + ) in &mut clients + { + let layer = layers.single(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + pos.set([0.0, SPAWN_Y as f64 + 1.0, 0.0]); + *game_mode = GameMode::Creative; + + client.send_chat_message("Hit the sheep to prompt for the resource pack.".italic()); + } +} + +fn prompt_on_punch(mut clients: Query<&mut Client>, mut events: EventReader) { + for event in events.read() { + if let Ok(mut client) = clients.get_mut(event.client) { + if event.interact == EntityInteraction::Attack { + client.set_resource_pack( + "https://github.com/valence-rs/valence/raw/main/assets/example_pack.zip", + "d7c6108849fb190ec2a49f2d38b7f1f897d9ce9f", + false, + None, + ); + } + }; + } +} + +fn on_resource_pack_status( + mut clients: Query<&mut Client>, + mut events: EventReader, +) { + for event in events.read() { + if let Ok(mut client) = clients.get_mut(event.client) { + match event.status { + ResourcePackStatusC2s::Accepted => { + client.send_chat_message("Resource pack accepted.".color(Color::GREEN)); + } + ResourcePackStatusC2s::Declined => { + client.send_chat_message("Resource pack declined.".color(Color::RED)); + } + ResourcePackStatusC2s::FailedDownload => { + client.send_chat_message("Resource pack failed to download.".color(Color::RED)); + } + ResourcePackStatusC2s::SuccessfullyLoaded => { + client.send_chat_message( + "Resource pack successfully downloaded.".color(Color::BLUE), + ); + } + } + }; + } +} diff --git a/vendor/valence/examples/server_list_ping.rs b/vendor/valence/examples/server_list_ping.rs new file mode 100644 index 00000000..f0d39c59 --- /dev/null +++ b/vendor/valence/examples/server_list_ping.rs @@ -0,0 +1,63 @@ +#![allow(clippy::type_complexity)] + +use std::net::SocketAddr; + +use rand::Rng; +use valence::network::{ + async_trait, BroadcastToLan, CleanupFn, ConnectionMode, HandshakeData, PlayerSampleEntry, + ServerListPing, +}; +use valence::prelude::*; +use valence::MINECRAFT_VERSION; + +pub fn main() { + App::new() + .insert_resource(NetworkSettings { + connection_mode: ConnectionMode::Offline, + callbacks: MyCallbacks.into(), + ..Default::default() + }) + .add_plugins(DefaultPlugins) + .run(); +} + +struct MyCallbacks; + +#[async_trait] +impl NetworkCallbacks for MyCallbacks { + async fn server_list_ping( + &self, + _shared: &SharedNetworkState, + remote_addr: SocketAddr, + handshake_data: &HandshakeData, + ) -> ServerListPing { + let max_players = 420; + + ServerListPing::Respond { + online_players: rand::thread_rng().gen_range(0..=max_players), + max_players, + player_sample: vec![PlayerSampleEntry { + name: "foobar".into(), + id: Uuid::from_u128(12345), + }], + description: "Your IP address is ".into_text() + + remote_addr.to_string().color(Color::rgb(50, 50, 250)), + favicon_png: include_bytes!("../assets/logo-64x64.png"), + version_name: ("Valence ".color(Color::GOLD) + MINECRAFT_VERSION.color(Color::RED)) + .to_legacy_lossy(), + protocol: handshake_data.protocol_version, + } + } + + async fn broadcast_to_lan(&self, _shared: &SharedNetworkState) -> BroadcastToLan { + BroadcastToLan::Enabled("Hello Valence!".into()) + } + + async fn login( + &self, + _shared: &SharedNetworkState, + _info: &NewClientInfo, + ) -> Result { + Err("You are not meant to join this example".color(Color::RED)) + } +} diff --git a/vendor/valence/examples/terrain.rs b/vendor/valence/examples/terrain.rs new file mode 100644 index 00000000..f7aee57d --- /dev/null +++ b/vendor/valence/examples/terrain.rs @@ -0,0 +1,366 @@ +#![allow(clippy::type_complexity)] + +use std::collections::hash_map::Entry; +use std::collections::HashMap; +use std::sync::Arc; +use std::thread; +use std::time::SystemTime; + +use flume::{Receiver, Sender}; +use noise::{NoiseFn, SuperSimplex}; +use tracing::info; +use valence::prelude::*; +use valence::spawn::IsFlat; + +const SPAWN_POS: DVec3 = DVec3::new(0.0, 200.0, 0.0); +const HEIGHT: u32 = 384; + +struct ChunkWorkerState { + sender: Sender<(ChunkPos, UnloadedChunk)>, + receiver: Receiver, + // Noise functions + density: SuperSimplex, + hilly: SuperSimplex, + stone: SuperSimplex, + gravel: SuperSimplex, + grass: SuperSimplex, +} + +#[derive(Resource)] +struct GameState { + /// Chunks that need to be generated. Chunks without a priority have already + /// been sent to the thread pool. + pending: HashMap>, + sender: Sender, + receiver: Receiver<(ChunkPos, UnloadedChunk)>, +} + +/// The order in which chunks should be processed by the thread pool. Smaller +/// values are sent first. +type Priority = u64; + +pub fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, setup) + .add_systems( + Update, + ( + ( + init_clients, + remove_unviewed_chunks, + update_client_views, + send_recv_chunks, + ) + .chain(), + despawn_disconnected_clients, + ), + ) + .run(); +} + +fn setup( + mut commands: Commands, + server: Res, + dimensions: Res, + biomes: Res, +) { + let seconds_per_day = 86_400; + let seed = (SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .unwrap() + .as_secs() + / seconds_per_day) as u32; + + info!("current seed: {seed}"); + + let (finished_sender, finished_receiver) = flume::unbounded(); + let (pending_sender, pending_receiver) = flume::unbounded(); + + let state = Arc::new(ChunkWorkerState { + sender: finished_sender, + receiver: pending_receiver, + density: SuperSimplex::new(seed), + hilly: SuperSimplex::new(seed.wrapping_add(1)), + stone: SuperSimplex::new(seed.wrapping_add(2)), + gravel: SuperSimplex::new(seed.wrapping_add(3)), + grass: SuperSimplex::new(seed.wrapping_add(4)), + }); + + // Chunks are generated in a thread pool for parallelism and to avoid blocking + // the main tick loop. You can use your thread pool of choice here (rayon, + // bevy_tasks, etc). Only the standard library is used in the example for the + // sake of simplicity. + // + // If your chunk generation algorithm is inexpensive then there's no need to do + // this. + for _ in 0..thread::available_parallelism().unwrap().get() { + let state = state.clone(); + thread::spawn(move || chunk_worker(state)); + } + + commands.insert_resource(GameState { + pending: HashMap::new(), + sender: pending_sender, + receiver: finished_receiver, + }); + + let layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + commands.spawn(layer); +} + +fn init_clients( + mut clients: Query< + ( + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut Position, + &mut GameMode, + &mut IsFlat, + ), + Added, + >, + layers: Query, With)>, +) { + for ( + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut pos, + mut game_mode, + mut is_flat, + ) in &mut clients + { + let layer = layers.single(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + pos.set(SPAWN_POS); + *game_mode = GameMode::Creative; + is_flat.0 = true; + } +} + +fn remove_unviewed_chunks(mut layers: Query<&mut ChunkLayer>) { + layers + .single_mut() + .retain_chunks(|_, chunk| chunk.viewer_count_mut() > 0); +} + +fn update_client_views( + mut layers: Query<&mut ChunkLayer>, + mut clients: Query<(&mut Client, View, OldView)>, + mut state: ResMut, +) { + let layer = layers.single_mut(); + + for (client, view, old_view) in &mut clients { + let view = view.get(); + let queue_pos = |pos: ChunkPos| { + if layer.chunk(pos).is_none() { + match state.pending.entry(pos) { + Entry::Occupied(mut oe) => { + if let Some(priority) = oe.get_mut() { + let dist = view.pos.distance_squared(pos); + *priority = (*priority).min(dist); + } + } + Entry::Vacant(ve) => { + let dist = view.pos.distance_squared(pos); + ve.insert(Some(dist)); + } + } + } + }; + + // Queue all the new chunks in the view to be sent to the thread pool. + if client.is_added() { + view.iter().for_each(queue_pos); + } else { + let old_view = old_view.get(); + if old_view != view { + view.diff(old_view).for_each(queue_pos); + } + } + } +} + +fn send_recv_chunks(mut layers: Query<&mut ChunkLayer>, state: ResMut) { + let mut layer = layers.single_mut(); + let state = state.into_inner(); + + // Insert the chunks that are finished generating into the instance. + for (pos, chunk) in state.receiver.drain() { + layer.insert_chunk(pos, chunk); + assert!(state.pending.remove(&pos).is_some()); + } + + // Collect all the new chunks that need to be loaded this tick. + let mut to_send = vec![]; + + for (pos, priority) in &mut state.pending { + if let Some(pri) = priority.take() { + to_send.push((pri, pos)); + } + } + + // Sort chunks by ascending priority. + to_send.sort_unstable_by_key(|(pri, _)| *pri); + + // Send the sorted chunks to be loaded. + for (_, pos) in to_send { + let _ = state.sender.try_send(*pos); + } +} + +fn chunk_worker(state: Arc) { + while let Ok(pos) = state.receiver.recv() { + let mut chunk = UnloadedChunk::with_height(HEIGHT); + + for offset_z in 0..16 { + for offset_x in 0..16 { + let x = offset_x as i32 + pos.x * 16; + let z = offset_z as i32 + pos.z * 16; + + let mut in_terrain = false; + let mut depth = 0; + + // Fill in the terrain column. + for y in (0..chunk.height() as i32).rev() { + const WATER_HEIGHT: i32 = 55; + + let p = DVec3::new(x as f64, y as f64, z as f64); + + let block = if has_terrain_at(&state, p) { + let gravel_height = WATER_HEIGHT + - 1 + - (fbm(&state.gravel, p / 10.0, 3, 2.0, 0.5) * 6.0).floor() as i32; + + if in_terrain { + if depth > 0 { + depth -= 1; + if y < gravel_height { + BlockState::GRAVEL + } else { + BlockState::DIRT + } + } else { + BlockState::STONE + } + } else { + in_terrain = true; + let n = noise01(&state.stone, p / 15.0); + + depth = (n * 5.0).round() as u32; + + if y < gravel_height { + BlockState::GRAVEL + } else if y < WATER_HEIGHT - 1 { + BlockState::DIRT + } else { + BlockState::GRASS_BLOCK + } + } + } else { + in_terrain = false; + depth = 0; + if y < WATER_HEIGHT { + BlockState::WATER + } else { + BlockState::AIR + } + }; + + chunk.set_block_state(offset_x, y as u32, offset_z, block); + } + + // Add grass on top of grass blocks. + for y in (0..chunk.height()).rev() { + if chunk.block_state(offset_x, y, offset_z).is_air() + && chunk.block_state(offset_x, y - 1, offset_z) == BlockState::GRASS_BLOCK + { + let p = DVec3::new(x as f64, y as f64, z as f64); + let density = fbm(&state.grass, p / 5.0, 4, 2.0, 0.7); + + if density > 0.55 { + if density > 0.7 + && chunk.block_state(offset_x, y + 1, offset_z).is_air() + { + let upper = + BlockState::TALL_GRASS.set(PropName::Half, PropValue::Upper); + let lower = + BlockState::TALL_GRASS.set(PropName::Half, PropValue::Lower); + + chunk.set_block_state(offset_x, y + 1, offset_z, upper); + chunk.set_block_state(offset_x, y, offset_z, lower); + } else { + chunk.set_block_state(offset_x, y, offset_z, BlockState::GRASS); + } + } + } + } + } + } + + let _ = state.sender.try_send((pos, chunk)); + } +} + +fn has_terrain_at(state: &ChunkWorkerState, p: DVec3) -> bool { + let hilly = lerp(0.1, 1.0, noise01(&state.hilly, p / 400.0)).powi(2); + + let lower = 15.0 + 100.0 * hilly; + let upper = lower + 100.0 * hilly; + + if p.y <= lower { + return true; + } else if p.y >= upper { + return false; + } + + let density = 1.0 - lerpstep(lower, upper, p.y); + + let n = fbm(&state.density, p / 100.0, 4, 2.0, 0.5); + + n < density +} + +fn lerp(a: f64, b: f64, t: f64) -> f64 { + a * (1.0 - t) + b * t +} + +fn lerpstep(edge0: f64, edge1: f64, x: f64) -> f64 { + if x <= edge0 { + 0.0 + } else if x >= edge1 { + 1.0 + } else { + (x - edge0) / (edge1 - edge0) + } +} + +fn fbm(noise: &SuperSimplex, p: DVec3, octaves: u32, lacunarity: f64, persistence: f64) -> f64 { + let mut freq = 1.0; + let mut amp = 1.0; + let mut amp_sum = 0.0; + let mut sum = 0.0; + + for _ in 0..octaves { + let n = noise01(noise, p * freq); + sum += n * amp; + amp_sum += amp; + + freq *= lacunarity; + amp *= persistence; + } + + // Scale the output to [0, 1] + sum / amp_sum +} + +fn noise01(noise: &SuperSimplex, p: DVec3) -> f64 { + (noise.get(p.to_array()) + 1.0) / 2.0 +} diff --git a/vendor/valence/examples/text.rs b/vendor/valence/examples/text.rs new file mode 100644 index 00000000..8a7ed9eb --- /dev/null +++ b/vendor/valence/examples/text.rs @@ -0,0 +1,150 @@ +#![allow(clippy::type_complexity)] + +use valence::lang::keys; +use valence::prelude::*; + +const SPAWN_Y: i32 = 64; + +pub fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, setup) + .add_systems(Update, (init_clients, despawn_disconnected_clients)) + .run(); +} + +fn setup( + mut commands: Commands, + server: Res, + dimensions: Res, + biomes: Res, +) { + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + for z in -5..5 { + for x in -5..5 { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + for z in -25..25 { + for x in -25..25 { + layer + .chunk + .set_block([x, SPAWN_Y, z], BlockState::GRASS_BLOCK); + } + } + + commands.spawn(layer); +} + +fn init_clients( + mut clients: Query< + ( + &mut Client, + &mut Position, + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut GameMode, + ), + Added, + >, + layers: Query, With)>, +) { + for ( + mut client, + mut pos, + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut game_mode, + ) in &mut clients + { + let layer = layers.single(); + + pos.0 = [0.0, SPAWN_Y as f64 + 1.0, 0.0].into(); + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + *game_mode = GameMode::Creative; + + client.send_chat_message("Welcome to the text example.".bold()); + client.send_chat_message( + "The following examples show ways to use the different text components.", + ); + + // Text examples + client.send_chat_message("\nText"); + client.send_chat_message(" - ".into_text() + Text::text("Plain text")); + client.send_chat_message(" - ".into_text() + Text::text("Styled text").italic()); + client.send_chat_message(" - ".into_text() + Text::text("Colored text").color(Color::GOLD)); + client.send_chat_message( + " - ".into_text() + + Text::text("Colored and styled text") + .color(Color::GOLD) + .italic() + .underlined(), + ); + + // Translated text examples + client.send_chat_message("\nTranslated Text"); + client.send_chat_message( + " - 'chat.type.advancement.task': ".into_text() + + Text::translate(keys::CHAT_TYPE_ADVANCEMENT_TASK, []), + ); + client.send_chat_message( + " - 'chat.type.advancement.task' with slots: ".into_text() + + Text::translate( + keys::CHAT_TYPE_ADVANCEMENT_TASK, + ["arg1".into(), "arg2".into()], + ), + ); + client.send_chat_message( + " - 'custom.translation_key': ".into_text() + + Text::translate("custom.translation_key", []), + ); + + // Scoreboard value example + client.send_chat_message("\nScoreboard Values"); + client.send_chat_message(" - Score: ".into_text() + Text::score("*", "objective", None)); + client.send_chat_message( + " - Score with custom value: ".into_text() + + Text::score("*", "objective", Some("value".into())), + ); + + // Entity names example + client.send_chat_message("\nEntity Names (Selector)"); + client.send_chat_message(" - Nearest player: ".into_text() + Text::selector("@p", None)); + client.send_chat_message(" - Random player: ".into_text() + Text::selector("@r", None)); + client.send_chat_message(" - All players: ".into_text() + Text::selector("@a", None)); + client.send_chat_message(" - All entities: ".into_text() + Text::selector("@e", None)); + client.send_chat_message( + " - All entities with custom separator: ".into_text() + + Text::selector("@e", Some(", ".into_text().color(Color::GOLD))), + ); + + // Keybind example + client.send_chat_message("\nKeybind"); + client + .send_chat_message(" - 'key.inventory': ".into_text() + Text::keybind("key.inventory")); + + // NBT examples + client.send_chat_message("\nNBT"); + client.send_chat_message( + " - Block NBT: ".into_text() + Text::block_nbt("{}", "0 1 0", None, None), + ); + client.send_chat_message( + " - Entity NBT: ".into_text() + Text::entity_nbt("{}", "@a", None, None), + ); + client.send_chat_message( + " - Storage NBT: ".into_text() + + Text::storage_nbt(ident!("storage.key"), "@a", None, None), + ); + + client.send_chat_message( + "\n\n↑ ".into_text().bold().color(Color::GOLD) + + "Scroll up to see the full example!".into_text().not_bold(), + ); + } +} diff --git a/vendor/valence/examples/weather.rs b/vendor/valence/examples/weather.rs new file mode 100644 index 00000000..5d7cd645 --- /dev/null +++ b/vendor/valence/examples/weather.rs @@ -0,0 +1,126 @@ +use std::f64::consts::TAU; + +use valence::prelude::*; +use valence::weather::{Rain, Thunder, WeatherBundle}; +use valence_server::nbt::{compound, List}; + +pub fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, setup) + .add_systems( + Update, + (init_clients, despawn_disconnected_clients, change_weather), + ) + .run(); +} + +fn setup( + mut commands: Commands, + server: Res, + dimensions: Res, + biomes: Res, +) { + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + for z in -5..5 { + for x in -5..5 { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + for z in -16..16 { + for x in 0..16 { + layer.chunk.set_block([x, -64, z], BlockState::GRASS_BLOCK); + layer + .chunk + .set_block([-x, x - 64, z], BlockState::GRASS_BLOCK); + } + } + + layer.chunk.set_block( + [8, -63, 2], + Block { + state: BlockState::OAK_SIGN.set(PropName::Rotation, PropValue::_8), + nbt: Some(compound! { + "front_text" => compound! { + "messages" => List::String(vec![ + "Some blocks do".into_text().into(), + "not block motion".into_text().into(), + "such as rain.".into_text().into(), + "(e.g. a sapling)".into_text().into(), + ]), + } + }), + }, + ); + layer.chunk.set_block([7, -63, 2], BlockState::OAK_SAPLING); + + layer.chunk.set_block( + [6, -63, 2], + Block { + state: BlockState::OAK_SIGN.set(PropName::Rotation, PropValue::_8), + nbt: Some(compound! { + "front_text" => compound! { + "messages" => List::String(vec![ + "However, liquids".into_text().into(), + "and waterlogged".into_text().into(), + "blocks do.".into_text().into(), + "".into_text().into(), + ]), + } + }), + }, + ); + layer.chunk.set_block( + [5, -63, 2], + BlockState::POWERED_RAIL.set(PropName::Waterlogged, PropValue::True), + ); + + commands.spawn((layer, WeatherBundle::default())); +} + +fn init_clients( + mut clients: Query< + ( + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut Position, + &mut GameMode, + ), + Added, + >, + layers: Query, With)>, +) { + for ( + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut pos, + mut game_mode, + ) in &mut clients + { + let layer = layers.single(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + pos.set([8.0, -63.0, 0.0]); + *game_mode = GameMode::Creative; + } +} + +fn change_weather( + mut layers: Query<(&mut Rain, &mut Thunder), With>, + server: Res, +) { + let period = 10.0; + + let level = ((server.current_tick() as f64 / 20.0 * TAU / period).sin() + 1.0) / 2.0; + + for (mut rain, mut thunder) in &mut layers { + rain.0 = level as f32; + thunder.0 = level as f32; + } +} diff --git a/vendor/valence/examples/world_border.rs b/vendor/valence/examples/world_border.rs new file mode 100644 index 00000000..a6903751 --- /dev/null +++ b/vendor/valence/examples/world_border.rs @@ -0,0 +1,145 @@ +#![allow(clippy::type_complexity)] + +use bevy_app::App; +use valence::client::despawn_disconnected_clients; +use valence::inventory::HeldItem; +use valence::message::{ChatMessageEvent, SendMessage}; +use valence::prelude::*; +use valence::world_border::*; + +const SPAWN_Y: i32 = 64; + +fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, setup) + .add_systems( + Update, + ( + despawn_disconnected_clients, + init_clients, + border_controls, + display_diameter, + ), + ) + .run(); +} + +fn setup( + mut commands: Commands, + server: Res, + biomes: Res, + dimensions: Res, +) { + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + for z in -5..5 { + for x in -5..5 { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + for z in -25..25 { + for x in -25..25 { + layer + .chunk + .set_block([x, SPAWN_Y, z], BlockState::MOSSY_COBBLESTONE); + } + } + + commands.spawn(( + layer, + WorldBorderBundle { + lerp: WorldBorderLerp { + target_diameter: 10.0, + ..Default::default() + }, + ..Default::default() + }, + )); +} + +fn init_clients( + mut clients: Query< + ( + &mut Client, + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut Position, + &mut Inventory, + &HeldItem, + ), + Added, + >, + layers: Query>, +) { + for ( + mut client, + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut pos, + mut inv, + main_slot, + ) in &mut clients + { + let layer = layers.single(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + pos.set([0.5, SPAWN_Y as f64 + 1.0, 0.5]); + let pickaxe = ItemStack::new(ItemKind::WoodenPickaxe, 1, None); + inv.set_slot(main_slot.slot(), pickaxe); + client + .send_chat_message("Use `add` and `center` chat messages to change the world border."); + } +} + +fn display_diameter(mut layers: Query<(&mut ChunkLayer, &WorldBorderLerp)>) { + for (mut layer, lerp) in &mut layers { + if lerp.remaining_ticks > 0 { + layer.send_chat_message(format!("diameter = {}", lerp.current_diameter)); + } + } +} + +fn border_controls( + mut events: EventReader, + mut layers: Query<(&mut WorldBorderCenter, &mut WorldBorderLerp), With>, +) { + for x in events.read() { + let parts: Vec<&str> = x.message.split(' ').collect(); + match parts[0] { + "add" => { + let Ok(value) = parts[1].parse::() else { + return; + }; + + let Ok(ticks) = parts[2].parse::() else { + return; + }; + + let (_, mut lerp) = layers.single_mut(); + + lerp.target_diameter = lerp.current_diameter + value; + lerp.remaining_ticks = ticks; + } + "center" => { + let Ok(x) = parts[1].parse::() else { + return; + }; + + let Ok(z) = parts[2].parse::() else { + return; + }; + + let (mut center, _) = layers.single_mut(); + center.x = x; + center.z = z; + } + _ => (), + } + } +} diff --git a/vendor/valence/extractor/README.md b/vendor/valence/extractor/README.md new file mode 100644 index 00000000..c03b52ce --- /dev/null +++ b/vendor/valence/extractor/README.md @@ -0,0 +1,47 @@ +# Valence Extractor + +This is a Fabric mod for Minecraft that extracts data about different things in Minecraft, like blocks, packets, etc. The extracted data is stored within the Rust packages that need them. + +## How to use + +Here's how to regenerate the contents of `extracted`. + +From this directory, run the following + +```sh +./gradlew runServer +``` + +This will run the extractor and immediately exit, outputting the files that are listed in the logs. + +Next, run `copy_extractor_output.sh`. This copies the files to the appropriate locations so that they can be committed. + +```sh +./copy_extractor_output.sh +``` + +## How to update valence to a new version of Minecraft + +The general process should go something like this: +1. Update `gradle.properties` to the new version of Minecraft using https://fabricmc.net/develop +2. Update `src/main/resources/fabric.mod.json` to reference new version of Minecraft +3. Update `PROTOCOL_VERSION` and `MINECRAFT_VERSION` constants in `valence_protocol/src/lib.rs` +4. Attempt to run `./gradlew runServer` and fix any errors that come up +5. Run `./copy_extractor_output.sh` +6. In `*.toml`s, replace all strings of the old mc version with the new mc version +7. Try all the examples. If they work, you're probably done. + + +If you need to update gradle, running this will automatically update the wrapper to the specified version, and update `gradle/gradle-wrapper.properties`. +```sh +./gradlew wrapper --gradle-version VERSION +``` + +You may also need to update the fabric mappings in the mod. +```sh +./gradlew migrateMappings --mappings "VERSION" +``` + +## Contributing + +Run `./gradlew genSources` to generate Minecraft Java source files for your IDE. diff --git a/vendor/valence/extractor/build.gradle b/vendor/valence/extractor/build.gradle new file mode 100644 index 00000000..3181fb39 --- /dev/null +++ b/vendor/valence/extractor/build.gradle @@ -0,0 +1,42 @@ +plugins { + id 'fabric-loom' version '1.2-SNAPSHOT' +} + +sourceCompatibility = JavaVersion.VERSION_17 +targetCompatibility = JavaVersion.VERSION_17 + +archivesBaseName = project.archives_base_name +version = project.mod_version +group = project.maven_group + +dependencies { + implementation 'com.google.code.gson:gson:2.10.1' + + // To change the versions see the gradle.properties file + minecraft "com.mojang:minecraft:${project.minecraft_version}" + mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" + modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" + modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" +} + +processResources { + inputs.property "version", project.version + + filesMatching("fabric.mod.json") { + expand "version": project.version + } +} + +tasks.withType(JavaCompile).configureEach { + it.options.release = 17 +} + +java { + withSourcesJar() +} + +jar { + from("LICENSE") { + rename { "${it}_${project.archivesBaseName}"} + } +} diff --git a/vendor/valence/extractor/copy_extractor_output.sh b/vendor/valence/extractor/copy_extractor_output.sh new file mode 100755 index 00000000..5724b665 --- /dev/null +++ b/vendor/valence/extractor/copy_extractor_output.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +# Copies all files generated by the extractor to the necessary locations. +# Run the extractor first (`./gradlew runServer`) before running this. + +set -euxo pipefail + +cd "$(dirname "$0")" + +cp run/valence_extractor_output/{entities,misc}.json ../crates/valence_entity/extracted/ +cp run/valence_extractor_output/{attributes,blocks,effects,items,packets,sounds}.json ../crates/valence_generated/extracted/ +cp run/valence_extractor_output/translation_keys.json ../crates/valence_lang/extracted/ +cp run/valence_extractor_output/{registry_codec.dat,tags.json} ../crates/valence_registry/extracted/ +cp run/valence_extractor_output/packets.json ../tools/packet_inspector/extracted/ diff --git a/vendor/valence/extractor/gradle.properties b/vendor/valence/extractor/gradle.properties new file mode 100644 index 00000000..f75e3311 --- /dev/null +++ b/vendor/valence/extractor/gradle.properties @@ -0,0 +1,13 @@ +# Done to increase the memory available to gradle. +org.gradle.jvmargs=-Xmx1G +# Fabric Properties +# check these on https://fabricmc.net/develop +minecraft_version=1.20.1 +yarn_mappings=1.20.1+build.1 +loader_version=0.14.21 +# Mod Properties +mod_version=1.0.0 +maven_group=dev.00a +archives_base_name=valence-extractor +# Dependencies +fabric_version=0.83.0+1.20.1 diff --git a/vendor/valence/extractor/gradle/wrapper/gradle-wrapper.properties b/vendor/valence/extractor/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..59bc51a2 --- /dev/null +++ b/vendor/valence/extractor/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/vendor/valence/extractor/gradlew b/vendor/valence/extractor/gradlew new file mode 100755 index 00000000..a69d9cb6 --- /dev/null +++ b/vendor/valence/extractor/gradlew @@ -0,0 +1,240 @@ +#!/bin/sh + +# +# Copyright Ā© 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions Ā«$varĀ», Ā«${var}Ā», Ā«${var:-default}Ā», Ā«${var+SET}Ā», +# Ā«${var#prefix}Ā», Ā«${var%suffix}Ā», and Ā«$( cmd )Ā»; +# * compound commands having a testable exit status, especially Ā«caseĀ»; +# * various built-in commands including Ā«commandĀ», Ā«setĀ», and Ā«ulimitĀ». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/vendor/valence/extractor/gradlew.bat b/vendor/valence/extractor/gradlew.bat new file mode 100644 index 00000000..53a6b238 --- /dev/null +++ b/vendor/valence/extractor/gradlew.bat @@ -0,0 +1,91 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/vendor/valence/extractor/settings.gradle b/vendor/valence/extractor/settings.gradle new file mode 100644 index 00000000..b02216ba --- /dev/null +++ b/vendor/valence/extractor/settings.gradle @@ -0,0 +1,10 @@ +pluginManagement { + repositories { + maven { + name = 'Fabric' + url = 'https://maven.fabricmc.net/' + } + mavenCentral() + gradlePluginPortal() + } +} diff --git a/vendor/valence/extractor/src/main/java/rs/valence/extractor/ClassComparator.java b/vendor/valence/extractor/src/main/java/rs/valence/extractor/ClassComparator.java new file mode 100644 index 00000000..fed1baf7 --- /dev/null +++ b/vendor/valence/extractor/src/main/java/rs/valence/extractor/ClassComparator.java @@ -0,0 +1,21 @@ +package rs.valence.extractor; + +import java.util.Comparator; + +/** + * Compare Class objects by their simple names lexicographically. + */ +public class ClassComparator implements Comparator> { + public ClassComparator() { + } + + @Override + public int compare(Class c1, Class c2) { + return c1.getSimpleName().compareTo(c2.getSimpleName()); + } + + @Override + public boolean equals(Object comp) { + return comp instanceof ClassComparator; + } +} diff --git a/vendor/valence/extractor/src/main/java/rs/valence/extractor/DummyPlayerEntity.java b/vendor/valence/extractor/src/main/java/rs/valence/extractor/DummyPlayerEntity.java new file mode 100644 index 00000000..9e8a4974 --- /dev/null +++ b/vendor/valence/extractor/src/main/java/rs/valence/extractor/DummyPlayerEntity.java @@ -0,0 +1,42 @@ +package rs.valence.extractor; + +import com.mojang.authlib.GameProfile; +import net.minecraft.entity.Entity; +import net.minecraft.entity.data.DataTracker; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.network.encryption.PlayerPublicKey; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.jetbrains.annotations.Nullable; + +public class DummyPlayerEntity extends PlayerEntity { + public static final DummyPlayerEntity INSTANCE; + + static { + INSTANCE = Main.magicallyInstantiate(DummyPlayerEntity.class); + + try { + var dataTrackerField = Entity.class.getDeclaredField("dataTracker"); + dataTrackerField.setAccessible(true); + dataTrackerField.set(INSTANCE, new DataTracker(INSTANCE)); + + INSTANCE.initDataTracker(); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + private DummyPlayerEntity(World world, BlockPos pos, float yaw, GameProfile gameProfile, @Nullable PlayerPublicKey publicKey) { + super(world, pos, yaw, gameProfile); + } + + @Override + public boolean isSpectator() { + return false; + } + + @Override + public boolean isCreative() { + return false; + } +} diff --git a/vendor/valence/extractor/src/main/java/rs/valence/extractor/DummyWorld.java b/vendor/valence/extractor/src/main/java/rs/valence/extractor/DummyWorld.java new file mode 100644 index 00000000..a33bc35c --- /dev/null +++ b/vendor/valence/extractor/src/main/java/rs/valence/extractor/DummyWorld.java @@ -0,0 +1,266 @@ +package rs.valence.extractor; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.fluid.Fluid; +import net.minecraft.item.map.MapState; +import net.minecraft.recipe.RecipeManager; +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.resource.featuretoggle.FeatureFlags; +import net.minecraft.resource.featuretoggle.FeatureSet; +import net.minecraft.scoreboard.Scoreboard; +import net.minecraft.sound.SoundCategory; +import net.minecraft.sound.SoundEvent; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.random.Random; +import net.minecraft.util.profiler.Profiler; +import net.minecraft.world.Difficulty; +import net.minecraft.world.GameRules; +import net.minecraft.world.MutableWorldProperties; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.chunk.ChunkManager; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.entity.EntityLookup; +import net.minecraft.world.event.GameEvent; +import net.minecraft.world.tick.QueryableTickScheduler; +import org.jetbrains.annotations.Nullable; +import java.util.List; +import java.util.function.Supplier; + +public class DummyWorld extends World { + + public static final DummyWorld INSTANCE; + + static { + INSTANCE = Main.magicallyInstantiate(DummyWorld.class); + + try { + var randomField = World.class.getDeclaredField("random"); + randomField.setAccessible(true); + randomField.set(INSTANCE, Random.create()); + + var propertiesField = World.class.getDeclaredField("properties"); + propertiesField.setAccessible(true); + propertiesField.set(INSTANCE, new DummyMutableWorldProperties()); + + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + private DummyWorld(MutableWorldProperties properties, RegistryKey registryRef, DynamicRegistryManager registryManager, RegistryEntry dimension, Supplier profiler, boolean isClient, boolean debugWorld, long seed, int maxChainedNeighborUpdates) { + super(properties, registryRef, registryManager, dimension, profiler, isClient, debugWorld, seed, maxChainedNeighborUpdates); + } + + @Override + public void updateListeners(BlockPos pos, BlockState oldState, BlockState newState, int flags) { + + } + + @Override + public void playSound(@Nullable PlayerEntity except, double x, double y, double z, RegistryEntry sound, SoundCategory category, float volume, float pitch, long seed) { + + } + + @Override + public void playSound(@Nullable PlayerEntity except, double x, double y, double z, SoundEvent sound, SoundCategory category, float volume, float pitch, long seed) { + + } + + @Override + public void playSoundFromEntity(@Nullable PlayerEntity except, Entity entity, RegistryEntry sound, SoundCategory category, float volume, float pitch, long seed) { + + } + + @Override + public String asString() { + return ""; + } + + @Nullable + @Override + public Entity getEntityById(int id) { + return null; + } + + @Nullable + @Override + public MapState getMapState(String id) { + return null; + } + + @Override + public void putMapState(String id, MapState state) { + + } + + @Override + public int getNextMapId() { + return 0; + } + + @Override + public void setBlockBreakingInfo(int entityId, BlockPos pos, int progress) { + + } + + @Override + public Scoreboard getScoreboard() { + return new Scoreboard(); + } + + @Override + public RecipeManager getRecipeManager() { + return new RecipeManager(); + } + + @Override + protected EntityLookup getEntityLookup() { + return null; + } + + @Override + public QueryableTickScheduler getBlockTickScheduler() { + return null; + } + + @Override + public QueryableTickScheduler getFluidTickScheduler() { + return null; + } + + @Override + public ChunkManager getChunkManager() { + return null; + } + + @Override + public void syncWorldEvent(@Nullable PlayerEntity player, int eventId, BlockPos pos, int data) { + + } + + @Override + public void emitGameEvent(GameEvent event, Vec3d emitterPos, GameEvent.Emitter emitter) { + + } + + @Override + public DynamicRegistryManager getRegistryManager() { + return null; + } + + @Override + public FeatureSet getEnabledFeatures() { + return FeatureSet.of(FeatureFlags.VANILLA, FeatureFlags.BUNDLE); + } + + @Override + public float getBrightness(Direction direction, boolean shaded) { + return 0; + } + + @Override + public List getPlayers() { + return List.of(); + } + + @Override + public RegistryEntry getGeneratorStoredBiome(int biomeX, int biomeY, int biomeZ) { + return null; + } + + private static class DummyMutableWorldProperties implements MutableWorldProperties { + + @Override + public int getSpawnX() { + return 0; + } + + @Override + public void setSpawnX(int spawnX) { + + } + + @Override + public int getSpawnY() { + return 0; + } + + @Override + public void setSpawnY(int spawnY) { + + } + + @Override + public int getSpawnZ() { + return 0; + } + + @Override + public void setSpawnZ(int spawnZ) { + + } + + @Override + public float getSpawnAngle() { + return 0; + } + + @Override + public void setSpawnAngle(float spawnAngle) { + + } + + @Override + public long getTime() { + return 0; + } + + @Override + public long getTimeOfDay() { + return 0; + } + + @Override + public boolean isThundering() { + return false; + } + + @Override + public boolean isRaining() { + return false; + } + + @Override + public void setRaining(boolean raining) { + + } + + @Override + public boolean isHardcore() { + return false; + } + + @Override + public GameRules getGameRules() { + return null; + } + + @Override + public Difficulty getDifficulty() { + return null; + } + + @Override + public boolean isDifficultyLocked() { + return false; + } + } +} diff --git a/vendor/valence/extractor/src/main/java/rs/valence/extractor/Main.java b/vendor/valence/extractor/src/main/java/rs/valence/extractor/Main.java new file mode 100644 index 00000000..ce183b88 --- /dev/null +++ b/vendor/valence/extractor/src/main/java/rs/valence/extractor/Main.java @@ -0,0 +1,126 @@ +package rs.valence.extractor; + +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import io.netty.handler.codec.EncoderException; +import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; +import net.minecraft.nbt.NbtIo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import rs.valence.extractor.extractors.*; +import sun.reflect.ReflectionFactory; + +import java.io.FileWriter; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +public class Main implements ModInitializer { + public static final String MOD_ID = "valence_extractor"; + public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); + + /** + * Magically creates an instance of a concrete class without calling its constructor. + */ + public static T magicallyInstantiate(Class clazz) { + var rf = ReflectionFactory.getReflectionFactory(); + try { + var objCon = Object.class.getDeclaredConstructor(); + var con = rf.newConstructorForSerialization(clazz, objCon); + return clazz.cast(con.newInstance()); + } catch (Throwable e) { + throw new IllegalArgumentException("Failed to magically instantiate " + clazz.getName(), e); + } + } + + @Override + public void onInitialize() { + LOGGER.info("Starting extractors..."); + + var extractors = new Extractor[]{ + new Attributes(), + new Blocks(), + new Effects(), + new Enchants(), + new Entities(), + new Misc(), + new Items(), + new Packets(), + new Sounds(), + new TranslationKeys(), + }; + + Path outputDirectory; + try { + outputDirectory = Files.createDirectories(Paths.get("valence_extractor_output")); + } catch (IOException e) { + LOGGER.info("Failed to create output directory.", e); + return; + } + + var gson = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().serializeNulls().create(); + + for (var ext : extractors) { + try { + var out = outputDirectory.resolve(ext.fileName()); + var fileWriter = new FileWriter(out.toFile(), StandardCharsets.UTF_8); + gson.toJson(ext.extract(), fileWriter); + fileWriter.close(); + LOGGER.info("Wrote " + out.toAbsolutePath()); + } catch (Exception e) { + LOGGER.error("Extractor for \"" + ext.fileName() + "\" failed.", e); + } + } + + ServerLifecycleEvents.SERVER_STARTING.register(server -> { + LOGGER.info("Server starting, Running startup extractors..."); + // TODO: make `Codec` implement `Extractor` + var codecExtractor = new Codec(server); + try { + var out = outputDirectory.resolve(codecExtractor.fileName()); + var compound = codecExtractor.extract(); + // read the compound byte-wise and write it to the file + try { + NbtIo.write(compound, out.toFile()); + } catch (IOException var3) { + throw new EncoderException(var3); + } + + LOGGER.info("Wrote " + out.toAbsolutePath()); + } catch (Exception e) { + LOGGER.error("Extractor for \"" + codecExtractor.fileName() + "\" failed.", e); + } + + var startupExtractors = new Extractor[]{ + new Tags(server), + }; + + for (var ext : startupExtractors) { + try { + var out = outputDirectory.resolve(ext.fileName()); + var fileWriter = new FileWriter(out.toFile(), StandardCharsets.UTF_8); + gson.toJson(ext.extract(), fileWriter); + fileWriter.close(); + LOGGER.info("Wrote " + out.toAbsolutePath()); + } catch (Exception e) { + LOGGER.error("Extractor for \"" + ext.fileName() + "\" failed.", e); + } + } + + LOGGER.info("Done."); + server.shutdown(); + }); + } + + public interface Extractor { + String fileName(); + + JsonElement extract() throws Exception; + } + + public record Pair(T left, U right) { + } +} diff --git a/vendor/valence/extractor/src/main/java/rs/valence/extractor/RegistryKeyComparator.java b/vendor/valence/extractor/src/main/java/rs/valence/extractor/RegistryKeyComparator.java new file mode 100644 index 00000000..a07875d1 --- /dev/null +++ b/vendor/valence/extractor/src/main/java/rs/valence/extractor/RegistryKeyComparator.java @@ -0,0 +1,21 @@ +package rs.valence.extractor; + +import net.minecraft.registry.RegistryKey; + +import java.util.Comparator; + +public class RegistryKeyComparator implements Comparator> { + public RegistryKeyComparator() { + } + + @Override + public int compare(RegistryKey o1, RegistryKey o2) { + var c1 = o1.getRegistry().compareTo(o2.getRegistry()); + + if (c1 != 0) { + return c1; + } + + return o1.getValue().compareTo(o2.getValue()); + } +} diff --git a/vendor/valence/extractor/src/main/java/rs/valence/extractor/ValenceUtils.java b/vendor/valence/extractor/src/main/java/rs/valence/extractor/ValenceUtils.java new file mode 100644 index 00000000..847da11a --- /dev/null +++ b/vendor/valence/extractor/src/main/java/rs/valence/extractor/ValenceUtils.java @@ -0,0 +1,34 @@ +package rs.valence.extractor; + +/** + * Utility class for various methods. + */ +public class ValenceUtils { + private ValenceUtils() { + throw new UnsupportedOperationException("This class cannot be instantiated"); + } + + /** + * Converts a string to PascalCase. + * + * @param str The string to convert. + * @return The converted string. + */ + public static String toPascalCase(String str) { + StringBuilder result = new StringBuilder(); + boolean capitalizeNext = true; + + for (char c : str.toCharArray()) { + if (Character.isWhitespace(c) || c == '_') { + capitalizeNext = true; + } else if (capitalizeNext) { + result.append(Character.toUpperCase(c)); + capitalizeNext = false; + } else { + result.append(Character.toLowerCase(c)); + } + } + + return result.toString(); + } +} diff --git a/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Attributes.java b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Attributes.java new file mode 100644 index 00000000..c22654e9 --- /dev/null +++ b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Attributes.java @@ -0,0 +1,45 @@ +package rs.valence.extractor.extractors; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; + +import net.minecraft.entity.attribute.ClampedEntityAttribute; +import net.minecraft.entity.attribute.EntityAttribute; +import net.minecraft.registry.Registries; +import rs.valence.extractor.Main; +import rs.valence.extractor.ValenceUtils; + +public class Attributes implements Main.Extractor { + public Attributes() { + } + + @Override + public String fileName() { + return "attributes.json"; + } + + @Override + public JsonElement extract() { + var attributesJson = new JsonObject(); + + for (EntityAttribute attribute : Registries.ATTRIBUTE) { + var attributeJson = new JsonObject(); + + attributeJson.addProperty("id", Registries.ATTRIBUTE.getRawId(attribute)); + attributeJson.addProperty("name", Registries.ATTRIBUTE.getId(attribute).getPath()); + attributeJson.addProperty("default_value", attribute.getDefaultValue()); + attributeJson.addProperty("translation_key", attribute.getTranslationKey()); + attributeJson.addProperty("tracked", attribute.isTracked()); + + if (attribute instanceof ClampedEntityAttribute a) { + attributeJson.addProperty("min_value", a.getMinValue()); + attributeJson.addProperty("max_value", a.getMaxValue()); + } + + attributesJson.add(Registries.ATTRIBUTE.getId(attribute).getPath(), attributeJson); + } + + return attributesJson; + } +} \ No newline at end of file diff --git a/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Biomes.java b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Biomes.java new file mode 100644 index 00000000..c93aa6aa --- /dev/null +++ b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Biomes.java @@ -0,0 +1,129 @@ +package rs.valence.extractor.extractors; + +// TODO: where is the biome registry in 1.19.3+? + +/* +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.minecraft.entity.SpawnGroup; +import net.minecraft.util.Identifier; +import net.minecraft.util.collection.Weighted; +import net.minecraft.registry.Registries; +import net.minecraft.world.biome.BiomeParticleConfig; +import rs.valence.extractor.Main; + +import java.lang.reflect.Field; + +public class Biomes implements Main.Extractor { + public Biomes() { + } + + @Override + public String fileName() { + return "biomes.json"; + } + + @Override + public JsonElement extract() { + // The biome particle probability field is private. + // We have to resort to reflection, unfortunately. + Field particleConfigProbabilityField; + try { + particleConfigProbabilityField = BiomeParticleConfig.class.getDeclaredField("probability"); + particleConfigProbabilityField.setAccessible(true); + } catch (Exception e) { + throw new RuntimeException(e); + } + + for (var biome : BuiltinRegistries.BIOME) { + var biomeIdent = BuiltinRegistries.BIOME.getId(biome); + assert biomeIdent != null; + + var biomeJson = new JsonObject(); + biomeJson.addProperty("precipitation", biome.getPrecipitation().getName()); + biomeJson.addProperty("temperature", biome.getTemperature()); + biomeJson.addProperty("downfall", biome.getDownfall()); + + var effectJson = new JsonObject(); + var biomeEffects = biome.getEffects(); + + effectJson.addProperty("sky_color", biomeEffects.getSkyColor()); + effectJson.addProperty("water_fog_color", biomeEffects.getWaterFogColor()); + effectJson.addProperty("fog_color", biomeEffects.getFogColor()); + effectJson.addProperty("water_color", biomeEffects.getWaterColor()); + biomeEffects.getFoliageColor().ifPresent(color -> effectJson.addProperty("foliage_color", color)); + biomeEffects.getGrassColor().ifPresent(color -> effectJson.addProperty("grass_color", color)); + effectJson.addProperty("grass_color_modifier", biomeEffects.getGrassColorModifier().getName()); + biomeEffects.getMusic().ifPresent(biome_music -> { + var music = new JsonObject(); + music.addProperty("replace_current_music", biome_music.shouldReplaceCurrentMusic()); + music.addProperty("sound", biome_music.getSound().getId().getPath()); + music.addProperty("max_delay", biome_music.getMaxDelay()); + music.addProperty("min_delay", biome_music.getMinDelay()); + effectJson.add("music", music); + }); + + biomeEffects.getLoopSound().ifPresent(soundEvent -> effectJson.addProperty("ambient_sound", soundEvent.getId().getPath())); + biomeEffects.getAdditionsSound().ifPresent(soundEvent -> { + var sound = new JsonObject(); + sound.addProperty("sound", soundEvent.getSound().getId().getPath()); + sound.addProperty("tick_chance", soundEvent.getChance()); + effectJson.add("additions_sound", sound); + }); + biomeEffects.getMoodSound().ifPresent(soundEvent -> { + var sound = new JsonObject(); + sound.addProperty("sound", soundEvent.getSound().getId().getPath()); + sound.addProperty("tick_delay", soundEvent.getCultivationTicks()); + sound.addProperty("offset", soundEvent.getExtraDistance()); + sound.addProperty("block_search_extent", soundEvent.getSpawnRange()); + + effectJson.add("mood_sound", sound); + }); + + biome.getParticleConfig().ifPresent(biomeParticleConfig -> { + try { + var particleConfig = new JsonObject(); + // We must first convert it into an identifier, because asString() returns a resource identifier as string. + Identifier id = new Identifier(biomeParticleConfig.getParticle().asString()); + particleConfig.addProperty("kind", id.getPath()); + particleConfig.addProperty("probability" ,particleConfigProbabilityField.getFloat(biomeParticleConfig)); + biomeJson.add("particle", particleConfig); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + }); + + var spawnSettingsJson = new JsonObject(); + var spawnSettings = biome.getSpawnSettings(); + spawnSettingsJson.addProperty("probability", spawnSettings.getCreatureSpawnProbability()); + + var spawnGroupsJson = new JsonObject(); + for (var spawnGroup : SpawnGroup.values()) { + var spawnGroupJson = new JsonArray(); + for (var entry : spawnSettings.getSpawnEntries(spawnGroup).getEntries()) { + var groupEntryJson = new JsonObject(); + groupEntryJson.addProperty("name", Registry.ENTITY_TYPE.getId(entry.type).getPath()); + groupEntryJson.addProperty("min_group_size", entry.minGroupSize); + groupEntryJson.addProperty("max_group_size", entry.maxGroupSize); + groupEntryJson.addProperty("weight", ((Weighted) entry).getWeight().getValue()); + spawnGroupJson.add(groupEntryJson); + } + spawnGroupsJson.add(spawnGroup.getName(), spawnGroupJson); + } + spawnSettingsJson.add("groups", spawnGroupsJson); + + biomeJson.add("effects", effectJson); + biomeJson.add("spawn_settings", spawnSettingsJson); + + var entryJson = new JsonObject(); + entryJson.addProperty("name", biomeIdent.getPath()); + entryJson.addProperty("id", BuiltinRegistries.BIOME.getRawId(biome)); + entryJson.add("element", biomeJson); + biomesJson.add(entryJson); + } + + return biomesJson; + } +} + */ diff --git a/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Blocks.java b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Blocks.java new file mode 100644 index 00000000..6106d3ed --- /dev/null +++ b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Blocks.java @@ -0,0 +1,140 @@ +package rs.valence.extractor.extractors; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.minecraft.registry.Registries; +import net.minecraft.item.VerticallyAttachableBlockItem; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.EmptyBlockView; + +import rs.valence.extractor.Main; +import rs.valence.extractor.mixin.ExposeWallBlock; + +import java.util.LinkedHashMap; +import java.util.Locale; +import java.util.Objects; + +public class Blocks implements Main.Extractor { + public Blocks() { + } + + @Override + public String fileName() { + return "blocks.json"; + } + + @Override + public JsonElement extract() { + var topLevelJson = new JsonObject(); + + var blocksJson = new JsonArray(); + var stateIdCounter = 0; + + var shapes = new LinkedHashMap(); + + for (var block : Registries.BLOCK) { + var blockJson = new JsonObject(); + blockJson.addProperty("id", Registries.BLOCK.getRawId(block)); + blockJson.addProperty("name", Registries.BLOCK.getId(block).getPath()); + blockJson.addProperty("translation_key", block.getTranslationKey()); + blockJson.addProperty("item_id", Registries.ITEM.getRawId(block.asItem())); + blockJson.addProperty("hardness", block.getHardness()); + blockJson.addProperty("blast_resistance", block.getBlastResistance()); + blockJson.addProperty("slipperiness", block.getSlipperiness()); + blockJson.addProperty("speed_factor", block.getVelocityMultiplier()); + blockJson.addProperty("jump_factor", block.getJumpVelocityMultiplier()); + + if (block.asItem() instanceof VerticallyAttachableBlockItem wsbItem) { + if (wsbItem.getBlock() == block) { + var wallBlock = ((ExposeWallBlock) wsbItem).getWallBlock(); + blockJson.addProperty("wall_variant_id", Registries.BLOCK.getRawId(wallBlock)); + } + } + + var propsJson = new JsonArray(); + for (var prop : block.getStateManager().getProperties()) { + var propJson = new JsonObject(); + + propJson.addProperty("name", prop.getName()); + + var valuesJson = new JsonArray(); + for (var value : prop.getValues()) { + valuesJson.add(value.toString().toLowerCase(Locale.ROOT)); + } + propJson.add("values", valuesJson); + + propsJson.add(propJson); + } + blockJson.add("properties", propsJson); + + var statesJson = new JsonArray(); + for (var state : block.getStateManager().getStates()) { + var stateJson = new JsonObject(); + var id = stateIdCounter++; + stateJson.addProperty("id", id); + stateJson.addProperty("luminance", state.getLuminance()); + stateJson.addProperty("opaque", state.isOpaque()); + stateJson.addProperty("replaceable", state.isReplaceable()); + // TODO `blocksMovement` seems to be deprecated. How else can one get this property? + stateJson.addProperty("blocks_motion", state.blocksMovement()); + + if (block.getDefaultState().equals(state)) { + blockJson.addProperty("default_state_id", id); + } + + var collisionShapeIdxsJson = new JsonArray(); + for (var box : state.getCollisionShape(EmptyBlockView.INSTANCE, BlockPos.ORIGIN).getBoundingBoxes()) { + var collisionShape = new Shape(box.minX, box.minY, box.minZ, box.maxX, box.maxY, box.maxZ); + + var idx = shapes.putIfAbsent(collisionShape, shapes.size()); + collisionShapeIdxsJson.add(Objects.requireNonNullElseGet(idx, () -> shapes.size() - 1)); + } + + stateJson.add("collision_shapes", collisionShapeIdxsJson); + + for (var blockEntity : Registries.BLOCK_ENTITY_TYPE) { + if (blockEntity.supports(state)) { + stateJson.addProperty("block_entity_type", Registries.BLOCK_ENTITY_TYPE.getRawId(blockEntity)); + } + } + + statesJson.add(stateJson); + } + blockJson.add("states", statesJson); + + blocksJson.add(blockJson); + } + + var blockEntitiesJson = new JsonArray(); + for (var blockEntity : Registries.BLOCK_ENTITY_TYPE) { + var blockEntityJson = new JsonObject(); + blockEntityJson.addProperty("id", Registries.BLOCK_ENTITY_TYPE.getRawId(blockEntity)); + blockEntityJson.addProperty("ident", Registries.BLOCK_ENTITY_TYPE.getId(blockEntity).toString()); + blockEntityJson.addProperty("name", Registries.BLOCK_ENTITY_TYPE.getId(blockEntity).getPath()); + + blockEntitiesJson.add(blockEntityJson); + } + + var shapesJson = new JsonArray(); + for (var shape : shapes.keySet()) { + var shapeJson = new JsonObject(); + shapeJson.addProperty("min_x", shape.minX); + shapeJson.addProperty("min_y", shape.minY); + shapeJson.addProperty("min_z", shape.minZ); + shapeJson.addProperty("max_x", shape.maxX); + shapeJson.addProperty("max_y", shape.maxY); + shapeJson.addProperty("max_z", shape.maxZ); + shapesJson.add(shapeJson); + } + + topLevelJson.add("block_entity_types", blockEntitiesJson); + topLevelJson.add("shapes", shapesJson); + topLevelJson.add("blocks", blocksJson); + + return topLevelJson; + } + + private record Shape(double minX, double minY, double minZ, double maxX, double maxY, double maxZ) { + } +} diff --git a/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Codec.java b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Codec.java new file mode 100644 index 00000000..521e2c21 --- /dev/null +++ b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Codec.java @@ -0,0 +1,34 @@ +package rs.valence.extractor.extractors; + +import io.netty.handler.codec.EncoderException; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtElement; +import net.minecraft.nbt.NbtOps; +import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.Registries; +import net.minecraft.registry.RegistryOps; +import net.minecraft.registry.SerializableRegistries; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Util; + +public class Codec { + + private static final RegistryOps REGISTRY_OPS= RegistryOps.of(NbtOps.INSTANCE, DynamicRegistryManager.of(Registries.REGISTRIES)); + private final DynamicRegistryManager.Immutable registryManager; + + public Codec(MinecraftServer server) { + this.registryManager = server.getRegistryManager(); + } + + public String fileName() { + return "registry_codec.dat"; + } + + public NbtCompound extract() { + com.mojang.serialization.Codec codec = SerializableRegistries.CODEC; + //DynamicRegistryManager.get(net.minecraft.registry.RegistryKey>) method. + + NbtElement nbtElement = Util.getResult(codec.encodeStart(REGISTRY_OPS, registryManager), (error) -> new EncoderException("Failed to encode: " + error + " " + registryManager)); + return (NbtCompound) nbtElement; + } +} diff --git a/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Effects.java b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Effects.java new file mode 100644 index 00000000..c89de424 --- /dev/null +++ b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Effects.java @@ -0,0 +1,55 @@ +package rs.valence.extractor.extractors; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.minecraft.registry.Registries; +import rs.valence.extractor.Main; +import rs.valence.extractor.ValenceUtils; + +public class Effects implements Main.Extractor { + public Effects() { + } + + @Override + public String fileName() { + return "effects.json"; + } + + @Override + public JsonElement extract() { + var effectsJson = new JsonArray(); + + for (var effect : Registries.STATUS_EFFECT) { + var effectJson = new JsonObject(); + + effectJson.addProperty("id", Registries.STATUS_EFFECT.getRawId(effect)); + effectJson.addProperty("name", Registries.STATUS_EFFECT.getId(effect).getPath()); + effectJson.addProperty("translation_key", effect.getTranslationKey()); + effectJson.addProperty("color", effect.getColor()); + effectJson.addProperty("instant", effect.isInstant()); + effectJson.addProperty("category", ValenceUtils.toPascalCase(effect.getCategory().name())); + + var attributeModifiersJson = new JsonArray(); + + for (var entry : effect.getAttributeModifiers().entrySet()) { + var attributeModifierJson = new JsonObject(); + + attributeModifierJson.addProperty("attribute", Registries.ATTRIBUTE.getRawId(entry.getKey())); + attributeModifierJson.addProperty("operation", entry.getValue().getOperation().getId()); + attributeModifierJson.addProperty("value", entry.getValue().getValue()); + attributeModifierJson.addProperty("uuid", entry.getValue().getId().toString()); + + attributeModifiersJson.add(attributeModifierJson); + } + + if (attributeModifiersJson.size() > 0) { + effectJson.add("attribute_modifiers", attributeModifiersJson); + } + + effectsJson.add(effectJson); + } + + return effectsJson; + } +} diff --git a/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Enchants.java b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Enchants.java new file mode 100644 index 00000000..8bf9bdb6 --- /dev/null +++ b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Enchants.java @@ -0,0 +1,47 @@ +package rs.valence.extractor.extractors; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.minecraft.registry.Registries; +import rs.valence.extractor.Main; + +public class Enchants implements Main.Extractor { + public Enchants() { + } + + @Override + public String fileName() { + return "enchants.json"; + } + + @Override + public JsonElement extract() { + var enchantsJson = new JsonArray(); + + for (var enchant : Registries.ENCHANTMENT) { + var enchantJson = new JsonObject(); + + enchantJson.addProperty("id", Registries.ENCHANTMENT.getRawId(enchant)); + enchantJson.addProperty("name", Registries.ENCHANTMENT.getId(enchant).getPath()); + enchantJson.addProperty("translation_key", enchant.getTranslationKey()); + + enchantJson.addProperty("min_level", enchant.getMinLevel()); + enchantJson.addProperty("max_level", enchant.getMaxLevel()); + enchantJson.addProperty("rarity_weight", enchant.getRarity().getWeight()); + enchantJson.addProperty("cursed", enchant.isCursed()); + + var enchantmentSources = new JsonObject(); + enchantmentSources.addProperty("treasure", enchant.isTreasure()); + enchantmentSources.addProperty("enchantment_table", enchant.isAvailableForEnchantedBookOffer()); + // All enchants except for 'Soul speed' and 'Swift sneak' are available for random selection and are only obtainable from loot chests. + enchantmentSources.addProperty("random_selection", enchant.isAvailableForRandomSelection()); + + enchantJson.add("sources", enchantmentSources); + + enchantsJson.add(enchantJson); + } + + return enchantsJson; + } +} diff --git a/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Entities.java b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Entities.java new file mode 100644 index 00000000..172d01f2 --- /dev/null +++ b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Entities.java @@ -0,0 +1,309 @@ +package rs.valence.extractor.extractors; + +import com.google.gson.*; + +import net.minecraft.block.BlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityPose; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.attribute.DefaultAttributeRegistry; +import net.minecraft.entity.attribute.EntityAttribute; +import net.minecraft.entity.attribute.EntityAttributeInstance; +import net.minecraft.entity.data.DataTracker; +import net.minecraft.entity.data.TrackedData; +import net.minecraft.entity.data.TrackedDataHandlerRegistry; +import net.minecraft.entity.passive.CatVariant; +import net.minecraft.entity.passive.FrogVariant; +import net.minecraft.entity.passive.SnifferEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.particle.ParticleEffect; +import net.minecraft.registry.Registries; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.text.Text; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.EulerAngle; +import net.minecraft.util.math.GlobalPos; +import net.minecraft.village.VillagerData; +import org.jetbrains.annotations.Nullable; +import org.joml.Quaternionf; +import org.joml.Vector3f; + +import rs.valence.extractor.ClassComparator; +import rs.valence.extractor.DummyPlayerEntity; +import rs.valence.extractor.DummyWorld; +import rs.valence.extractor.Main; +import rs.valence.extractor.Main.Pair; +import java.lang.reflect.ParameterizedType; +import java.util.*; + +public class Entities implements Main.Extractor { + public Entities() { + } + + private static Pair trackedDataToJson(TrackedData data, DataTracker tracker) { + final var handler = data.getType(); + final var val = tracker.get(data); + + if (handler == TrackedDataHandlerRegistry.BYTE) { + return new Pair<>("byte", new JsonPrimitive((Byte) val)); + } else if (handler == TrackedDataHandlerRegistry.INTEGER) { + return new Pair<>("integer", new JsonPrimitive((Integer) val)); + } else if (handler == TrackedDataHandlerRegistry.LONG) { + return new Pair<>("long", new JsonPrimitive((Long) val)); + } else if (handler == TrackedDataHandlerRegistry.FLOAT) { + return new Pair<>("float", new JsonPrimitive((Float) val)); + } else if (handler == TrackedDataHandlerRegistry.STRING) { + return new Pair<>("string", new JsonPrimitive((String) val)); + } else if (handler == TrackedDataHandlerRegistry.TEXT_COMPONENT) { + // TODO: return text as json element. + return new Pair<>("text_component", new JsonPrimitive(((Text) val).getString())); + } else if (handler == TrackedDataHandlerRegistry.OPTIONAL_TEXT_COMPONENT) { + var res = ((Optional) val).map(o -> (JsonElement) new JsonPrimitive(((Text) o).getString())) + .orElse(JsonNull.INSTANCE); + return new Pair<>("optional_text_component", res); + } else if (handler == TrackedDataHandlerRegistry.ITEM_STACK) { + // TODO + return new Pair<>("item_stack", new JsonPrimitive(((ItemStack) val).toString())); + } else if (handler == TrackedDataHandlerRegistry.BOOLEAN) { + return new Pair<>("boolean", new JsonPrimitive((Boolean) val)); + } else if (handler == TrackedDataHandlerRegistry.ROTATION) { + var json = new JsonObject(); + var ea = (EulerAngle) val; + json.addProperty("pitch", ea.getPitch()); + json.addProperty("yaw", ea.getYaw()); + json.addProperty("roll", ea.getRoll()); + return new Pair<>("rotation", json); + } else if (handler == TrackedDataHandlerRegistry.BLOCK_POS) { + var bp = (BlockPos) val; + var json = new JsonObject(); + json.addProperty("x", bp.getX()); + json.addProperty("y", bp.getY()); + json.addProperty("z", bp.getZ()); + return new Pair<>("block_pos", json); + } else if (handler == TrackedDataHandlerRegistry.OPTIONAL_BLOCK_POS) { + return new Pair<>("optional_block_pos", ((Optional) val).map(o -> { + var bp = (BlockPos) o; + var json = new JsonObject(); + json.addProperty("x", bp.getX()); + json.addProperty("y", bp.getY()); + json.addProperty("z", bp.getZ()); + return (JsonElement) json; + }).orElse(JsonNull.INSTANCE)); + } else if (handler == TrackedDataHandlerRegistry.FACING) { + return new Pair<>("facing", new JsonPrimitive(val.toString())); + } else if (handler == TrackedDataHandlerRegistry.OPTIONAL_UUID) { + var res = ((Optional) val).map(o -> (JsonElement) new JsonPrimitive(o.toString())) + .orElse(JsonNull.INSTANCE); + return new Pair<>("optional_uuid", res); + } else if (handler == TrackedDataHandlerRegistry.BLOCK_STATE) { + // TODO: get raw block state ID. + var state = (BlockState) val; + return new Pair<>("block_state", new JsonPrimitive(state.toString())); + } else if (handler == TrackedDataHandlerRegistry.OPTIONAL_BLOCK_STATE) { + // TODO: get raw block state ID. + var res = ((Optional) val).map(o -> (JsonElement) new JsonPrimitive(o.toString())) + .orElse(JsonNull.INSTANCE); + return new Pair<>("optional_block_state", res); + } else if (handler == TrackedDataHandlerRegistry.NBT_COMPOUND) { + // TODO: base64 binary representation or SNBT? + return new Pair<>("nbt_compound", new JsonPrimitive(val.toString())); + } else if (handler == TrackedDataHandlerRegistry.PARTICLE) { + var id = Registries.PARTICLE_TYPE.getId(((ParticleEffect) val).getType()); + return new Pair<>("particle", new JsonPrimitive(id.getPath())); + } else if (handler == TrackedDataHandlerRegistry.VILLAGER_DATA) { + var vd = (VillagerData) val; + var json = new JsonObject(); + var type = Registries.VILLAGER_TYPE.getId(vd.getType()).getPath(); + var profession = Registries.VILLAGER_PROFESSION.getId(vd.getProfession()).getPath(); + json.addProperty("type", type); + json.addProperty("profession", profession); + json.addProperty("level", vd.getLevel()); + return new Pair<>("villager_data", json); + } else if (handler == TrackedDataHandlerRegistry.OPTIONAL_INT) { + var opt = (OptionalInt) val; + return new Pair<>("optional_int", opt.isPresent() ? new JsonPrimitive(opt.getAsInt()) : JsonNull.INSTANCE); + } else if (handler == TrackedDataHandlerRegistry.ENTITY_POSE) { + return new Pair<>("entity_pose", new JsonPrimitive(((EntityPose) val).name().toLowerCase(Locale.ROOT))); + } else if (handler == TrackedDataHandlerRegistry.CAT_VARIANT) { + return new Pair<>("cat_variant", + new JsonPrimitive(Registries.CAT_VARIANT.getId((CatVariant) val).getPath())); + } else if (handler == TrackedDataHandlerRegistry.FROG_VARIANT) { + return new Pair<>("frog_variant", + new JsonPrimitive(Registries.FROG_VARIANT.getId((FrogVariant) val).getPath())); + } else if (handler == TrackedDataHandlerRegistry.OPTIONAL_GLOBAL_POS) { + return new Pair<>("optional_global_pos", ((Optional) val).map(o -> { + var gp = (GlobalPos) o; + var json = new JsonObject(); + json.addProperty("dimension", gp.getDimension().getValue().toString()); + + var posJson = new JsonObject(); + posJson.addProperty("x", gp.getPos().getX()); + posJson.addProperty("y", gp.getPos().getY()); + posJson.addProperty("z", gp.getPos().getZ()); + + json.add("position", posJson); + return (JsonElement) json; + }).orElse(JsonNull.INSTANCE)); + } else if (handler == TrackedDataHandlerRegistry.PAINTING_VARIANT) { + var variant = ((RegistryEntry) val).getKey().map(k -> k.getValue().getPath()).orElse(""); + return new Pair<>("painting_variant", new JsonPrimitive(variant)); + } else if (handler == TrackedDataHandlerRegistry.SNIFFER_STATE) { + return new Pair<>("sniffer_state", + new JsonPrimitive(((SnifferEntity.State) val).name().toLowerCase(Locale.ROOT))); + } else if (handler == TrackedDataHandlerRegistry.VECTOR3F) { + var vec = (Vector3f) val; + var json = new JsonObject(); + json.addProperty("x", vec.x); + json.addProperty("y", vec.y); + json.addProperty("z", vec.z); + return new Pair<>("vector3f", json); + } else if (handler == TrackedDataHandlerRegistry.QUATERNIONF) { + var quat = (Quaternionf) val; + var json = new JsonObject(); + json.addProperty("x", quat.x); + json.addProperty("y", quat.y); + json.addProperty("z", quat.z); + json.addProperty("w", quat.w); + return new Pair<>("quaternionf", json); + } else { + throw new IllegalArgumentException( + "Unexpected tracked handler of ID " + TrackedDataHandlerRegistry.getId(handler)); + } + } + + @Override + public String fileName() { + return "entities.json"; + } + + @Override + @SuppressWarnings("unchecked") + public JsonElement extract() throws IllegalAccessException, NoSuchFieldException { + + final var entityClassToType = new HashMap, EntityType>(); + for (var f : EntityType.class.getFields()) { + if (f.getType().equals(EntityType.class)) { + var entityClass = (Class) ((ParameterizedType) f.getGenericType()) + .getActualTypeArguments()[0]; + var entityType = (EntityType) f.get(null); + + entityClassToType.put(entityClass, entityType); + } + } + + final var dataTrackerField = Entity.class.getDeclaredField("dataTracker"); + dataTrackerField.setAccessible(true); + + var entitiesMap = new TreeMap, JsonElement>(new ClassComparator()); + + for (var entry : entityClassToType.entrySet()) { + var entityClass = entry.getKey(); + @Nullable + var entityType = entry.getValue(); + assert entityType != null; + + // While we can use the tracked data registry and reflection to get the tracked + // fields on entities, we won't know what their default values are because they + // are assigned in the entity's constructor. + // To obtain this, we create a dummy world to spawn the entities into and read + // the data tracker field from the base entity class. + // We also handle player entities specially since they cannot be spawned with + // EntityType#create. + final var entityInstance = entityType.equals(EntityType.PLAYER) ? DummyPlayerEntity.INSTANCE + : entityType.create(DummyWorld.INSTANCE); + + final var dataTracker = (DataTracker) dataTrackerField.get(entityInstance); + + while (entitiesMap.get(entityClass) == null) { + var entityJson = new JsonObject(); + + var parent = entityClass.getSuperclass(); + var hasParent = parent != null && Entity.class.isAssignableFrom(parent); + + if (hasParent) { + entityJson.addProperty("parent", parent.getSimpleName()); + } + + if (entityType != null) { + entityJson.addProperty("type", Registries.ENTITY_TYPE.getId(entityType).getPath()); + + entityJson.add("translation_key", new JsonPrimitive(entityType.getTranslationKey())); + } + + var fieldsJson = new JsonArray(); + for (var entityField : entityClass.getDeclaredFields()) { + if (entityField.getType().equals(TrackedData.class)) { + entityField.setAccessible(true); + + var trackedData = (TrackedData) entityField.get(null); + + var fieldJson = new JsonObject(); + var fieldName = entityField.getName().toLowerCase(Locale.ROOT); + fieldJson.addProperty("name", fieldName); + fieldJson.addProperty("index", trackedData.getId()); + + var data = Entities.trackedDataToJson(trackedData, dataTracker); + fieldJson.addProperty("type", data.left()); + fieldJson.add("default_value", data.right()); + + fieldsJson.add(fieldJson); + } + } + entityJson.add("fields", fieldsJson); + + if (entityInstance instanceof LivingEntity livingEntity) { + var type = (EntityType) entityType; + var defaultAttributes = DefaultAttributeRegistry.get(type); + var attributesJson = new JsonArray(); + if (defaultAttributes != null) { + var instancesField = defaultAttributes.getClass().getDeclaredField("instances"); + instancesField.setAccessible(true); + var instances = (Map) instancesField + .get(defaultAttributes); + + for (var instance : instances.values()) { + var attribute = instance.getAttribute(); + + var attributeJson = new JsonObject(); + + attributeJson.addProperty("id", Registries.ATTRIBUTE.getRawId(attribute)); + attributeJson.addProperty("name", Registries.ATTRIBUTE.getId(attribute).getPath()); + attributeJson.addProperty("base_value", instance.getBaseValue()); + + attributesJson.add(attributeJson); + } + } + entityJson.add("attributes", attributesJson); + } + + var bb = entityInstance.getBoundingBox(); + if (bb != null && entityType != null) { + var boundingBoxJson = new JsonObject(); + + boundingBoxJson.addProperty("size_x", bb.getXLength()); + boundingBoxJson.addProperty("size_y", bb.getYLength()); + boundingBoxJson.addProperty("size_z", bb.getZLength()); + + entityJson.add("default_bounding_box", boundingBoxJson); + } + + entitiesMap.put(entityClass, entityJson); + + if (!hasParent) { + break; + } + + entityClass = (Class) parent; + entityType = entityClassToType.get(entityClass); + } + } + + var entitiesJson = new JsonObject(); + for (var entry : entitiesMap.entrySet()) { + entitiesJson.add(entry.getKey().getSimpleName(), entry.getValue()); + } + + return entitiesJson; + } +} diff --git a/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Items.java b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Items.java new file mode 100644 index 00000000..e744c768 --- /dev/null +++ b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Items.java @@ -0,0 +1,73 @@ +package rs.valence.extractor.extractors; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; + +import net.minecraft.item.ArmorItem; +import net.minecraft.registry.Registries; +import rs.valence.extractor.Main; + +public class Items implements Main.Extractor { + public Items() { + } + + @Override + public String fileName() { + return "items.json"; + } + + @Override + public JsonElement extract() throws Exception { + var itemsJson = new JsonArray(); + + for (var item : Registries.ITEM) { + var itemJson = new JsonObject(); + itemJson.addProperty("id", Registries.ITEM.getRawId(item)); + itemJson.addProperty("name", Registries.ITEM.getId(item).getPath()); + itemJson.addProperty("translation_key", item.getTranslationKey()); + itemJson.addProperty("max_stack", item.getMaxCount()); + itemJson.addProperty("max_durability", item.getMaxDamage()); + itemJson.addProperty("enchantability", item.getEnchantability()); + itemJson.addProperty("fireproof", item.isFireproof()); + + if (item.getFoodComponent() != null) { + var foodJson = new JsonObject(); + var foodComp = item.getFoodComponent(); + + foodJson.addProperty("hunger", foodComp.getHunger()); + foodJson.addProperty("saturation", foodComp.getSaturationModifier()); + foodJson.addProperty("always_edible", foodComp.isAlwaysEdible()); + foodJson.addProperty("meat", foodComp.isMeat()); + foodJson.addProperty("snack", foodComp.isSnack()); + + itemJson.add("food", foodJson); + + var effectsJson = new JsonArray(); + for (var pair : foodComp.getStatusEffects()) { + var effectJson = new JsonObject(); + + var effect = pair.getFirst(); + var chance = pair.getSecond(); + + effectJson.addProperty("chance", chance); + effectJson.addProperty("translation_key", effect.getEffectType().getTranslationKey()); + // TODO: more effect information. + + effectsJson.add(effectJson); + } + + foodJson.add("effects", effectsJson); + } + + if (item instanceof ArmorItem) { + ArmorItem armor = (ArmorItem) item; + itemJson.addProperty("equippable", armor.getType().getName()); + } + + itemsJson.add(itemJson); + } + + return itemsJson; + } +} diff --git a/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Misc.java b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Misc.java new file mode 100644 index 00000000..f0dc3422 --- /dev/null +++ b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Misc.java @@ -0,0 +1,135 @@ +package rs.valence.extractor.extractors; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.minecraft.entity.EntityPose; +import net.minecraft.entity.EntityStatuses; +import net.minecraft.entity.attribute.ClampedEntityAttribute; +import net.minecraft.entity.attribute.EntityAttribute; +import net.minecraft.entity.data.TrackedDataHandler; +import net.minecraft.entity.data.TrackedDataHandlerRegistry; +import net.minecraft.entity.passive.SnifferEntity; +import net.minecraft.network.packet.s2c.play.EntityAnimationS2CPacket; +import net.minecraft.registry.Registries; +import net.minecraft.util.math.Direction; +import rs.valence.extractor.Main; +import java.lang.reflect.Modifier; +import java.util.Locale; + +public class Misc implements Main.Extractor { + @Override + public String fileName() { + return "misc.json"; + } + + @Override + public JsonElement extract() throws Exception { + var miscJson = new JsonObject(); + + var entityTypeJson = new JsonObject(); + for (var type : Registries.ENTITY_TYPE) { + entityTypeJson.addProperty(Registries.ENTITY_TYPE.getId(type).getPath(), + Registries.ENTITY_TYPE.getRawId(type)); + } + miscJson.add("entity_type", entityTypeJson); + + var entityStatusJson = new JsonObject(); + for (var field : EntityStatuses.class.getDeclaredFields()) { + if (field.canAccess(null) && field.get(null) instanceof Byte code) { + if (field.getName().equals("field_30030")) { + entityStatusJson.addProperty("stop_attack", code); + } else { + entityStatusJson.addProperty(field.getName().toLowerCase(Locale.ROOT), code); + } + } + } + miscJson.add("entity_status", entityStatusJson); + + var entityAnimationJson = new JsonObject(); + for (var field : EntityAnimationS2CPacket.class.getDeclaredFields()) { + field.setAccessible(true); + if (Modifier.isStatic(field.getModifiers()) && field.canAccess(null) + && field.get(null) instanceof Integer i) { + entityAnimationJson.addProperty(field.getName().toLowerCase(Locale.ROOT), i); + } + } + miscJson.add("entity_animation", entityAnimationJson); + + var villagerTypeJson = new JsonObject(); + for (var type : Registries.VILLAGER_TYPE) { + villagerTypeJson.addProperty(Registries.VILLAGER_TYPE.getId(type).getPath(), + Registries.VILLAGER_TYPE.getRawId(type)); + } + miscJson.add("villager_type", villagerTypeJson); + + var villagerProfessionJson = new JsonObject(); + for (var profession : Registries.VILLAGER_PROFESSION) { + villagerProfessionJson.addProperty(profession.id(), Registries.VILLAGER_PROFESSION.getRawId(profession)); + } + miscJson.add("villager_profession", villagerProfessionJson); + + var catVariantJson = new JsonObject(); + for (var variant : Registries.CAT_VARIANT) { + catVariantJson.addProperty(Registries.CAT_VARIANT.getId(variant).getPath(), + Registries.CAT_VARIANT.getRawId(variant)); + } + miscJson.add("cat_variant", catVariantJson); + + var frogVariantJson = new JsonObject(); + for (var variant : Registries.FROG_VARIANT) { + frogVariantJson.addProperty(Registries.FROG_VARIANT.getId(variant).getPath(), + Registries.FROG_VARIANT.getRawId(variant)); + } + miscJson.add("frog_variant", frogVariantJson); + + var paintingVariantJson = new JsonObject(); + for (var variant : Registries.PAINTING_VARIANT) { + var variantJson = new JsonObject(); + variantJson.addProperty("id", Registries.PAINTING_VARIANT.getRawId(variant)); + variantJson.addProperty("width", variant.getWidth()); + variantJson.addProperty("height", variant.getHeight()); + paintingVariantJson.add(Registries.PAINTING_VARIANT.getId(variant).getPath(), variantJson); + } + miscJson.add("painting_variant", paintingVariantJson); + + var directionJson = new JsonObject(); + for (var dir : Direction.values()) { + directionJson.addProperty(dir.getName(), dir.getId()); + } + miscJson.add("direction", directionJson); + + var entityPoseJson = new JsonObject(); + var poses = EntityPose.values(); + for (int i = 0; i < poses.length; i++) { + entityPoseJson.addProperty(poses[i].name().toLowerCase(Locale.ROOT), i); + } + miscJson.add("entity_pose", entityPoseJson); + + var particleTypesJson = new JsonObject(); + for (var type : Registries.PARTICLE_TYPE) { + particleTypesJson.addProperty(Registries.PARTICLE_TYPE.getId(type).getPath(), + Registries.PARTICLE_TYPE.getRawId(type)); + } + miscJson.add("particle_type", particleTypesJson); + + var snifferStateJson = new JsonObject(); + for (var state : SnifferEntity.State.values()) { + snifferStateJson.addProperty(state.name().toLowerCase(Locale.ROOT), state.ordinal()); + } + miscJson.add("sniffer_state", snifferStateJson); + + var trackedDataHandlerJson = new JsonObject(); + for (var field : TrackedDataHandlerRegistry.class.getDeclaredFields()) { + field.setAccessible(true); + if (Modifier.isStatic(field.getModifiers()) && field.get(null) instanceof TrackedDataHandler handler) { + var name = field.getName().toLowerCase(Locale.ROOT); + var id = TrackedDataHandlerRegistry.getId(handler); + + trackedDataHandlerJson.addProperty(name, id); + } + } + miscJson.add("tracked_data_handler", trackedDataHandlerJson); + + return miscJson; + } +} diff --git a/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Packets.java b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Packets.java new file mode 100644 index 00000000..9f1ae64b --- /dev/null +++ b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Packets.java @@ -0,0 +1,42 @@ +package rs.valence.extractor.extractors; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.minecraft.network.NetworkSide; +import net.minecraft.network.NetworkState; +import rs.valence.extractor.Main; + +import java.util.Locale; +import java.util.TreeSet; + +public class Packets implements Main.Extractor { + @Override + public String fileName() { + return "packets.json"; + } + + @Override + public JsonElement extract() { + var packetsJson = new JsonArray(); + + for (var side : NetworkSide.values()) { + for (var state : NetworkState.values()) { + var map = state.getPacketIdToPacketMap(side); + + for (var id : new TreeSet<>(map.keySet())) { + var packetJson = new JsonObject(); + + packetJson.addProperty("name", map.get(id.intValue()).getSimpleName()); + packetJson.addProperty("side", side.name().toLowerCase(Locale.ROOT)); + packetJson.addProperty("state", state.name().toLowerCase(Locale.ROOT)); + packetJson.addProperty("id", id); + + packetsJson.add(packetJson); + } + } + } + + return packetsJson; + } +} diff --git a/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Sounds.java b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Sounds.java new file mode 100644 index 00000000..a204be72 --- /dev/null +++ b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Sounds.java @@ -0,0 +1,31 @@ +package rs.valence.extractor.extractors; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.minecraft.registry.Registries; +import rs.valence.extractor.Main; + +public class Sounds implements Main.Extractor { + public Sounds() { + } + + @Override + public String fileName() { + return "sounds.json"; + } + + @Override + public JsonElement extract() throws Exception { + var itemsJson = new JsonArray(); + + for (var sound : Registries.SOUND_EVENT) { + var itemJson = new JsonObject(); + itemJson.addProperty("id", Registries.SOUND_EVENT.getRawId(sound)); + itemJson.addProperty("name", Registries.SOUND_EVENT.getId(sound).getPath()); + itemsJson.add(itemJson); + } + + return itemsJson; + } +} diff --git a/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Tags.java b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Tags.java new file mode 100644 index 00000000..2ef18914 --- /dev/null +++ b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/Tags.java @@ -0,0 +1,76 @@ +package rs.valence.extractor.extractors; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.mojang.datafixers.util.Pair; +import net.minecraft.registry.CombinedDynamicRegistries; +import net.minecraft.registry.Registry; +import net.minecraft.registry.SerializableRegistries; +import net.minecraft.registry.ServerDynamicRegistryType; +import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.registry.entry.RegistryEntryList; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Identifier; +import rs.valence.extractor.Main; +import rs.valence.extractor.RegistryKeyComparator; + +import java.util.Map; +import java.util.TreeMap; +import java.util.stream.Collectors; + +public class Tags implements Main.Extractor { + private final CombinedDynamicRegistries dynamicRegistryManager; + + public Tags(MinecraftServer server) { + this.dynamicRegistryManager = server.getCombinedDynamicRegistries(); + } + + @Override + public String fileName() { + return "tags.json"; + } + + @Override + public JsonElement extract() { + var tagsJson = new JsonObject(); + + final var registryTags = + SerializableRegistries.streamRegistryManagerEntries(this.dynamicRegistryManager) + .map(registry -> Pair.of(registry.key(), serializeTags(registry.value()))) + .filter(pair -> !(pair.getSecond()).isEmpty()) + .collect(Collectors.toMap(Pair::getFirst, Pair::getSecond, (l, r) -> r, + () -> new TreeMap<>(new RegistryKeyComparator()))); + + for (var registry : registryTags.entrySet()) { + var registryIdent = registry.getKey().getValue().toString(); + var tagGroupTagsJson = new JsonObject(); + + for (var tag : registry.getValue().entrySet()) { + var ident = tag.getKey().toString(); + var rawIds = tag.getValue(); + tagGroupTagsJson.add(ident, rawIds); + } + + tagsJson.add(registryIdent, tagGroupTagsJson); + } + + return tagsJson; + } + + private static Map serializeTags(Registry registry) { + TreeMap map = new TreeMap<>(); + registry.streamTagsAndEntries().forEach(pair -> { + RegistryEntryList registryEntryList = pair.getSecond(); + JsonArray intList = new JsonArray(registryEntryList.size()); + for (RegistryEntry registryEntry : registryEntryList) { + if (registryEntry.getType() != RegistryEntry.Type.REFERENCE) { + throw new IllegalStateException("Can't serialize unregistered value " + registryEntry); + } + intList.add(registry.getRawId(registryEntry.value())); + } + map.put(pair.getFirst().id(), intList); + }); + return map; + } +} diff --git a/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/TranslationKeys.java b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/TranslationKeys.java new file mode 100644 index 00000000..a44ee34f --- /dev/null +++ b/vendor/valence/extractor/src/main/java/rs/valence/extractor/extractors/TranslationKeys.java @@ -0,0 +1,56 @@ +package rs.valence.extractor.extractors; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.minecraft.util.Language; +import rs.valence.extractor.Main; + +import java.lang.reflect.Field; +import java.util.Map; + +public class TranslationKeys implements Main.Extractor { + + @Override + public String fileName() { + return "translation_keys.json"; + } + + @Override + public JsonElement extract() { + JsonArray translationsJson = new JsonArray(); + + Map translations = extractTranslations(); + for (var translation : translations.entrySet()) { + String translationKey = translation.getKey(); + String translationValue = translation.getValue(); + + var translationJson = new JsonObject(); + translationJson.addProperty("key", translationKey); + translationJson.addProperty("english_translation", translationValue); + + translationsJson.add(translationJson); + } + + return translationsJson; + } + + @SuppressWarnings("unchecked") + private static Map extractTranslations() { + Language language = Language.getInstance(); + + Class anonymousClass = language.getClass(); + for (Field field : anonymousClass.getDeclaredFields()) { + try { + Object fieldValue = field.get(language); + if (fieldValue instanceof Map) { + return (Map) fieldValue; + } + } catch (IllegalAccessException e) { + throw new RuntimeException("Failed reflection on field '" + field + "' on class '" + anonymousClass + "'", e); + } + } + + throw new RuntimeException("Did not find anonymous map under 'net.minecraft.util.Language.create()'"); + } +} diff --git a/vendor/valence/extractor/src/main/java/rs/valence/extractor/mixin/ExposeWallBlock.java b/vendor/valence/extractor/src/main/java/rs/valence/extractor/mixin/ExposeWallBlock.java new file mode 100644 index 00000000..b25fd0ad --- /dev/null +++ b/vendor/valence/extractor/src/main/java/rs/valence/extractor/mixin/ExposeWallBlock.java @@ -0,0 +1,12 @@ +package rs.valence.extractor.mixin; + +import net.minecraft.block.Block; +import net.minecraft.item.VerticallyAttachableBlockItem; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(VerticallyAttachableBlockItem.class) +public interface ExposeWallBlock { + @Accessor + Block getWallBlock(); +} diff --git a/vendor/valence/extractor/src/main/resources/extractor.mixins.json b/vendor/valence/extractor/src/main/resources/extractor.mixins.json new file mode 100644 index 00000000..e7d59d66 --- /dev/null +++ b/vendor/valence/extractor/src/main/resources/extractor.mixins.json @@ -0,0 +1,9 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "rs.valence.extractor.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + "ExposeWallBlock" + ] +} \ No newline at end of file diff --git a/vendor/valence/extractor/src/main/resources/fabric.mod.json b/vendor/valence/extractor/src/main/resources/fabric.mod.json new file mode 100644 index 00000000..89a8967c --- /dev/null +++ b/vendor/valence/extractor/src/main/resources/fabric.mod.json @@ -0,0 +1,31 @@ +{ + "schemaVersion": 1, + "id": "valence_extractor", + "version": "${version}", + "name": "Valence Extractor", + "description": "Extracts Minecraft data for use in Valence", + "authors": [ + "Valence Project Authors" + ], + "contact": { + "homepage": "https://github.com/valence-rs/valence", + "sources": "https://github.com/valence-rs/valence" + }, + "environment": "*", + "entrypoints": { + "main": [ + "rs.valence.extractor.Main" + ] + }, + "mixins": [ + "extractor.mixins.json" + ], + "depends": { + "fabricloader": ">=0.14.6", + "minecraft": "~1.20.1", + "java": ">=17" + }, + "suggests": { + "another-mod": "*" + } +} \ No newline at end of file diff --git a/vendor/valence/rustfmt.toml b/vendor/valence/rustfmt.toml new file mode 100644 index 00000000..7788221a --- /dev/null +++ b/vendor/valence/rustfmt.toml @@ -0,0 +1,11 @@ +edition = "2021" +unstable_features = true +wrap_comments = true +imports_granularity = "Module" +group_imports = "StdExternalCrate" +format_code_in_doc_comments = true +format_macro_matchers = true +hex_literal_case = "Lower" +format_strings = true +use_field_init_shorthand = true +use_try_shorthand = true diff --git a/vendor/valence/src/lib.rs b/vendor/valence/src/lib.rs new file mode 100644 index 00000000..7a3dbfd8 --- /dev/null +++ b/vendor/valence/src/lib.rs @@ -0,0 +1,258 @@ +#![cfg_attr( + unstable_doc, + doc = "**ā— NOTE:** This documentation is sourced from the `main` branch. If you're looking for the most recent stable release, go [here](https://docs.rs/valence/latest/valence/).\n\n---\n" +)] +#![doc = include_str!("../README.md")] +#![doc( + html_logo_url = "https://raw.githubusercontent.com/valence-rs/valence/main/assets/logo.svg", + html_favicon_url = "https://raw.githubusercontent.com/valence-rs/valence/main/assets/logo.svg" +)] +#![deny( + rustdoc::broken_intra_doc_links, + rustdoc::private_intra_doc_links, + rustdoc::missing_crate_level_docs, + rustdoc::invalid_codeblock_attributes, + rustdoc::invalid_rust_codeblocks, + rustdoc::bare_urls, + rustdoc::invalid_html_tags +)] +#![warn( + trivial_casts, + trivial_numeric_casts, + unused_lifetimes, + unused_import_braces, + unreachable_pub, + clippy::dbg_macro +)] + +use bevy_app::{PluginGroup, PluginGroupBuilder}; + +#[cfg(feature = "testing")] +pub mod testing; + +#[cfg(test)] +mod tests; + +#[cfg(feature = "log")] +pub use bevy_log as log; +use registry::biome::BiomePlugin; +use registry::dimension_type::DimensionTypePlugin; +#[cfg(feature = "advancement")] +pub use valence_advancement as advancement; +#[cfg(feature = "anvil")] +pub use valence_anvil as anvil; +#[cfg(feature = "boss_bar")] +pub use valence_boss_bar as boss_bar; +#[cfg(feature = "command")] +pub use valence_command as command; +#[cfg(feature = "command")] +pub use valence_command_macros as command_macros; +#[cfg(feature = "inventory")] +pub use valence_inventory as inventory; +pub use valence_lang as lang; +#[cfg(feature = "network")] +pub use valence_network as network; +#[cfg(feature = "player_list")] +pub use valence_player_list as player_list; +use valence_registry::RegistryPlugin; +#[cfg(feature = "scoreboard")] +pub use valence_scoreboard as scoreboard; +use valence_server::abilities::AbilitiesPlugin; +use valence_server::action::ActionPlugin; +use valence_server::client::ClientPlugin; +use valence_server::client_command::ClientCommandPlugin; +use valence_server::client_settings::ClientSettingsPlugin; +use valence_server::custom_payload::CustomPayloadPlugin; +use valence_server::entity::hitbox::HitboxPlugin; +use valence_server::entity::EntityPlugin; +use valence_server::event_loop::EventLoopPlugin; +use valence_server::hand_swing::HandSwingPlugin; +use valence_server::interact_block::InteractBlockPlugin; +use valence_server::interact_entity::InteractEntityPlugin; +use valence_server::interact_item::InteractItemPlugin; +use valence_server::keepalive::KeepalivePlugin; +use valence_server::layer::LayerPlugin; +use valence_server::message::MessagePlugin; +use valence_server::movement::MovementPlugin; +use valence_server::op_level::OpLevelPlugin; +pub use valence_server::protocol::status_effects; +use valence_server::resource_pack::ResourcePackPlugin; +use valence_server::status::StatusPlugin; +use valence_server::status_effect::StatusEffectPlugin; +use valence_server::teleport::TeleportPlugin; +pub use valence_server::*; +#[cfg(feature = "weather")] +pub use valence_weather as weather; +#[cfg(feature = "world_border")] +pub use valence_world_border as world_border; + +/// Contains the most frequently used items in Valence projects. +/// +/// This is usually glob imported like so: +/// +/// ``` +/// use valence::prelude::*; // Glob import. +/// +/// let mut app = App::new(); +/// app.add_systems(Update, || println!("yippee!")); +/// // ... +/// ``` +pub mod prelude { + pub use bevy_app::prelude::*; + pub use bevy_ecs; // Needed for bevy_ecs macros to function correctly. + pub use bevy_ecs::prelude::*; + pub use uuid::Uuid; + #[cfg(feature = "advancement")] + pub use valence_advancement::{ + event::AdvancementTabChangeEvent, Advancement, AdvancementBundle, AdvancementClientUpdate, + AdvancementCriteria, AdvancementDisplay, AdvancementFrameType, AdvancementRequirements, + }; + #[cfg(feature = "inventory")] + pub use valence_inventory::{ + CursorItem, Inventory, InventoryKind, InventoryWindow, InventoryWindowMut, OpenInventory, + }; + #[cfg(feature = "network")] + pub use valence_network::{ + ConnectionMode, ErasedNetworkCallbacks, NetworkCallbacks, NetworkSettings, NewClientInfo, + SharedNetworkState, + }; + #[cfg(feature = "player_list")] + pub use valence_player_list::{PlayerList, PlayerListEntry}; + pub use valence_registry::biome::{Biome, BiomeId, BiomeRegistry}; + pub use valence_registry::dimension_type::{DimensionType, DimensionTypeRegistry}; + pub use valence_server::action::{DiggingEvent, DiggingState}; + pub use valence_server::block::{BlockKind, BlockState, PropName, PropValue}; + pub use valence_server::client::{ + despawn_disconnected_clients, Client, Ip, OldView, OldViewDistance, Properties, Username, + View, ViewDistance, VisibleChunkLayer, VisibleEntityLayers, + }; + pub use valence_server::client_command::{ + ClientCommand, JumpWithHorseEvent, JumpWithHorseState, LeaveBedEvent, SneakEvent, + SneakState, SprintEvent, SprintState, + }; + pub use valence_server::entity::hitbox::{Hitbox, HitboxShape}; + pub use valence_server::entity::{ + EntityAnimation, EntityKind, EntityLayerId, EntityManager, EntityStatus, HeadYaw, Look, + OldEntityLayerId, OldPosition, Position, + }; + pub use valence_server::event_loop::{ + EventLoopPostUpdate, EventLoopPreUpdate, EventLoopUpdate, + }; + pub use valence_server::ident::Ident; + pub use valence_server::interact_entity::{EntityInteraction, InteractEntityEvent}; + pub use valence_server::layer::chunk::{ + Block, BlockRef, Chunk, ChunkLayer, LoadedChunk, UnloadedChunk, + }; + pub use valence_server::layer::{EntityLayer, LayerBundle}; + pub use valence_server::math::{DVec2, DVec3, Vec2, Vec3}; + pub use valence_server::message::SendMessage as _; + pub use valence_server::nbt::Compound; + pub use valence_server::protocol::packets::play::particle_s2c::Particle; + pub use valence_server::protocol::text::{Color, IntoText, Text}; + pub use valence_server::spawn::{ClientSpawnQuery, ClientSpawnQueryReadOnly, RespawnPosition}; + pub use valence_server::title::SetTitle as _; + pub use valence_server::{ + ident, BlockPos, ChunkPos, ChunkView, Despawned, Direction, GameMode, Hand, ItemKind, + ItemStack, Server, UniqueId, + }; + + pub use super::DefaultPlugins; +} + +/// This plugin group will add all the default plugins for a Valence +/// application. +/// +/// [`DefaultPlugins`] obeys Cargo feature flags. Users may exert control over +/// this plugin group by disabling `default-features` in their `Cargo.toml` and +/// enabling only those features that they wish to use. +pub struct DefaultPlugins; + +impl PluginGroup for DefaultPlugins { + fn build(self) -> PluginGroupBuilder { + #[allow(unused_mut)] + let mut group = PluginGroupBuilder::start::() + .add(ServerPlugin) + .add(RegistryPlugin) + .add(BiomePlugin) + .add(DimensionTypePlugin) + .add(EntityPlugin) + .add(HitboxPlugin) + .add(LayerPlugin) + .add(ClientPlugin) + .add(EventLoopPlugin) + .add(MovementPlugin) + .add(ClientCommandPlugin) + .add(KeepalivePlugin) + .add(InteractEntityPlugin) + .add(ClientSettingsPlugin) + .add(ActionPlugin) + .add(TeleportPlugin) + .add(MessagePlugin) + .add(CustomPayloadPlugin) + .add(HandSwingPlugin) + .add(InteractBlockPlugin) + .add(InteractItemPlugin) + .add(OpLevelPlugin) + .add(ResourcePackPlugin) + .add(StatusPlugin) + .add(StatusEffectPlugin) + .add(AbilitiesPlugin); + + #[cfg(feature = "log")] + { + group = group.add(bevy_log::LogPlugin::default()); + } + + #[cfg(feature = "network")] + { + group = group.add(valence_network::NetworkPlugin); + } + + #[cfg(feature = "player_list")] + { + group = group.add(valence_player_list::PlayerListPlugin); + } + + #[cfg(feature = "inventory")] + { + group = group.add(valence_inventory::InventoryPlugin); + } + + #[cfg(feature = "anvil")] + { + group = group.add(valence_anvil::AnvilPlugin); + } + + #[cfg(feature = "advancement")] + { + group = group.add(valence_advancement::AdvancementPlugin) + } + + #[cfg(feature = "weather")] + { + group = group.add(valence_weather::WeatherPlugin); + } + + #[cfg(feature = "world_border")] + { + group = group.add(valence_world_border::WorldBorderPlugin); + } + + #[cfg(feature = "boss_bar")] + { + group = group.add(valence_boss_bar::BossBarPlugin); + } + + #[cfg(feature = "command")] + { + group = group.add(valence_command::manager::CommandPlugin); + } + + #[cfg(feature = "scoreboard")] + { + group = group.add(valence_scoreboard::ScoreboardPlugin); + } + + group + } +} diff --git a/vendor/valence/src/testing.rs b/vendor/valence/src/testing.rs new file mode 100644 index 00000000..58fdc147 --- /dev/null +++ b/vendor/valence/src/testing.rs @@ -0,0 +1,335 @@ +use std::collections::VecDeque; +use std::net::{IpAddr, Ipv4Addr}; +use std::sync::{Arc, Mutex}; +use std::time::{Duration, Instant}; + +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; +use bytes::{Buf, BufMut, BytesMut}; +use uuid::Uuid; +use valence_ident::ident; +use valence_network::NetworkPlugin; +use valence_registry::{BiomeRegistry, DimensionTypeRegistry}; +use valence_server::client::{ClientBundle, ClientBundleArgs, ClientConnection, ReceivedPacket}; +use valence_server::keepalive::KeepaliveSettings; +use valence_server::protocol::decode::PacketFrame; +use valence_server::protocol::packets::play::{PlayerPositionLookS2c, TeleportConfirmC2s}; +use valence_server::protocol::{Decode, Encode, Packet, PacketDecoder, PacketEncoder, VarInt}; +use valence_server::{ChunkLayer, EntityLayer, Server, ServerSettings}; + +use crate::DefaultPlugins; +pub struct ScenarioSingleClient { + /// The new bevy application. + pub app: App, + /// Entity handle for the single client. + pub client: Entity, + /// Helper for sending and receiving packets from the mock client. + pub helper: MockClientHelper, + /// Entity with [`ChunkLayer`] and [`EntityLayer`] components. + pub layer: Entity, +} + +impl ScenarioSingleClient { + /// Sets up Valence with a single mock client and entity+chunk layer. The + /// client is configured to be placed within the layer. + /// + /// Reduces boilerplate in unit tests. + pub fn new() -> Self { + let mut app = App::new(); + + app.insert_resource(KeepaliveSettings { + period: Duration::MAX, + }) + .insert_resource(ServerSettings { + compression_threshold: Default::default(), + ..Default::default() + }) + .add_plugins(DefaultPlugins.build().disable::()); + + app.update(); // Initialize plugins. + + let chunk_layer = ChunkLayer::new( + ident!("overworld"), + app.world.resource::(), + app.world.resource::(), + app.world.resource::(), + ); + let entity_layer = EntityLayer::new(app.world.resource::()); + let layer = app.world.spawn((chunk_layer, entity_layer)).id(); + + let (mut client, helper) = create_mock_client("test"); + client.player.layer.0 = layer; + client.visible_chunk_layer.0 = layer; + client.visible_entity_layers.0.insert(layer); + let client = app.world.spawn(client).id(); + + ScenarioSingleClient { + app, + client, + helper, + layer, + } + } +} + +impl Default for ScenarioSingleClient { + fn default() -> Self { + Self::new() + } +} + +/// Creates a mock client bundle that can be used for unit testing. +/// +/// Returns the client, and a helper to inject packets as if the client sent +/// them and receive packets as if the client received them. +pub fn create_mock_client(name: impl Into) -> (ClientBundle, MockClientHelper) { + let conn = MockClientConnection::new(); + + let bundle = ClientBundle::new(ClientBundleArgs { + username: name.into(), + uuid: Uuid::from_bytes(rand::random()), + ip: IpAddr::V4(Ipv4Addr::LOCALHOST), + properties: Default::default(), + conn: Box::new(conn.clone()), + enc: PacketEncoder::new(), + }); + + let helper = MockClientHelper::new(conn); + + (bundle, helper) +} + +/// A mock client connection that can be used for testing. +/// +/// Safe to clone, but note that the clone will share the same buffers. +#[derive(Clone)] +pub struct MockClientConnection { + inner: Arc>, +} + +struct MockClientConnectionInner { + /// The queue of packets to receive from the client to be processed by the + /// server. + recv_buf: VecDeque, + /// The queue of packets to send from the server to the client. + send_buf: BytesMut, +} + +impl MockClientConnection { + pub fn new() -> Self { + Self { + inner: Arc::new(Mutex::new(MockClientConnectionInner { + recv_buf: VecDeque::new(), + send_buf: BytesMut::new(), + })), + } + } + + /// Injects a (Packet ID + data) frame to be received by the server. + fn inject_send(&self, mut bytes: BytesMut) { + let id = VarInt::decode_partial((&mut bytes).reader()).expect("failed to decode packet ID"); + + self.inner + .lock() + .unwrap() + .recv_buf + .push_back(ReceivedPacket { + timestamp: Instant::now(), + id, + body: bytes.freeze(), + }); + } + + fn take_received(&self) -> BytesMut { + self.inner.lock().unwrap().send_buf.split() + } + + fn clear_received(&self) { + self.inner.lock().unwrap().send_buf.clear(); + } +} + +impl ClientConnection for MockClientConnection { + fn try_send(&mut self, bytes: BytesMut) -> anyhow::Result<()> { + self.inner.lock().unwrap().send_buf.unsplit(bytes); + Ok(()) + } + + fn try_recv(&mut self) -> anyhow::Result> { + Ok(self.inner.lock().unwrap().recv_buf.pop_front()) + } + + fn len(&self) -> usize { + self.inner.lock().unwrap().recv_buf.len() + } +} + +impl Default for MockClientConnection { + fn default() -> Self { + Self::new() + } +} + +/// Contains the mocked client connection and helper methods to inject packets +/// and read packets from the send stream. +pub struct MockClientHelper { + conn: MockClientConnection, + dec: PacketDecoder, + scratch: BytesMut, +} + +impl MockClientHelper { + pub fn new(conn: MockClientConnection) -> Self { + Self { + conn, + dec: PacketDecoder::new(), + scratch: BytesMut::new(), + } + } + + /// Inject a packet to be treated as a packet inbound to the server. Panics + /// if the packet cannot be sent. + #[track_caller] + pub fn send

(&mut self, packet: &P) + where + P: Packet + Encode, + { + packet + .encode_with_id((&mut self.scratch).writer()) + .expect("failed to encode packet"); + + self.conn.inject_send(self.scratch.split()); + } + + /// Collect all packets that have been received by the client. + #[track_caller] + pub fn collect_received(&mut self) -> PacketFrames { + self.dec.queue_bytes(self.conn.take_received()); + + let mut res = vec![]; + + while let Some(frame) = self + .dec + .try_next_packet() + .expect("failed to decode packet frame") + { + res.push(frame); + } + + PacketFrames(res) + } + + pub fn clear_received(&mut self) { + self.conn.clear_received(); + } + + pub fn confirm_initial_pending_teleports(&mut self) { + let mut counter = 0; + + for pkt in self.collect_received().0 { + if pkt.id == PlayerPositionLookS2c::ID { + pkt.decode::().unwrap(); + + self.send(&TeleportConfirmC2s { + teleport_id: counter.into(), + }); + + counter += 1; + } + } + } +} + +#[derive(Clone, Debug)] +pub struct PacketFrames(pub Vec); + +impl PacketFrames { + #[track_caller] + pub fn assert_count(&self, expected_count: usize) { + let actual_count = self.0.iter().filter(|f| f.id == P::ID).count(); + + if expected_count != actual_count { + panic!( + "unexpected packet count for {} (expected {expected_count}, got {actual_count})", + P::NAME, + ); + } + } + + #[track_caller] + pub fn assert_order(&self) { + let positions: Vec<_> = self + .0 + .iter() + .filter_map(|f| L::packets().iter().position(|(id, _)| f.id == *id)) + .collect(); + + // TODO: replace with slice::is_sorted when stabilized. + let is_sorted = positions.windows(2).all(|w| w[0] <= w[1]); + + if !is_sorted { + panic!( + "packets out of order (expected {:?}, got {:?})", + L::packets(), + self.debug_order::() + ); + } + } + + /// Finds the first occurrence of `P` in the packet list and decodes it. + /// + /// # Panics + /// + /// Panics if the packet was not found or a decoding error occurs. + #[track_caller] + pub fn first<'a, P>(&'a self) -> P + where + P: Packet + Decode<'a>, + { + if let Some(frame) = self.0.iter().find(|p| p.id == P::ID) { + frame.decode::

().unwrap() + } else { + panic!("failed to find packet {}", P::NAME) + } + } + + pub fn debug_order(&self) -> impl std::fmt::Debug { + self.0 + .iter() + .filter_map(|f| L::packets().iter().find(|(id, _)| f.id == *id).cloned()) + .collect::>() + } +} + +pub trait PacketList { + fn packets() -> &'static [(i32, &'static str)]; +} + +macro_rules! impl_packet_list { + ($($ty:ident),*) => { + impl<$($ty: Packet,)*> PacketList for ($($ty,)*) { + fn packets() -> &'static [(i32, &'static str)] { + &[ + $( + ( + $ty::ID, + $ty::NAME + ), + )* + ] + } + } + } +} + +impl_packet_list!(A); +impl_packet_list!(A, B); +impl_packet_list!(A, B, C); +impl_packet_list!(A, B, C, D); +impl_packet_list!(A, B, C, D, E); +impl_packet_list!(A, B, C, D, E, F); +impl_packet_list!(A, B, C, D, E, F, G); +impl_packet_list!(A, B, C, D, E, F, G, H); +impl_packet_list!(A, B, C, D, E, F, G, H, I); +impl_packet_list!(A, B, C, D, E, F, G, H, I, J); +impl_packet_list!(A, B, C, D, E, F, G, H, I, J, K); diff --git a/vendor/valence/src/tests.rs b/vendor/valence/src/tests.rs new file mode 100644 index 00000000..e8297121 --- /dev/null +++ b/vendor/valence/src/tests.rs @@ -0,0 +1,11 @@ +mod boss_bar; +mod client; +mod example; +mod hunger; +mod inventory; +mod layer; +mod player_list; +mod potions; +mod scoreboard; +mod weather; +mod world_border; diff --git a/vendor/valence/src/tests/boss_bar.rs b/vendor/valence/src/tests/boss_bar.rs new file mode 100644 index 00000000..c2b6cf2a --- /dev/null +++ b/vendor/valence/src/tests/boss_bar.rs @@ -0,0 +1,196 @@ +use valence_boss_bar::{ + BossBarBundle, BossBarColor, BossBarDivision, BossBarFlags, BossBarHealth, BossBarStyle, + BossBarTitle, +}; +use valence_server::client::VisibleEntityLayers; +use valence_server::entity::EntityLayerId; +use valence_server::protocol::packets::play::BossBarS2c; +use valence_server::text::IntoText; +use valence_server::Despawned; + +use crate::testing::ScenarioSingleClient; +use crate::Text; + +#[test] +fn test_initialize_on_join() { + let mut scenario = ScenarioSingleClient::new(); + + // Insert a boss bar into the world + scenario + .app + .world + .entity_mut(scenario.layer) + .insert(BossBarBundle { + title: BossBarTitle("Boss Bar".into_text()), + health: BossBarHealth(0.5), + layer: EntityLayerId(scenario.layer), + ..Default::default() + }); + + scenario.app.update(); + + // We should receive a boss bar packet with the ADD action + let frames = scenario.helper.collect_received(); + frames.assert_count::(1); +} + +#[test] +fn test_despawn() { + let ScenarioSingleClient { + mut app, + mut helper, + layer, + .. + } = prepare(); + + // Despawn the boss bar + app.world.entity_mut(layer).insert(Despawned); + + app.update(); + + // We should receive a boss bar packet with the REMOVE action + let frames = helper.collect_received(); + frames.assert_count::(1); +} + +#[test] +fn test_title_update() { + let ScenarioSingleClient { + mut app, + mut helper, + layer, + .. + } = prepare(); + + // Update the title + app.world + .entity_mut(layer) + .insert(BossBarTitle(Text::text("Test 2"))); + + app.update(); + + // We should receive a boss bar packet with the UPDATE_TITLE action + let frames = helper.collect_received(); + frames.assert_count::(1); +} + +#[test] +fn test_health_update() { + let ScenarioSingleClient { + mut app, + mut helper, + layer, + .. + } = prepare(); + + // Update the health + app.world.entity_mut(layer).insert(BossBarHealth(0.5)); + + app.update(); + + // We should receive a boss bar packet with the UPDATE_HEALTH action + let frames = helper.collect_received(); + frames.assert_count::(1); +} + +#[test] +fn test_style_update() { + let ScenarioSingleClient { + mut app, + mut helper, + layer, + .. + } = prepare(); + + // Update the style + app.world.entity_mut(layer).insert(BossBarStyle { + color: BossBarColor::Red, + division: BossBarDivision::TenNotches, + }); + + app.update(); + + // We should receive a boss bar packet with the UPDATE_STYLE action + let frames = helper.collect_received(); + frames.assert_count::(1); +} + +#[test] +fn test_flags_update() { + let ScenarioSingleClient { + mut app, + mut helper, + layer, + .. + } = prepare(); + + // Update the flags + let mut new_flags = BossBarFlags::new(); + new_flags.set_create_fog(true); + app.world.entity_mut(layer).insert(new_flags); + + app.update(); + + // We should receive a boss bar packet with the UPDATE_FLAGS action + let frames = helper.collect_received(); + frames.assert_count::(1); +} + +#[test] +fn test_client_layer_change() { + let ScenarioSingleClient { + mut app, + mut helper, + layer, + client, + } = prepare(); + + // Remove the layer from the client + { + let mut visible_entity_layers = app.world.get_mut::(client).unwrap(); + visible_entity_layers.0.clear(); + } + + app.update(); + + // We should receive a boss bar packet with the REMOVE action + let frames = helper.collect_received(); + frames.assert_count::(1); + + // Add the layer back to the client + { + let mut visible_entity_layers = app.world.get_mut::(client).unwrap(); + visible_entity_layers.0.insert(layer); + } + + app.update(); + + // We should receive a boss bar packet with the ADD action + let frames = helper.collect_received(); + frames.assert_count::(1); +} + +fn prepare() -> ScenarioSingleClient { + let mut s = ScenarioSingleClient::new(); + + // Process a tick to get past the "on join" logic. + s.app.update(); + s.helper.clear_received(); + + // Insert a boss bar into the world + + // Attach the new boss bar to the layer for convenience. + s.app.world.entity_mut(s.layer).insert(BossBarBundle { + title: BossBarTitle("Boss Bar".into_text()), + health: BossBarHealth(0.5), + layer: EntityLayerId(s.layer), + ..Default::default() + }); + + for _ in 0..2 { + s.app.update(); + } + + s.helper.clear_received(); + s +} diff --git a/vendor/valence/src/tests/client.rs b/vendor/valence/src/tests/client.rs new file mode 100644 index 00000000..0055469f --- /dev/null +++ b/vendor/valence/src/tests/client.rs @@ -0,0 +1,103 @@ +use crate::abilities::PlayerAbilitiesFlags; +use crate::layer::chunk::UnloadedChunk; +use crate::layer::ChunkLayer; +use crate::math::DVec3; +use crate::protocol::packets::play::{ + FullC2s, MoveRelativeS2c, PlayerPositionLookS2c, TeleportConfirmC2s, +}; +use crate::testing::{create_mock_client, ScenarioSingleClient}; +use crate::{ChunkPos, GameMode}; + +#[test] +fn client_teleport_and_move() { + let ScenarioSingleClient { + mut app, + client: _, + helper: mut helper_1, + layer: layer_ent, + } = ScenarioSingleClient::new(); + + let mut layer = app.world.get_mut::(layer_ent).unwrap(); + + for z in -10..10 { + for x in -10..10 { + layer.insert_chunk(ChunkPos::new(x, z), UnloadedChunk::new()); + } + } + + let (mut bundle, mut helper_2) = create_mock_client("other"); + + bundle.player.layer.0 = layer_ent; + bundle.visible_chunk_layer.0 = layer_ent; + bundle.visible_entity_layers.0.insert(layer_ent); + + app.world.spawn(bundle); + + app.update(); + + // Client received an initial teleport. + helper_1 + .collect_received() + .assert_count::(1); + + // Confirm the initial teleport from the server. + helper_1.send(&TeleportConfirmC2s { + teleport_id: 0.into(), + }); + + // Move a little. + helper_1.send(&FullC2s { + position: DVec3::new(1.0, 0.0, 0.0), + yaw: 0.0, + pitch: 0.0, + on_ground: true, + }); + + app.update(); + + // Check that the other client saw the client moving. + helper_2 + .collect_received() + .assert_count::(1); +} + +#[test] +fn client_gamemode_changed_ability() { + let mut scenario = ScenarioSingleClient::new(); + + *scenario + .app + .world + .get_mut::(scenario.client) + .unwrap() = GameMode::Creative; + + scenario.app.update(); + + let abilities = scenario + .app + .world + .get::(scenario.client) + .unwrap(); + + assert!(abilities.allow_flying()); + assert!(abilities.instant_break()); + assert!(abilities.invulnerable()); + + *scenario + .app + .world + .get_mut::(scenario.client) + .unwrap() = GameMode::Adventure; + + scenario.app.update(); + + let abilities = scenario + .app + .world + .get::(scenario.client) + .unwrap(); + + assert!(!abilities.allow_flying()); + assert!(!abilities.instant_break()); + assert!(!abilities.invulnerable()); +} diff --git a/vendor/valence/src/tests/example.rs b/vendor/valence/src/tests/example.rs new file mode 100644 index 00000000..abf2bb2d --- /dev/null +++ b/vendor/valence/src/tests/example.rs @@ -0,0 +1,95 @@ +//! Examples of valence unit tests that need to test the behavior of the server, +//! and not just the logic of a single function. This module is meant to be a +//! palette of examples for how to write such tests, with various levels of +//! complexity. +//! +//! Some of the tests in this file may be inferior duplicates of real tests. + +use bevy_app::App; + +use crate::client::Client; +use crate::entity::Position; +use crate::inventory::{Inventory, InventoryKind, OpenInventory}; +use crate::math::DVec3; +use crate::protocol::packets::play::{InventoryS2c, OpenScreenS2c, PositionAndOnGroundC2s}; +use crate::testing::ScenarioSingleClient; +use crate::{DefaultPlugins, Server}; + +/// The server's tick should increment every update. +#[test] +fn example_test_server_tick_increment() { + let mut app = App::new(); + + app.add_plugins(DefaultPlugins); + + let tick = app.world.resource::().current_tick(); + + app.update(); + + let server = app.world.resource::(); + assert_eq!(server.current_tick(), tick + 1); +} + +/// A unit test where we want to test what happens when a client sends a +/// packet to the server. +#[test] +fn example_test_client_position() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + // Send a packet as the client to the server. + let packet = PositionAndOnGroundC2s { + position: DVec3::new(12.0, 64.0, 0.0), + on_ground: true, + }; + helper.send(&packet); + + // Process the packet. + app.update(); + + // Make assertions + let pos = app.world.get::(client).unwrap(); + assert_eq!(pos.0, DVec3::new(12.0, 64.0, 0.0)); +} + +/// A unit test where we want to test what packets are sent to the client. +#[test] +fn example_test_open_inventory() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + let inventory = Inventory::new(InventoryKind::Generic3x3); + let inventory_ent = app.world.spawn(inventory).id(); + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + // Open the inventory. + let open_inventory = OpenInventory::new(inventory_ent); + app.world + .get_entity_mut(client) + .expect("could not find client") + .insert(open_inventory); + + app.update(); + app.update(); + + // Make assertions + app.world.get::(client).expect("client not found"); + + let sent_packets = helper.collect_received(); + + sent_packets.assert_count::(1); + sent_packets.assert_count::(1); + + sent_packets.assert_order::<(OpenScreenS2c, InventoryS2c)>(); +} diff --git a/vendor/valence/src/tests/hunger.rs b/vendor/valence/src/tests/hunger.rs new file mode 100644 index 00000000..37f65550 --- /dev/null +++ b/vendor/valence/src/tests/hunger.rs @@ -0,0 +1,38 @@ +use valence_server::entity::living::Health; +use valence_server::entity::player::{Food, Saturation}; +use valence_server::protocol::packets::play::HealthUpdateS2c; +use valence_server::protocol::VarInt; + +use crate::testing::ScenarioSingleClient; + +#[test] +fn test_hunger() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + app.update(); + helper.clear_received(); + + let og_saturation = app.world.get::(client).unwrap().0; + let og_health = app.world.get::(client).unwrap().0; + + // set food level to 5 + app.world.get_mut::(client).unwrap().0 = 5; + + app.update(); + + // make sure the packet was sent + let sent_packets = helper.collect_received(); + + sent_packets.assert_count::(1); + + let packet = sent_packets.first::(); + + assert_eq!(packet.health, og_health); + assert_eq!(packet.food, VarInt(5)); + assert_eq!(packet.food_saturation, og_saturation); +} diff --git a/vendor/valence/src/tests/inventory.rs b/vendor/valence/src/tests/inventory.rs new file mode 100644 index 00000000..3aa589c4 --- /dev/null +++ b/vendor/valence/src/tests/inventory.rs @@ -0,0 +1,1155 @@ +use bevy_app::prelude::*; +use bevy_ecs::prelude::*; + +use crate::inventory::{ + convert_to_player_slot_id, ClickMode, ClientInventoryState, CursorItem, DropItemStackEvent, + HeldItem, Inventory, InventoryKind, OpenInventory, SlotChange, +}; +use crate::protocol::packets::play::{ + ClickSlotC2s, CloseScreenS2c, CreativeInventoryActionC2s, InventoryS2c, OpenScreenS2c, + ScreenHandlerSlotUpdateS2c, UpdateSelectedSlotC2s, +}; +use crate::protocol::VarInt; +use crate::testing::ScenarioSingleClient; +use crate::{GameMode, ItemKind, ItemStack}; + +#[test] +fn test_should_open_inventory() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + let inventory = Inventory::new(InventoryKind::Generic3x3); + let inventory_ent = app.world.spawn(inventory).id(); + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + // Open the inventory. + let open_inventory = OpenInventory::new(inventory_ent); + app.world + .get_entity_mut(client) + .expect("could not find client") + .insert(open_inventory); + + app.update(); + + // Make assertions + let sent_packets = helper.collect_received(); + + sent_packets.assert_count::(1); + sent_packets.assert_count::(1); + sent_packets.assert_order::<(OpenScreenS2c, InventoryS2c)>(); +} + +#[test] +fn test_should_close_inventory() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + let inventory = Inventory::new(InventoryKind::Generic3x3); + let inventory_ent = app.world.spawn(inventory).id(); + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + // Open the inventory. + let open_inventory = OpenInventory::new(inventory_ent); + app.world + .get_entity_mut(client) + .expect("could not find client") + .insert(open_inventory); + + app.update(); + helper.clear_received(); + + // Close the inventory. + app.world + .get_entity_mut(client) + .expect("could not find client") + .remove::(); + + app.update(); + + // Make assertions + let sent_packets = helper.collect_received(); + + sent_packets.assert_count::(1); +} + +#[test] +fn test_should_remove_invalid_open_inventory() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + let inventory = Inventory::new(InventoryKind::Generic3x3); + let inventory_ent = app.world.spawn(inventory).id(); + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + // Open the inventory. + let open_inventory = OpenInventory::new(inventory_ent); + app.world + .get_entity_mut(client) + .expect("could not find client") + .insert(open_inventory); + + app.update(); + helper.clear_received(); + + // Remove the inventory. + app.world.despawn(inventory_ent); + + app.update(); + + // Make assertions + assert!(app.world.get::(client).is_none()); + + let sent_packets = helper.collect_received(); + sent_packets.assert_count::(1); +} + +#[test] +fn test_should_modify_player_inventory_click_slot() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + let mut inventory = app + .world + .get_mut::(client) + .expect("could not find inventory for client"); + inventory.set_slot(20, ItemStack::new(ItemKind::Diamond, 2, None)); + + // Make the client click the slot and pick up the item. + let state_id = app + .world + .get::(client) + .unwrap() + .state_id(); + + helper.send(&ClickSlotC2s { + window_id: 0, + button: 0, + mode: ClickMode::Click, + state_id: VarInt(state_id.0), + slot_idx: 20, + slot_changes: vec![SlotChange { + idx: 20, + stack: ItemStack::EMPTY, + }] + .into(), + carried_item: ItemStack::new(ItemKind::Diamond, 2, None), + }); + + app.update(); + + // Make assertions + let sent_packets = helper.collect_received(); + + // because the inventory was changed as a result of the client's click, the + // server should not send any packets to the client because the client + // already knows about the change. + sent_packets.assert_count::(0); + sent_packets.assert_count::(0); + + let inventory = app + .world + .get::(client) + .expect("could not find inventory for client"); + + assert_eq!(inventory.slot(20), &ItemStack::EMPTY); + + let cursor_item = app + .world + .get::(client) + .expect("could not find client"); + + assert_eq!(cursor_item.0, ItemStack::new(ItemKind::Diamond, 2, None)); +} + +#[test] +fn test_should_modify_player_inventory_server_side() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + // Process a tick to get past the "on join" logic. + app.update(); + + let mut inventory = app + .world + .get_mut::(client) + .expect("could not find inventory for client"); + inventory.set_slot(20, ItemStack::new(ItemKind::Diamond, 2, None)); + + app.update(); + helper.clear_received(); + + // Modify the inventory. + let mut inventory = app + .world + .get_mut::(client) + .expect("could not find inventory for client"); + inventory.set_slot(21, ItemStack::new(ItemKind::IronIngot, 1, None)); + + app.update(); + + // Make assertions + let sent_packets = helper.collect_received(); + // because the inventory was modified server side, the client needs to be + // updated with the change. + sent_packets.assert_count::(1); +} + +#[test] +fn test_should_sync_entire_player_inventory() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + let mut inventory = app + .world + .get_mut::(client) + .expect("could not find inventory for client"); + inventory.changed = u64::MAX; + + app.update(); + + // Make assertions + let sent_packets = helper.collect_received(); + sent_packets.assert_count::(1); +} + +fn set_up_open_inventory(app: &mut App, client_ent: Entity) -> Entity { + let inventory = Inventory::new(InventoryKind::Generic9x3); + let inventory_ent = app.world.spawn(inventory).id(); + + // Open the inventory. + let open_inventory = OpenInventory::new(inventory_ent); + app.world + .get_entity_mut(client_ent) + .expect("could not find client") + .insert(open_inventory); + + inventory_ent +} + +#[test] +fn test_should_modify_open_inventory_click_slot() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + let inventory_ent = set_up_open_inventory(&mut app, client); + + let mut inventory = app + .world + .get_mut::(inventory_ent) + .expect("could not find inventory for client"); + + inventory.set_slot(20, ItemStack::new(ItemKind::Diamond, 2, None)); + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + // Make the client click the slot and pick up the item. + let inv_state = app.world.get::(client).unwrap(); + let state_id = inv_state.state_id(); + let window_id = inv_state.window_id(); + helper.send(&ClickSlotC2s { + window_id, + state_id: VarInt(state_id.0), + slot_idx: 20, + button: 0, + mode: ClickMode::Click, + slot_changes: vec![SlotChange { + idx: 20, + stack: ItemStack::EMPTY, + }] + .into(), + carried_item: ItemStack::new(ItemKind::Diamond, 2, None), + }); + + app.update(); + + // Make assertions + let sent_packets = helper.collect_received(); + + // because the inventory was modified as a result of the client's click, the + // server should not send any packets to the client because the client + // already knows about the change. + sent_packets.assert_count::(0); + sent_packets.assert_count::(0); + + let inventory = app + .world + .get::(inventory_ent) + .expect("could not find inventory"); + assert_eq!(inventory.slot(20), &ItemStack::EMPTY); + let cursor_item = app + .world + .get::(client) + .expect("could not find client"); + assert_eq!(cursor_item.0, ItemStack::new(ItemKind::Diamond, 2, None)); +} + +#[test] +fn test_should_modify_open_inventory_server_side() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + let inventory_ent = set_up_open_inventory(&mut app, client); + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + // Modify the inventory. + let mut inventory = app + .world + .get_mut::(inventory_ent) + .expect("could not find inventory for client"); + inventory.set_slot(5, ItemStack::new(ItemKind::IronIngot, 1, None)); + + app.update(); + + // Make assertions + let sent_packets = helper.collect_received(); + + // because the inventory was modified server side, the client needs to be + // updated with the change. + sent_packets.assert_count::(1); + + let inventory = app + .world + .get::(inventory_ent) + .expect("could not find inventory for client"); + + assert_eq!( + inventory.slot(5), + &ItemStack::new(ItemKind::IronIngot, 1, None) + ); +} + +#[test] +fn test_should_sync_entire_open_inventory() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + let inventory_ent = set_up_open_inventory(&mut app, client); + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + let mut inventory = app + .world + .get_mut::(inventory_ent) + .expect("could not find inventory"); + inventory.changed = u64::MAX; + + app.update(); + + // Make assertions + let sent_packets = helper.collect_received(); + sent_packets.assert_count::(1); +} + +#[test] +fn test_set_creative_mode_slot_handling() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + let mut game_mode = app + .world + .get_mut::(client) + .expect("could not find client"); + *game_mode.as_mut() = GameMode::Creative; + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + helper.send(&CreativeInventoryActionC2s { + slot: 36, + clicked_item: ItemStack::new(ItemKind::Diamond, 2, None), + }); + + app.update(); + + // Make assertions + let inventory = app + .world + .get::(client) + .expect("could not find inventory for client"); + + assert_eq!( + inventory.slot(36), + &ItemStack::new(ItemKind::Diamond, 2, None) + ); +} + +#[test] +fn test_ignore_set_creative_mode_slot_if_not_creative() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + let mut game_mode = app + .world + .get_mut::(client) + .expect("could not find client"); + *game_mode.as_mut() = GameMode::Survival; + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + helper.send(&CreativeInventoryActionC2s { + slot: 36, + clicked_item: ItemStack::new(ItemKind::Diamond, 2, None), + }); + + app.update(); + + // Make assertions + let inventory = app + .world + .get::(client) + .expect("could not find inventory for client"); + assert_eq!(inventory.slot(36), &ItemStack::EMPTY); +} + +#[test] +fn test_window_id_increments() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + let inventory = Inventory::new(InventoryKind::Generic9x3); + let inventory_ent = app.world.spawn(inventory).id(); + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + for _ in 0..3 { + let open_inventory = OpenInventory::new(inventory_ent); + app.world + .get_entity_mut(client) + .expect("could not find client") + .insert(open_inventory); + + app.update(); + + app.world + .get_entity_mut(client) + .expect("could not find client") + .remove::(); + + app.update(); + } + + // Make assertions + let inv_state = app + .world + .get::(client) + .expect("could not find client"); + assert_eq!(inv_state.window_id(), 3); +} + +#[test] +fn test_should_handle_set_held_item() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + helper.send(&UpdateSelectedSlotC2s { slot: 4 }); + + app.update(); + + // Make assertions + let held = app + .world + .get::(client) + .expect("could not find client"); + + assert_eq!(held.slot(), 40); +} + +#[test] +fn should_not_increment_state_id_on_cursor_item_change() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + let inv_state = app + .world + .get::(client) + .expect("could not find client"); + let expected_state_id = inv_state.state_id().0; + + let mut cursor_item = app.world.get_mut::(client).unwrap(); + cursor_item.0 = ItemStack::new(ItemKind::Diamond, 2, None); + + app.update(); + + // Make assertions + let inv_state = app + .world + .get::(client) + .expect("could not find client"); + assert_eq!( + inv_state.state_id().0, + expected_state_id, + "state id should not have changed" + ); +} + +mod dropping_items { + use super::*; + use crate::inventory::{convert_to_player_slot_id, PlayerAction}; + use crate::protocol::packets::play::PlayerActionC2s; + use crate::{BlockPos, Direction}; + + #[test] + fn should_drop_item_player_action() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + let mut inventory = app + .world + .get_mut::(client) + .expect("could not find inventory"); + inventory.set_slot(36, ItemStack::new(ItemKind::IronIngot, 3, None)); + + helper.send(&PlayerActionC2s { + action: PlayerAction::DropItem, + position: BlockPos::new(0, 0, 0), + direction: Direction::Down, + sequence: VarInt(0), + }); + + app.update(); + + // Make assertions + let inventory = app + .world + .get::(client) + .expect("could not find client"); + + assert_eq!( + inventory.slot(36), + &ItemStack::new(ItemKind::IronIngot, 2, None) + ); + + let events = app + .world + .get_resource::>() + .expect("expected drop item stack events"); + + let events = events.iter_current_update_events().collect::>(); + + assert_eq!(events.len(), 1); + assert_eq!(events[0].client, client); + assert_eq!(events[0].from_slot, Some(36)); + assert_eq!( + events[0].stack, + ItemStack::new(ItemKind::IronIngot, 1, None) + ); + + let sent_packets = helper.collect_received(); + + sent_packets.assert_count::(0); + } + + #[test] + fn should_drop_item_stack_player_action() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + let mut inventory = app + .world + .get_mut::(client) + .expect("could not find inventory"); + inventory.set_slot(36, ItemStack::new(ItemKind::IronIngot, 32, None)); + + helper.send(&PlayerActionC2s { + action: PlayerAction::DropAllItems, + position: BlockPos::new(0, 0, 0), + direction: Direction::Down, + sequence: VarInt(0), + }); + + app.update(); + + // Make assertions + let held = app + .world + .get::(client) + .expect("could not find client"); + assert_eq!(held.slot(), 36); + let inventory = app + .world + .get::(client) + .expect("could not find inventory"); + assert_eq!(inventory.slot(36), &ItemStack::EMPTY); + let events = app + .world + .get_resource::>() + .expect("expected drop item stack events"); + let events = events.iter_current_update_events().collect::>(); + assert_eq!(events.len(), 1); + assert_eq!(events[0].client, client); + assert_eq!(events[0].from_slot, Some(36)); + assert_eq!( + events[0].stack, + ItemStack::new(ItemKind::IronIngot, 32, None) + ); + } + + #[test] + fn should_drop_item_stack_set_creative_mode_slot() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + app.world.entity_mut(client).insert(GameMode::Creative); + + helper.send(&CreativeInventoryActionC2s { + slot: -1, + clicked_item: ItemStack::new(ItemKind::IronIngot, 32, None), + }); + + app.update(); + + // Make assertions + let events = app + .world + .get_resource::>() + .expect("expected drop item stack events") + .iter_current_update_events() + .collect::>(); + + assert_eq!(events.len(), 1); + assert_eq!(events[0].client, client); + assert_eq!(events[0].from_slot, None); + assert_eq!( + events[0].stack, + ItemStack::new(ItemKind::IronIngot, 32, None) + ); + } + + #[test] + fn should_drop_item_stack_click_container_outside() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + let mut cursor_item = app + .world + .get_mut::(client) + .expect("could not find client"); + cursor_item.0 = ItemStack::new(ItemKind::IronIngot, 32, None); + let inv_state = app + .world + .get_mut::(client) + .expect("could not find client"); + let state_id = inv_state.state_id().0; + + helper.send(&ClickSlotC2s { + window_id: 0, + state_id: VarInt(state_id), + slot_idx: -999, + button: 0, + mode: ClickMode::Click, + slot_changes: vec![].into(), + carried_item: ItemStack::EMPTY, + }); + + app.update(); + + // Make assertions + let cursor_item = app + .world + .get::(client) + .expect("could not find client"); + + assert_eq!(cursor_item.0, ItemStack::EMPTY); + + let events = app + .world + .get_resource::>() + .expect("expected drop item stack events"); + + let events = events.iter_current_update_events().collect::>(); + + assert_eq!(events.len(), 1); + assert_eq!(events[0].client, client); + assert_eq!(events[0].from_slot, None); + assert_eq!( + events[0].stack, + ItemStack::new(ItemKind::IronIngot, 32, None) + ); + } + + #[test] + fn should_drop_item_click_container_with_dropkey_single() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + let inv_state = app + .world + .get_mut::(client) + .expect("could not find client"); + + let state_id = inv_state.state_id().0; + + let mut inventory = app + .world + .get_mut::(client) + .expect("could not find inventory"); + + inventory.set_slot(40, ItemStack::new(ItemKind::IronIngot, 32, None)); + + helper.send(&ClickSlotC2s { + window_id: 0, + slot_idx: 40, + button: 0, + mode: ClickMode::DropKey, + state_id: VarInt(state_id), + slot_changes: vec![SlotChange { + idx: 40, + stack: ItemStack::new(ItemKind::IronIngot, 31, None), + }] + .into(), + carried_item: ItemStack::EMPTY, + }); + + app.update(); + + // Make assertions + let events = app + .world + .get_resource::>() + .expect("expected drop item stack events"); + + let events = events.iter_current_update_events().collect::>(); + + assert_eq!(events.len(), 1); + assert_eq!(events[0].client, client); + assert_eq!(events[0].from_slot, Some(40)); + assert_eq!( + events[0].stack, + ItemStack::new(ItemKind::IronIngot, 1, None) + ); + } + + #[test] + fn should_drop_item_stack_click_container_with_dropkey() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + let inv_state = app + .world + .get_mut::(client) + .expect("could not find client"); + + let state_id = inv_state.state_id().0; + + let mut inventory = app + .world + .get_mut::(client) + .expect("could not find inventory"); + + inventory.set_slot(40, ItemStack::new(ItemKind::IronIngot, 32, None)); + + helper.send(&ClickSlotC2s { + window_id: 0, + slot_idx: 40, + button: 1, // pressing control + mode: ClickMode::DropKey, + state_id: VarInt(state_id), + slot_changes: vec![SlotChange { + idx: 40, + stack: ItemStack::EMPTY, + }] + .into(), + carried_item: ItemStack::EMPTY, + }); + + app.update(); + + // Make assertions + let events = app + .world + .get_resource::>() + .expect("expected drop item stack events"); + + let events = events.iter_current_update_events().collect::>(); + + assert_eq!(events.len(), 1); + assert_eq!(events[0].client, client); + assert_eq!(events[0].from_slot, Some(40)); + assert_eq!( + events[0].stack, + ItemStack::new(ItemKind::IronIngot, 32, None) + ); + } + + /// The item should be dropped successfully, if the player has an inventory + /// open and the slot id points to his inventory. + #[test] + fn should_drop_item_player_open_inventory_with_dropkey() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + // Process a tick to get past the "on join" logic. + app.update(); + + let mut inventory = app + .world + .get_mut::(client) + .expect("could not find inventory"); + + inventory.set_slot( + convert_to_player_slot_id(InventoryKind::Generic9x3, 50), + ItemStack::new(ItemKind::IronIngot, 32, None), + ); + + let _inventory_ent = set_up_open_inventory(&mut app, client); + + app.update(); + + helper.clear_received(); + + let inv_state = app + .world + .get_mut::(client) + .expect("could not find client"); + + let state_id = inv_state.state_id().0; + let window_id = inv_state.window_id(); + + helper.send(&ClickSlotC2s { + window_id, + state_id: VarInt(state_id), + slot_idx: 50, // not pressing control + button: 0, + mode: ClickMode::DropKey, + slot_changes: vec![SlotChange { + idx: 50, + stack: ItemStack::new(ItemKind::IronIngot, 31, None), + }] + .into(), + carried_item: ItemStack::EMPTY, + }); + + app.update(); + + // Make assertions + let events = app + .world + .get_resource::>() + .expect("expected drop item stack events"); + + let player_inventory = app + .world + .get::(client) + .expect("could not find inventory"); + + let events = events.iter_current_update_events().collect::>(); + + assert_eq!(events.len(), 1); + assert_eq!(events[0].client, client); + assert_eq!( + events[0].from_slot, + Some(convert_to_player_slot_id(InventoryKind::Generic9x3, 50)) + ); + + assert_eq!( + events[0].stack, + ItemStack::new(ItemKind::IronIngot, 1, None) + ); + + // Also make sure that the player inventory was updated correctly. + let expected_player_slot_id = convert_to_player_slot_id(InventoryKind::Generic9x3, 50); + assert_eq!( + player_inventory.slot(expected_player_slot_id), + &ItemStack::new(ItemKind::IronIngot, 31, None) + ); + } +} + +/// The item stack should be dropped successfully, if the player has an +/// inventory open and the slot id points to his inventory. +#[test] +fn should_drop_item_stack_player_open_inventory_with_dropkey() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + // Process a tick to get past the "on join" logic. + app.update(); + + let mut inventory = app + .world + .get_mut::(client) + .expect("could not find inventory"); + + inventory.set_slot( + convert_to_player_slot_id(InventoryKind::Generic9x3, 50), + ItemStack::new(ItemKind::IronIngot, 32, None), + ); + + let _inventory_ent = set_up_open_inventory(&mut app, client); + + app.update(); + helper.clear_received(); + + let inv_state = app + .world + .get_mut::(client) + .expect("could not find client"); + + let state_id = inv_state.state_id().0; + let window_id = inv_state.window_id(); + + helper.send(&ClickSlotC2s { + window_id, + state_id: VarInt(state_id), + slot_idx: 50, // pressing control, the whole stack is dropped + button: 1, + mode: ClickMode::DropKey, + slot_changes: vec![SlotChange { + idx: 50, + stack: ItemStack::EMPTY, + }] + .into(), + carried_item: ItemStack::EMPTY, + }); + + app.update(); + + // Make assertions + let events = app + .world + .get_resource::>() + .expect("expected drop item stack events"); + + let player_inventory = app + .world + .get::(client) + .expect("could not find inventory"); + + let events = events.iter_current_update_events().collect::>(); + + assert_eq!(events.len(), 1); + assert_eq!(events[0].client, client); + assert_eq!( + events[0].from_slot, + Some(convert_to_player_slot_id(InventoryKind::Generic9x3, 50)) + ); + assert_eq!( + events[0].stack, + ItemStack::new(ItemKind::IronIngot, 32, None) + ); + + // Also make sure that the player inventory was updated correctly. + let expected_player_slot_id = convert_to_player_slot_id(InventoryKind::Generic9x3, 50); + assert_eq!( + player_inventory.slot(expected_player_slot_id), + &ItemStack::EMPTY + ); +} + +#[test] +fn dragging_items() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + app.world.get_mut::(client).unwrap().0 = + ItemStack::new(ItemKind::Diamond, 64, None); + + let inv_state = app.world.get::(client).unwrap(); + let window_id = inv_state.window_id(); + let state_id = inv_state.state_id().0; + + let drag_packet = ClickSlotC2s { + window_id, + state_id: VarInt(state_id), + slot_idx: -999, + button: 2, + mode: ClickMode::Drag, + slot_changes: vec![ + SlotChange { + idx: 9, + stack: ItemStack::new(ItemKind::Diamond, 21, None), + }, + SlotChange { + idx: 10, + stack: ItemStack::new(ItemKind::Diamond, 21, None), + }, + SlotChange { + idx: 11, + stack: ItemStack::new(ItemKind::Diamond, 21, None), + }, + ] + .into(), + carried_item: ItemStack::new(ItemKind::Diamond, 1, None), + }; + helper.send(&drag_packet); + + app.update(); + let sent_packets = helper.collect_received(); + assert_eq!(sent_packets.0.len(), 0); + + let cursor_item = app + .world + .get::(client) + .expect("could not find client"); + + assert_eq!(cursor_item.0, ItemStack::new(ItemKind::Diamond, 1, None)); + + let inventory = app + .world + .get::(client) + .expect("could not find inventory"); + + for i in 9..12 { + assert_eq!( + inventory.slot(i), + &ItemStack::new(ItemKind::Diamond, 21, None) + ); + } +} diff --git a/vendor/valence/src/tests/layer.rs b/vendor/valence/src/tests/layer.rs new file mode 100644 index 00000000..735a0f3d --- /dev/null +++ b/vendor/valence/src/tests/layer.rs @@ -0,0 +1,467 @@ +use std::collections::BTreeSet; + +use bevy_ecs::world::EntityWorldMut; + +use crate::client::{ViewDistance, VisibleEntityLayers}; +use crate::entity::cow::CowEntityBundle; +use crate::entity::{EntityLayerId, Position}; +use crate::layer::chunk::UnloadedChunk; +use crate::layer::{ChunkLayer, EntityLayer}; +use crate::protocol::packets::play::{ + BlockEntityUpdateS2c, ChunkDataS2c, ChunkDeltaUpdateS2c, EntitiesDestroyS2c, EntitySpawnS2c, + MoveRelativeS2c, UnloadChunkS2c, +}; +use crate::protocol::Packet; +use crate::testing::ScenarioSingleClient; +use crate::{BlockState, ChunkView, Despawned, Server}; + +#[test] +fn block_create_destroy() { + let ScenarioSingleClient { + mut app, + client: _, + mut helper, + layer: layer_ent, + } = ScenarioSingleClient::new(); + + let mut layer = app.world.get_mut::(layer_ent).unwrap(); + + // Insert an empty chunk at (0, 0). + layer.insert_chunk([0, 0], UnloadedChunk::new()); + + // Wait until the next tick to start sending changes. + app.update(); + + let mut layer = app.world.get_mut::(layer_ent).unwrap(); + + // Set some blocks. + layer.set_block([1, 1, 1], BlockState::CHEST); + layer.set_block([1, 2, 1], BlockState::PLAYER_HEAD); + layer.set_block([1, 3, 1], BlockState::OAK_SIGN); + + app.update(); + + { + let recvd = helper.collect_received(); + + recvd.assert_count::(1); + recvd.assert_count::(3); + } + + let mut layer = app.world.get_mut::(layer_ent).unwrap(); + + layer.set_block([1, 1, 1], BlockState::AIR); + layer.set_block([1, 2, 1], BlockState::AIR); + layer.set_block([1, 3, 1], BlockState::AIR); + + app.update(); + + { + let recvd = helper.collect_received(); + + recvd.assert_count::(1); + recvd.assert_count::(0); + } +} + +#[test] +fn layer_chunk_view_change() { + fn view(client: &EntityWorldMut) -> ChunkView { + let chunk_pos = client.get::().unwrap().0.into(); + let view_dist = client.get::().unwrap().get(); + + ChunkView::new(chunk_pos, view_dist) + } + + let ScenarioSingleClient { + mut app, + client: client_ent, + mut helper, + layer: layer_ent, + } = ScenarioSingleClient::new(); + + let mut layer = app.world.get_mut::(layer_ent).unwrap(); + + for z in -30..30 { + for x in -30..30 { + layer.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + let mut client = app.world.entity_mut(client_ent); + + client.get_mut::().unwrap().set([8.0, 0.0, 8.0]); + client.get_mut::().unwrap().set(6); + + // Tick + app.update(); + let mut client = app.world.entity_mut(client_ent); + + let mut loaded_chunks = BTreeSet::new(); + + // Collect all chunks received on join. + for f in helper.collect_received().0 { + if f.id == ChunkDataS2c::ID { + let ChunkDataS2c { pos, .. } = f.decode::().unwrap(); + // Newly received chunk was not previously loaded. + assert!(loaded_chunks.insert(pos), "({pos:?})"); + } + } + + // Check that all the received chunks are in the client's view. + for pos in view(&client).iter() { + assert!(loaded_chunks.contains(&pos), "{pos:?}"); + } + + assert!(!loaded_chunks.is_empty()); + + // Move the client to the adjacent chunk. + client.get_mut::().unwrap().set([24.0, 0.0, 24.0]); + + // Tick + app.update(); + let client = app.world.entity_mut(client_ent); + + // For all chunks received this tick... + for f in helper.collect_received().0 { + match f.id { + ChunkDataS2c::ID => { + let ChunkDataS2c { pos, .. } = f.decode().unwrap(); + // Newly received chunk was not previously loaded. + assert!(loaded_chunks.insert(pos), "({pos:?})"); + } + UnloadChunkS2c::ID => { + let UnloadChunkS2c { pos } = f.decode().unwrap(); + // Newly removed chunk was previously loaded. + assert!(loaded_chunks.remove(&pos), "({pos:?})"); + } + _ => {} + } + } + + // Check that all chunks loaded now are within the client's view. + for pos in view(&client).iter() { + assert!(loaded_chunks.contains(&pos), "{pos:?}"); + } +} + +#[test] +fn chunk_viewer_count() { + let ScenarioSingleClient { + mut app, + client: client_ent, + mut helper, + layer: layer_ent, + } = ScenarioSingleClient::new(); + + let mut client = app.world.entity_mut(client_ent); + + client.get_mut::().unwrap().set([8.0, 64.0, 8.0]); + client.get_mut::().unwrap().set(2); + + let mut layer = app.world.get_mut::(layer_ent).unwrap(); + + // Create chunk at (0, 0). + layer.insert_chunk([0, 0], UnloadedChunk::new()); + + app.update(); // Tick. + + helper.collect_received().assert_count::(1); + + let mut layer = app.world.get_mut::(layer_ent).unwrap(); + + assert_eq!(layer.chunk_mut([0, 0]).unwrap().viewer_count(), 1); + + // Create new chunk next to the first chunk and move the client away from it on + // the same tick. + layer.insert_chunk([0, 1], UnloadedChunk::new()); + + let mut client = app.world.entity_mut(client_ent); + client.get_mut::().unwrap().set([100.0, 0.0, 0.0]); + + app.update(); // Tick. + + { + let recvd = helper.collect_received(); + + recvd.assert_count::(1); + recvd.assert_count::(2); + } + + let mut layer = app.world.get_mut::(layer_ent).unwrap(); + + // Viewer count of both chunks should be zero. + assert_eq!(layer.chunk([0, 0]).unwrap().viewer_count(), 0); + assert_eq!(layer.chunk([0, 1]).unwrap().viewer_count(), 0); + + // Create a third chunk adjacent to the others. + layer.insert_chunk([1, 0], UnloadedChunk::new()); + + // Move the client back in view of all three chunks. + let mut client = app.world.entity_mut(client_ent); + client.get_mut::().unwrap().set([8.0, 0.0, 8.0]); + + app.update(); // Tick. + + let mut layer = app.world.get_mut::(layer_ent).unwrap(); + + // All three chunks should have viewer count of one. + assert_eq!(layer.chunk_mut([0, 0]).unwrap().viewer_count(), 1); + assert_eq!(layer.chunk_mut([1, 0]).unwrap().viewer_count(), 1); + assert_eq!(layer.chunk_mut([0, 1]).unwrap().viewer_count(), 1); + + // Client should have received load packet for all three. + helper.collect_received().assert_count::(3); +} + +#[test] +fn entity_layer_switching() { + let ScenarioSingleClient { + mut app, + client: client_ent, + mut helper, + layer: l1, + } = ScenarioSingleClient::new(); + + let server = app.world.resource::(); + + let l2 = EntityLayer::new(server); + let l3 = EntityLayer::new(server); + + let l2 = app.world.spawn(l2).id(); + let _l3 = app.world.spawn(l3).id(); + + // Spawn three entities and put them all on the main layer to start. + + let e1 = CowEntityBundle { + layer: EntityLayerId(l1), + ..Default::default() + }; + + let e2 = CowEntityBundle { + layer: EntityLayerId(l1), + ..Default::default() + }; + + let e3 = CowEntityBundle { + layer: EntityLayerId(l1), + ..Default::default() + }; + + let e1 = app.world.spawn(e1).id(); + let _e2 = app.world.spawn(e2).id(); + let _e3 = app.world.spawn(e3).id(); + + app.update(); // Tick. + + // Can the client see all the new entities? + helper.collect_received().assert_count::(3); + + // Move e1 to l2 and add l2 to the visible layers set. + app.world.get_mut::(e1).unwrap().0 = l2; + app.world + .get_mut::(client_ent) + .unwrap() + .0 + .insert(l2); + + app.update(); // Tick. + + { + let recvd = helper.collect_received(); + + // Client received packets to despawn and then spawn the entity in the new + // layer. (this could be optimized away in the future) + recvd.assert_count::(1); + recvd.assert_count::(1); + recvd.assert_order::<(EntitiesDestroyS2c, EntitySpawnS2c)>(); + } + + // Remove the original layer from the visible layer set. + assert!(app + .world + .get_mut::(client_ent) + .unwrap() + .0 + .remove(&l1)); + + app.update(); // Tick. + + // Both entities on the original layer should be removed. + { + let recvd = helper.collect_received(); + recvd.assert_count::(1); + } + + // Despawn l2. + app.world.entity_mut(l2).insert(Despawned); + + app.update(); // Tick. + + // e1 should be removed. + helper + .collect_received() + .assert_count::(1); + + let mut visible_entity_layers = app + .world + .get_mut::(client_ent) + .unwrap(); + + // l2 should be automatically removed from the visible layers set. + assert!(!visible_entity_layers.0.contains(&e1)); + + // Add back the original layer. + assert!(visible_entity_layers.0.insert(l1)); + + app.update(); // Tick. + + // e2 and e3 should be spawned. + + { + let recvd = helper.collect_received(); + + recvd.assert_count::(2); + } +} + +#[test] +fn chunk_entity_spawn_despawn() { + let ScenarioSingleClient { + mut app, + client: client_ent, + mut helper, + layer: layer_ent, + } = ScenarioSingleClient::new(); + + let mut layer = app.world.get_mut::(layer_ent).unwrap(); + + // Insert an empty chunk at (0, 0). + layer.insert_chunk([0, 0], UnloadedChunk::new()); + + // Put an entity in the new chunk. + let cow_ent = app + .world + .spawn(CowEntityBundle { + position: Position::new([8.0, 0.0, 8.0]), + layer: EntityLayerId(layer_ent), + ..Default::default() + }) + .id(); + + app.update(); + + // Client is in view of the chunk, so they should receive exactly one chunk + // spawn packet and entity spawn packet. + { + let recvd = helper.collect_received(); + + recvd.assert_count::(1); + recvd.assert_count::(1); + recvd.assert_count::(0); + recvd.assert_count::(0); + } + + // Move the entity. Client should receive entity move packet. + app.world.get_mut::(cow_ent).unwrap().0.x += 0.1; + + app.update(); + + helper.collect_received().assert_count::(1); + + // Despawning the chunk should delete the chunk and not the entity contained + // within. + let mut layer = app.world.get_mut::(layer_ent).unwrap(); + + layer.remove_chunk([0, 0]).unwrap(); + + app.update(); + + { + let recvd = helper.collect_received(); + + recvd.assert_count::(1); + recvd.assert_count::(0); + recvd.assert_count::(0); + recvd.assert_count::(0); + } + + // Placing the chunk back should respawn the chunk and not the entity. + + let mut layer = app.world.get_mut::(layer_ent).unwrap(); + + assert!(layer.insert_chunk([0, 0], UnloadedChunk::new()).is_none()); + + app.update(); + + { + let recvd = helper.collect_received(); + + recvd.assert_count::(1); + recvd.assert_count::(0); + recvd.assert_count::(0); + recvd.assert_count::(0); + } + + // Move player and entity away from the chunk on the same tick. + + app.world.get_mut::(client_ent).unwrap().0.x = 1000.0; + app.world.get_mut::(cow_ent).unwrap().0.x = -1000.0; + + app.update(); + + { + let recvd = helper.collect_received(); + + recvd.assert_count::(1); + recvd.assert_count::(1); + recvd.assert_count::(0); + recvd.assert_count::(0); + } + + // Put the client and entity back on the same tick. + + app.world + .get_mut::(client_ent) + .unwrap() + .set([8.0, 0.0, 8.0]); + app.world + .get_mut::(cow_ent) + .unwrap() + .set([8.0, 0.0, 8.0]); + + app.update(); + + { + let recvd = helper.collect_received(); + + recvd.assert_count::(1); + recvd.assert_count::(1); + recvd.assert_count::(0); + recvd.assert_count::(0); + } + + // Adding and removing a chunk on the same tick should have no effect on + // the client. + + let mut layer = app.world.get_mut::(layer_ent).unwrap(); + + layer.insert_chunk([0, 1], UnloadedChunk::new()); + layer.remove_chunk([0, 1]).unwrap(); + + app.world + .get_mut::(cow_ent) + .unwrap() + .set([24.0, 0.0, 24.0]); + + app.update(); + + { + let recvd = helper.collect_received(); + + recvd.assert_count::(0); + recvd.assert_count::(0); + recvd.assert_count::(0); + recvd.assert_count::(0); + } +} diff --git a/vendor/valence/src/tests/player_list.rs b/vendor/valence/src/tests/player_list.rs new file mode 100644 index 00000000..2a3e4954 --- /dev/null +++ b/vendor/valence/src/tests/player_list.rs @@ -0,0 +1,66 @@ +use crate::layer::chunk::UnloadedChunk; +use crate::protocol::packets::play::{PlayerListS2c, PlayerSpawnS2c}; +use crate::testing::{create_mock_client, ScenarioSingleClient}; +use crate::ChunkLayer; + +#[test] +fn player_list_arrives_before_player_spawn() { + let ScenarioSingleClient { + mut app, + client: _, + helper: mut client_helper_1, + layer: layer_ent, + } = ScenarioSingleClient::new(); + + let mut layer = app.world.get_mut::(layer_ent).unwrap(); + + for z in -5..5 { + for x in -5..5 { + layer.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + app.update(); + + { + let recvd = client_helper_1.collect_received(); + recvd.assert_count::(1); + recvd.assert_count::(0); + recvd.assert_order::<(PlayerListS2c, PlayerSpawnS2c)>(); + + let pkt = recvd.first::(); + assert!(pkt.actions.add_player()); + assert_eq!(pkt.entries.len(), 1); + } + + let (mut client_2, mut client_helper_2) = create_mock_client("test_2"); + client_2.player.layer.0 = layer_ent; + client_2.visible_chunk_layer.0 = layer_ent; + client_2.visible_entity_layers.0.insert(layer_ent); + + app.world.spawn(client_2); + + app.update(); + + { + let recvd = client_helper_1.collect_received(); + recvd.assert_count::(1); + recvd.assert_count::(1); + recvd.assert_order::<(PlayerListS2c, PlayerSpawnS2c)>(); + + let pkt = recvd.first::(); + assert!(pkt.actions.add_player()); + assert_eq!(pkt.entries.len(), 1); + } + + { + let recvd = client_helper_2.collect_received(); + recvd.assert_count::(1); + recvd.assert_count::(1); + recvd.assert_order::<(PlayerListS2c, PlayerSpawnS2c)>(); + + let pkt = recvd.first::(); + assert!(pkt.actions.add_player()); + assert_eq!(pkt.entries.len(), 2); + } +} diff --git a/vendor/valence/src/tests/potions.rs b/vendor/valence/src/tests/potions.rs new file mode 100644 index 00000000..fe0a34a1 --- /dev/null +++ b/vendor/valence/src/tests/potions.rs @@ -0,0 +1,71 @@ +use valence_server::entity::active_status_effects::{ActiveStatusEffect, ActiveStatusEffects}; +use valence_server::protocol::packets::play::{EntityStatusEffectS2c, RemoveEntityStatusEffectS2c}; +use valence_server::protocol::status_effects::StatusEffect; +use valence_server::protocol::VarInt; + +use crate::testing::ScenarioSingleClient; + +#[test] +fn test_status_effects_packets() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + // Add a potion effect to the client. + let mut effects = app + .world + .get_mut::(client) + .expect("Client should have status effects"); + effects.apply( + ActiveStatusEffect::from_effect(StatusEffect::BadOmen) + .with_duration(100) + .with_amplifier(1), + ); + + // Update the server. + app.update(); + + // Make assertions + let sent_packets = helper.collect_received(); + + sent_packets.assert_count::(1); + + let packet = sent_packets.first::(); + + assert_eq!(packet.entity_id, VarInt(0)); // Client entity ID is always 0 + assert_eq!(packet.effect_id, VarInt(31)); // Bad Omen + assert_eq!(packet.amplifier, 1); + assert_eq!(packet.duration, VarInt(100)); + + // Clear the potion effect + for _ in 0..99 { + app.update(); + } + + helper.clear_received(); + app.update(); + + // Make assertions + let effects = app + .world + .get::(client) + .expect("Client should have status effects"); + + assert_eq!(effects.get_current_effect(StatusEffect::BadOmen), None); + + let sent_packets = helper.collect_received(); + + sent_packets.assert_count::(1); + + let packet = sent_packets.first::(); + + assert_eq!(packet.entity_id, VarInt(0)); // Client entity ID is always 0 + assert_eq!(packet.effect_id, VarInt(31)); // Bad Omen +} diff --git a/vendor/valence/src/tests/scoreboard.rs b/vendor/valence/src/tests/scoreboard.rs new file mode 100644 index 00000000..867af687 --- /dev/null +++ b/vendor/valence/src/tests/scoreboard.rs @@ -0,0 +1,192 @@ +use valence_scoreboard::*; + +use crate::client::VisibleEntityLayers; +use crate::entity::EntityLayerId; +use crate::layer::EntityLayer; +use crate::protocol::packets::play::{ + ScoreboardDisplayS2c, ScoreboardObjectiveUpdateS2c, ScoreboardPlayerUpdateS2c, +}; +use crate::testing::ScenarioSingleClient; +use crate::text::IntoText; +use crate::Server; + +#[test] +fn show_scoreboard_when_added_to_layer() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + // Add a new entity layer for the objective. + let server = app.world.get_resource::().unwrap(); + let obj_layer = app.world.spawn(EntityLayer::new(server)).id(); + app.world + .entity_mut(client) + .get_mut::() + .unwrap() + .0 + .insert(obj_layer); + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + // Spawn the objective. + app.world.spawn(ObjectiveBundle { + name: Objective::new("foo"), + display: ObjectiveDisplay("Foo".into_text()), + scores: ObjectiveScores::new(), + layer: EntityLayerId(obj_layer), + ..Default::default() + }); + + app.update(); + + // Check that the objective was sent to the client. + { + let recvd = helper.collect_received(); + + recvd.assert_count::(1); + recvd.assert_count::(1); + recvd.assert_order::<(ScoreboardObjectiveUpdateS2c, ScoreboardDisplayS2c)>(); + } +} + +#[test] +fn show_scoreboard_when_client_join() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + // Add a new entity layer for the objective. + let server = app.world.get_resource::().unwrap(); + let obj_layer = app.world.spawn(EntityLayer::new(server)).id(); + app.world + .entity_mut(client) + .get_mut::() + .unwrap() + .0 + .insert(obj_layer); + + // Spawn the objective. + app.world.spawn(ObjectiveBundle { + name: Objective::new("foo"), + display: ObjectiveDisplay("Foo".into_text()), + scores: ObjectiveScores::new(), + layer: EntityLayerId(obj_layer), + ..Default::default() + }); + + // Process a tick to get past the "on join" logic. + app.update(); + + // Check that the objective was sent to the client. + { + let recvd = helper.collect_received(); + + recvd.assert_count::(1); + recvd.assert_count::(1); + recvd.assert_order::<(ScoreboardObjectiveUpdateS2c, ScoreboardDisplayS2c)>(); + } +} + +#[test] +fn should_update_score() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + // Add a new entity layer for the objective. + let server = app.world.get_resource::().unwrap(); + let obj_layer = app.world.spawn(EntityLayer::new(server)).id(); + app.world + .entity_mut(client) + .get_mut::() + .unwrap() + .0 + .insert(obj_layer); + + // Spawn the objective. + let obj = app + .world + .spawn(ObjectiveBundle { + name: Objective::new("foo"), + display: ObjectiveDisplay("Foo".into_text()), + scores: ObjectiveScores::with_map([("foo".to_owned(), 0)]), + layer: EntityLayerId(obj_layer), + ..Default::default() + }) + .id(); + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + let mut scores = app.world.get_mut::(obj).unwrap(); + scores.insert("foo", 3); + + app.update(); + + // Check that the objective was sent to the client. + { + let recvd = helper.collect_received(); + + recvd.assert_count::(1); + } +} + +#[test] +fn should_only_update_score_diff() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = ScenarioSingleClient::new(); + + // Add a new entity layer for the objective. + let server = app.world.get_resource::().unwrap(); + let obj_layer = app.world.spawn(EntityLayer::new(server)).id(); + app.world + .entity_mut(client) + .get_mut::() + .unwrap() + .0 + .insert(obj_layer); + + // Spawn the objective. + let obj = app + .world + .spawn(ObjectiveBundle { + name: Objective::new("foo"), + display: ObjectiveDisplay("Foo".into_text()), + scores: ObjectiveScores::with_map([("foo".to_owned(), 0), ("bar".to_owned(), 0)]), + layer: EntityLayerId(obj_layer), + ..Default::default() + }) + .id(); + + // Process a tick to get past the "on join" logic. + app.update(); + helper.clear_received(); + + let mut scores = app.world.get_mut::(obj).unwrap(); + scores.insert("foo", 3); + + app.update(); + + // Check that the objective was sent to the client. + { + let recvd = helper.collect_received(); + + recvd.assert_count::(1); + } +} diff --git a/vendor/valence/src/tests/weather.rs b/vendor/valence/src/tests/weather.rs new file mode 100644 index 00000000..2a353754 --- /dev/null +++ b/vendor/valence/src/tests/weather.rs @@ -0,0 +1,164 @@ +use crate::protocol::packets::play::GameStateChangeS2c; +use crate::testing::*; +use crate::weather::{Rain, Thunder, WeatherBundle}; + +#[test] +fn test_client_initialization_on_join() { + let ScenarioSingleClient { + mut app, + client: _, + mut helper, + layer: _, + } = prepare(true); + + app.update(); + + // Check if two game state change packets were sent, one for rain and one for + // thunder + let frames = helper.collect_received(); + frames.assert_count::(2); +} + +#[test] +fn test_chunk_layer_initialization_on_join() { + let ScenarioSingleClient { + mut app, + client: _, + mut helper, + layer: _, + } = prepare(false); + + app.update(); + + // Check if two game state change packets were sent, one for rain and one for + // thunder + let frames = helper.collect_received(); + frames.assert_count::(2); +} + +#[test] +fn test_client_rain_change() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = prepare(true); + + app.update(); + + helper.clear_received(); + + // Change the rain value + let mut rain = app.world.get_mut::(client).unwrap(); + rain.0 = 1.0; + + app.update(); + + // Check if a game state change packet was sent + let frames = helper.collect_received(); + frames.assert_count::(1); +} + +#[test] +fn test_client_thunder_change() { + let ScenarioSingleClient { + mut app, + client, + mut helper, + layer: _, + } = prepare(true); + + app.update(); + + helper.clear_received(); + + // Change the thunder value + let mut thunder = app.world.get_mut::(client).unwrap(); + thunder.0 = 1.0; + + app.update(); + + // Check if a game state change packet was sent + let frames = helper.collect_received(); + frames.assert_count::(1); +} + +#[test] +fn test_chunk_layer_rain_change() { + let ScenarioSingleClient { + mut app, + client: _, + mut helper, + layer, + } = prepare(false); + + app.update(); + + helper.clear_received(); + + // Change the rain value + let mut rain = app.world.get_mut::(layer).unwrap(); + rain.0 = 1.0; + + app.update(); + + // Check if a game state change packet was sent + let frames = helper.collect_received(); + frames.assert_count::(1); +} + +#[test] +fn test_chunk_layer_thunder_change() { + let ScenarioSingleClient { + mut app, + client: _, + mut helper, + layer, + } = prepare(false); + + app.update(); + + helper.clear_received(); + + // Change the thunder value + let mut thunder = app.world.get_mut::(layer).unwrap(); + thunder.0 = 1.0; + + app.update(); + + // Check if a game state change packet was sent + let frames = helper.collect_received(); + frames.assert_count::(1); +} + +fn prepare(client_weather: bool) -> ScenarioSingleClient { + let mut s = ScenarioSingleClient::new(); + + // Process a tick to get past the "on join" logic. + s.app.update(); + + // Add weather to either the client or the chunk layer depending on the + // parameter + if client_weather { + add_weather_to_client(&mut s); + } else { + add_weather_to_chunk_layer(&mut s); + } + + s +} + +fn add_weather_to_client(s: &mut ScenarioSingleClient) { + s.app.world.entity_mut(s.client).insert(WeatherBundle { + rain: Rain(0.5), + thunder: Thunder(0.5), + }); +} + +fn add_weather_to_chunk_layer(s: &mut ScenarioSingleClient) { + s.app.world.entity_mut(s.layer).insert(WeatherBundle { + rain: Rain(0.5), + thunder: Thunder(0.5), + }); +} diff --git a/vendor/valence/src/tests/world_border.rs b/vendor/valence/src/tests/world_border.rs new file mode 100644 index 00000000..84fdc0de --- /dev/null +++ b/vendor/valence/src/tests/world_border.rs @@ -0,0 +1,200 @@ +use crate::protocol::packets::play::{ + WorldBorderCenterChangedS2c, WorldBorderInitializeS2c, WorldBorderInterpolateSizeS2c, + WorldBorderSizeChangedS2c, WorldBorderWarningBlocksChangedS2c, + WorldBorderWarningTimeChangedS2c, +}; +use crate::testing::*; +use crate::world_border::{ + WorldBorderBundle, WorldBorderCenter, WorldBorderLerp, WorldBorderPortalTpBoundary, + WorldBorderWarnBlocks, WorldBorderWarnTime, +}; + +#[test] +fn test_initialize_on_join() { + let ScenarioSingleClient { + mut app, + client: _, + mut helper, + layer: _, + } = prepare(); + + app.update(); + + // Check if a world border initialize packet was sent + let frames = helper.collect_received(); + frames.assert_count::(1); +} + +#[test] +fn test_center_change() { + let ScenarioSingleClient { + mut app, + client: _, + mut helper, + layer, + } = prepare(); + + app.update(); + + helper.clear_received(); + + // Change the center + let mut center = app.world.get_mut::(layer).unwrap(); + center.x = 10.0; + + app.update(); + + // Check if a world border center changed packet was sent + let frames = helper.collect_received(); + frames.assert_count::(1); +} + +#[test] +fn test_diameter_change() { + let ScenarioSingleClient { + mut app, + client: _, + mut helper, + layer, + } = prepare(); + + app.update(); + + helper.clear_received(); + + // Change the diameter + let mut lerp = app.world.get_mut::(layer).unwrap(); + lerp.target_diameter = 20.0; + + app.update(); + + // Check if a world border size changed packet was sent + let frames = helper.collect_received(); + frames.assert_count::(1); +} + +#[test] +fn test_interpolation() { + let ScenarioSingleClient { + mut app, + client: _, + mut helper, + layer, + } = prepare(); + + app.update(); + + helper.clear_received(); + + // Change the diameter and start interpolation to it over 20 ticks + let mut lerp = app.world.get_mut::(layer).unwrap(); + lerp.target_diameter = 20.0; + lerp.remaining_ticks = 20; + + // Tick 20 times + for _ in 0..20 { + app.update(); + } + + // Check if a world border interpolate size packet was sent + let frames = helper.collect_received(); + frames.assert_count::(1); + + // Check if the interpolation is finished + let lerp = app.world.get_mut::(layer).unwrap(); + assert_eq!(lerp.current_diameter, 20.0); + assert_eq!(lerp.remaining_ticks, 0); +} + +#[test] +fn test_warning_blocks_change() { + let ScenarioSingleClient { + mut app, + client: _, + mut helper, + layer, + } = prepare(); + + app.update(); + + helper.clear_received(); + + // Change the warning blocks + let mut warn_blocks = app.world.get_mut::(layer).unwrap(); + warn_blocks.0 = 10; + + app.update(); + + // Check if a world border warning blocks changed packet was sent + let frames = helper.collect_received(); + frames.assert_count::(1); +} + +#[test] +fn test_warning_time_change() { + let ScenarioSingleClient { + mut app, + client: _, + mut helper, + layer, + } = prepare(); + + app.update(); + + helper.clear_received(); + + // Change the warning time + let mut warn_time = app.world.get_mut::(layer).unwrap(); + warn_time.0 = 10; + + app.update(); + + // Check if a world border warning time changed packet was sent + let frames = helper.collect_received(); + frames.assert_count::(1); +} + +#[test] +fn test_portal_tp_boundary_change() { + let ScenarioSingleClient { + mut app, + client: _, + mut helper, + layer, + } = prepare(); + + app.update(); + + helper.clear_received(); + + // Change the portal tp boundary + let mut portal_tp_boundary = app + .world + .get_mut::(layer) + .unwrap(); + portal_tp_boundary.0 = 10; + + app.update(); + + // Check if a world border initialize packet was sent + let frames = helper.collect_received(); + frames.assert_count::(1); +} + +fn prepare() -> ScenarioSingleClient { + let mut s = ScenarioSingleClient::new(); + + // Process a tick to get past the "on join" logic. + s.app.update(); + + // Attach the world border bundle to the chunk layer + s.app.world.entity_mut(s.layer).insert(WorldBorderBundle { + lerp: WorldBorderLerp { + target_diameter: 10.0, + ..Default::default() + }, + ..Default::default() + }); + + s +} diff --git a/vendor/valence/tools/dump_schedule/Cargo.toml b/vendor/valence/tools/dump_schedule/Cargo.toml new file mode 100644 index 00000000..dc729ebc --- /dev/null +++ b/vendor/valence/tools/dump_schedule/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "dump_schedule" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true +publish = false + +[dependencies] +bevy_mod_debugdump.workspace = true +clap.workspace = true +valence.workspace = true diff --git a/vendor/valence/tools/dump_schedule/README.md b/vendor/valence/tools/dump_schedule/README.md new file mode 100644 index 00000000..d4e3a451 --- /dev/null +++ b/vendor/valence/tools/dump_schedule/README.md @@ -0,0 +1,7 @@ +# dump_schedule + +A simple debugging utility for visualizing Valence's schedule graph. Generates a SVG file. + +1. Ensure that [Graphviz](https://graphviz.org/) is installed and the `dot` and `tred` commands are available. +2. Run the program with `cargo r -p dump_schedule -- PostUpdate` +3. Open the generated `graph.svg` in your browser or other program, e.g. `chromium graph.svg`. diff --git a/vendor/valence/tools/dump_schedule/src/main.rs b/vendor/valence/tools/dump_schedule/src/main.rs new file mode 100644 index 00000000..85420a8f --- /dev/null +++ b/vendor/valence/tools/dump_schedule/src/main.rs @@ -0,0 +1,110 @@ +#![doc = include_str!("../README.md")] +#![deny( + rustdoc::broken_intra_doc_links, + rustdoc::private_intra_doc_links, + rustdoc::missing_crate_level_docs, + rustdoc::invalid_codeblock_attributes, + rustdoc::invalid_rust_codeblocks, + rustdoc::bare_urls, + rustdoc::invalid_html_tags +)] +#![warn( + trivial_casts, + trivial_numeric_casts, + unused_lifetimes, + unused_import_braces, + clippy::dbg_macro +)] + +use std::io; +use std::io::Write; +use std::path::PathBuf; +use std::process::{Command, Stdio}; + +use clap::Parser; +use valence::prelude::*; + +#[derive(Parser)] +#[command(author, version, about)] +struct Cli { + /// Name of the schedule to dump. If absent, the list of available + /// schedules is printed to stdout. + schedule: Option, + /// Output SVG file path. + #[clap(short, long, default_value = "graph.svg")] + output: PathBuf, + /// Disables transitive reduction of the output schedule graph. + #[clap(short = 't', long)] + no_tred: bool, +} + +fn main() -> io::Result<()> { + let cli = Cli::parse(); + + let mut app = App::new(); + + app.add_plugins(DefaultPlugins); + + let schedules = app.world.resource::(); + + let Some(sched_name) = cli.schedule else { + print_available_schedules(schedules); + return Ok(()); + }; + + let Some((_, schedule)) = schedules + .iter() + .find(|(label, _)| format!("{label:?}") == sched_name) + else { + eprintln!("Unknown schedule \"{sched_name}\""); + print_available_schedules(schedules); + std::process::exit(1) + }; + + let dot_graph = bevy_mod_debugdump::schedule_graph::schedule_graph_dot( + schedule, + &app.world, + &bevy_mod_debugdump::schedule_graph::Settings { + ambiguity_enable: false, + ..Default::default() + }, + ); + + let mut dot_command = Command::new("dot"); + dot_command.arg("-Tsvg").arg("-o").arg(cli.output); + + if cli.no_tred { + let mut dot_child = dot_command.stdin(Stdio::piped()).spawn()?; + + dot_child + .stdin + .as_mut() + .unwrap() + .write_all(dot_graph.as_bytes())?; + + dot_child.wait_with_output()?; + } else { + let tred_child = Command::new("tred") + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .spawn()?; + + let dot_child = dot_command.stdin(tred_child.stdout.unwrap()).spawn()?; + + tred_child.stdin.unwrap().write_all(dot_graph.as_bytes())?; + + dot_child.wait_with_output()?; + }; + + Ok(()) +} + +fn print_available_schedules(schedules: &Schedules) { + eprintln!("==== Available Schedules ===="); + + for (label, _) in schedules.iter() { + println!("{label:?}"); + } + + eprintln!("\nSee `--help` for more information."); +} diff --git a/vendor/valence/tools/packet_inspector/Cargo.toml b/vendor/valence/tools/packet_inspector/Cargo.toml new file mode 100644 index 00000000..d2bf7b1b --- /dev/null +++ b/vendor/valence/tools/packet_inspector/Cargo.toml @@ -0,0 +1,41 @@ +[package] +name = "packet_inspector" +description = "A simple Minecraft proxy for inspecting packets." +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true +publish = false + +[dependencies] +valence_protocol = { workspace = true, features = ["compression"] } +anyhow.workspace = true +thiserror.workspace = true +bytes.workspace = true +flate2.workspace = true +flume.workspace = true +tokio = { workspace = true, features = ["full"] } +tracing.workspace = true +time = { workspace = true, features = ["local-offset"] } +image.workspace = true +egui.workspace = true +eframe = { workspace = true, features = [ + "persistence", + "wgpu", +] } +egui_dock = { workspace = true, features = ["serde"] } +itertools.workspace = true +syntect = { workspace = true, default-features = false, features = [ + "default-fancy", +] } +serde = { workspace = true, features = ["derive"] } + +[build-dependencies] +syn.workspace = true +anyhow.workspace = true +proc-macro2.workspace = true +quote.workspace = true +serde = { workspace = true, features = ["derive"] } +serde_json.workspace = true +valence_build_utils.workspace = true diff --git a/vendor/valence/tools/packet_inspector/README.md b/vendor/valence/tools/packet_inspector/README.md new file mode 100644 index 00000000..4cff51ef --- /dev/null +++ b/vendor/valence/tools/packet_inspector/README.md @@ -0,0 +1,66 @@ +# Packet Inspector + +![packet inspector screenshot](https://raw.githubusercontent.com/valence-rs/valence/main/assets/packet-inspector.png) + +The packet inspector is a Minecraft proxy for viewing the contents of packets as +they are sent/received. It uses Valence's protocol facilities to display packet +contents. This was made for three purposes: + +- Check that packets between Valence and client are matching your expectations. +- Check that packets between vanilla server and client are parsed correctly by + Valence. +- Understand how the protocol works between the vanilla server and client. + +# Usage + +Firstly, we should have a server running that we're going to be +proxying/inspecting. + +```sh +cargo r -r --example game_of_life +``` + +Next up, we need to run the proxy server, To launch in a GUI environment, simply run `packet_inspector`. + +```sh +cargo r -r -p packet_inspector +``` + +Then click the "Start Listening" button in the top left of the UI. + +The client can now connect to `localhost:25566`. You should see packets streaming in on the GUI. + +## Quick start with Vanilla Server via Docker + +Start the server + +```sh +docker run -e EULA=TRUE -e ONLINE_MODE=false -e ANNOUNCE_PLAYER_ACHIEVEMENTS=false -e GENERATE_STRUCTURES=false -e SPAWN_ANIMALS=false -e SPAWN_MONSTERS=false -e SPAWN_NPCS=false -e SPAWN_PROTECTION=0 -e VIEW_DISTANCE=16 -e MODE=creative -e LEVEL_TYPE=flat -e RCON_CMDS_STARTUP="gamerule doWeatherCycle false" -d -p 25565:25565 --name mc itzg/minecraft-server +``` + +View server logs + +```sh +docker logs -f mc +``` + +Server Rcon + +```sh +docker exec -i mc rcon-cli +``` + +In a separate terminal, start the packet inspector. + +```sh +cargo r -r -p packet_inspector --no-default-features --features cli -- 127.0.0.1:25566 127.0.0.1:25565 +``` + +Open Minecraft and connect to `localhost:25566`. + +Clean up + +``` +docker stop mc +docker rm mc +``` diff --git a/vendor/valence/tools/packet_inspector/build.rs b/vendor/valence/tools/packet_inspector/build.rs new file mode 100644 index 00000000..8e089b7f --- /dev/null +++ b/vendor/valence/tools/packet_inspector/build.rs @@ -0,0 +1,213 @@ +use std::collections::HashMap; + +use proc_macro2::TokenStream; +use quote::quote; +use serde::Deserialize; +use valence_build_utils::write_generated_file; + +#[derive(Deserialize)] +struct Packet { + name: String, + side: String, + state: String, + id: i32, +} + +pub fn main() -> anyhow::Result<()> { + let packets: Vec = serde_json::from_str(include_str!("extracted/packets.json"))?; + + write_packets(&packets)?; + write_transformer(&packets)?; + + Ok(()) +} + +fn write_packets(packets: &Vec) -> anyhow::Result<()> { + let mut consts = TokenStream::new(); + + let len = packets.len(); + + let mut p: Vec = Vec::new(); + + for packet in packets { + let name = packet.name.strip_suffix("Packet").unwrap_or(&packet.name); + // lowercase the last character of name + let name = { + let mut chars = name.chars(); + let last_char = chars.next_back().unwrap(); + let last_char = last_char.to_lowercase().to_string(); + let mut name = chars.collect::(); + name.push_str(&last_char); + name + }; + + // if the packet is clientbound, but the name does not ends with S2c, add it + let name = if packet.side == "clientbound" && !name.ends_with("S2c") { + format!("{}S2c", name) + } else { + name + }; + + // same for serverbound + let name = if packet.side == "serverbound" && !name.ends_with("C2s") { + format!("{}C2s", name) + } else { + name + }; + + let id = packet.id; + let side = match packet.side.as_str() { + "clientbound" => quote! { valence_protocol::PacketSide::Clientbound }, + "serverbound" => quote! { valence_protocol::PacketSide::Serverbound }, + _ => unreachable!(), + }; + + let state = match packet.state.as_str() { + "handshaking" => quote! { valence_protocol::PacketState::Handshaking }, + "status" => quote! { valence_protocol::PacketState::Status }, + "login" => quote! { valence_protocol::PacketState::Login }, + "play" => quote! { valence_protocol::PacketState::Play }, + _ => unreachable!(), + }; + + // const STD_PACKETS = + // [PacketSide::Client(PacketState::Handshaking(Packet{..})), ..]; + p.push(quote! { + crate::packet_registry::Packet { + id: #id, + side: #side, + state: #state, + timestamp: None, + name: #name, + data: None, + } + }); + } + + consts.extend([quote! { + pub const STD_PACKETS: [crate::packet_registry::Packet; #len] = [ + #(#p),* + ]; + }]); + + write_generated_file(consts, "packets.rs")?; + + Ok(()) +} + +fn write_transformer(packets: &[Packet]) -> anyhow::Result<()> { + // HashMap>> + let grouped_packets = HashMap::>>::new(); + + let mut grouped_packets = packets.iter().fold(grouped_packets, |mut acc, packet| { + let side = match packet.side.as_str() { + "serverbound" => "Serverbound".to_string(), + "clientbound" => "Clientbound".to_string(), + _ => panic!("Invalid side"), + }; + + let state = match packet.state.as_str() { + "handshaking" => "Handshaking".to_string(), + "status" => "Status".to_string(), + "login" => "Login".to_string(), + "play" => "Play".to_string(), + _ => panic!("Invalid state"), + }; + + let name = packet + .name + .strip_suffix("Packet") + .unwrap_or(&packet.name) + .to_string(); + + // lowercase the last character of name + let name = { + let mut chars = name.chars(); + let last_char = chars.next_back().unwrap(); + let last_char = last_char.to_lowercase().to_string(); + let mut name = chars.collect::(); + name.push_str(&last_char); + name + }; + + // if the packet is clientbound, but the name does not ends with S2c, add it + let name = if side == "Clientbound" && !name.ends_with("S2c") { + format!("{}S2c", name) + } else { + name + }; + + // same for serverbound + let name = if side == "Serverbound" && !name.ends_with("C2s") { + format!("{}C2s", name) + } else { + name + }; + + let state_map = acc.entry(side).or_default(); + let id_map = state_map.entry(state).or_default(); + id_map.push(name); + + acc + }); + + let mut generated = TokenStream::new(); + + for (side, state_map) in grouped_packets.iter_mut() { + let mut side_arms = TokenStream::new(); + for (state, id_map) in state_map.iter_mut() { + let mut match_arms = TokenStream::new(); + + for name in id_map.iter_mut() { + let name = syn::parse_str::(name).unwrap(); + + match_arms.extend(quote! { + #name::ID => { + Ok(format!("{:#?}", #name::decode(&mut data))) + } + }); + } + + let state = syn::parse_str::(state).unwrap(); + + side_arms.extend(quote! { + valence_protocol::PacketState::#state => match packet.id { + #match_arms + _ => Ok(NOT_AVAILABLE.to_string()), + }, + }); + } + + if side == "Clientbound" { + side_arms.extend(quote! { + _ => Ok(NOT_AVAILABLE.to_string()), + }); + } + + let side = syn::parse_str::(side).unwrap(); + + generated.extend(quote! { + valence_protocol::PacketSide::#side => match packet.state { + #side_arms + }, + }); + } + + // wrap generated in a function definition + let generated = quote! { + const NOT_AVAILABLE: &str = "Not yet implemented"; + + pub fn packet_to_string(packet: &ProxyPacket) -> Result> { + let bytes = packet.data.as_ref().unwrap(); + let mut data = &bytes.clone()[..]; + + match packet.side { + #generated + } + } + }; + + write_generated_file(generated, "packet_to_string.rs")?; + + Ok(()) +} diff --git a/vendor/valence/tools/packet_inspector/extracted/packets.json b/vendor/valence/tools/packet_inspector/extracted/packets.json new file mode 100644 index 00000000..b9d6c757 --- /dev/null +++ b/vendor/valence/tools/packet_inspector/extracted/packets.json @@ -0,0 +1,1052 @@ +[ + { + "name": "HandshakeC2SPacket", + "side": "serverbound", + "state": "handshaking", + "id": 0 + }, + { + "name": "TeleportConfirmC2SPacket", + "side": "serverbound", + "state": "play", + "id": 0 + }, + { + "name": "QueryBlockNbtC2SPacket", + "side": "serverbound", + "state": "play", + "id": 1 + }, + { + "name": "UpdateDifficultyC2SPacket", + "side": "serverbound", + "state": "play", + "id": 2 + }, + { + "name": "MessageAcknowledgmentC2SPacket", + "side": "serverbound", + "state": "play", + "id": 3 + }, + { + "name": "CommandExecutionC2SPacket", + "side": "serverbound", + "state": "play", + "id": 4 + }, + { + "name": "ChatMessageC2SPacket", + "side": "serverbound", + "state": "play", + "id": 5 + }, + { + "name": "PlayerSessionC2SPacket", + "side": "serverbound", + "state": "play", + "id": 6 + }, + { + "name": "ClientStatusC2SPacket", + "side": "serverbound", + "state": "play", + "id": 7 + }, + { + "name": "ClientSettingsC2SPacket", + "side": "serverbound", + "state": "play", + "id": 8 + }, + { + "name": "RequestCommandCompletionsC2SPacket", + "side": "serverbound", + "state": "play", + "id": 9 + }, + { + "name": "ButtonClickC2SPacket", + "side": "serverbound", + "state": "play", + "id": 10 + }, + { + "name": "ClickSlotC2SPacket", + "side": "serverbound", + "state": "play", + "id": 11 + }, + { + "name": "CloseHandledScreenC2SPacket", + "side": "serverbound", + "state": "play", + "id": 12 + }, + { + "name": "CustomPayloadC2SPacket", + "side": "serverbound", + "state": "play", + "id": 13 + }, + { + "name": "BookUpdateC2SPacket", + "side": "serverbound", + "state": "play", + "id": 14 + }, + { + "name": "QueryEntityNbtC2SPacket", + "side": "serverbound", + "state": "play", + "id": 15 + }, + { + "name": "PlayerInteractEntityC2SPacket", + "side": "serverbound", + "state": "play", + "id": 16 + }, + { + "name": "JigsawGeneratingC2SPacket", + "side": "serverbound", + "state": "play", + "id": 17 + }, + { + "name": "KeepAliveC2SPacket", + "side": "serverbound", + "state": "play", + "id": 18 + }, + { + "name": "UpdateDifficultyLockC2SPacket", + "side": "serverbound", + "state": "play", + "id": 19 + }, + { + "name": "PositionAndOnGround", + "side": "serverbound", + "state": "play", + "id": 20 + }, + { + "name": "Full", + "side": "serverbound", + "state": "play", + "id": 21 + }, + { + "name": "LookAndOnGround", + "side": "serverbound", + "state": "play", + "id": 22 + }, + { + "name": "OnGroundOnly", + "side": "serverbound", + "state": "play", + "id": 23 + }, + { + "name": "VehicleMoveC2SPacket", + "side": "serverbound", + "state": "play", + "id": 24 + }, + { + "name": "BoatPaddleStateC2SPacket", + "side": "serverbound", + "state": "play", + "id": 25 + }, + { + "name": "PickFromInventoryC2SPacket", + "side": "serverbound", + "state": "play", + "id": 26 + }, + { + "name": "CraftRequestC2SPacket", + "side": "serverbound", + "state": "play", + "id": 27 + }, + { + "name": "UpdatePlayerAbilitiesC2SPacket", + "side": "serverbound", + "state": "play", + "id": 28 + }, + { + "name": "PlayerActionC2SPacket", + "side": "serverbound", + "state": "play", + "id": 29 + }, + { + "name": "ClientCommandC2SPacket", + "side": "serverbound", + "state": "play", + "id": 30 + }, + { + "name": "PlayerInputC2SPacket", + "side": "serverbound", + "state": "play", + "id": 31 + }, + { + "name": "PlayPongC2SPacket", + "side": "serverbound", + "state": "play", + "id": 32 + }, + { + "name": "RecipeCategoryOptionsC2SPacket", + "side": "serverbound", + "state": "play", + "id": 33 + }, + { + "name": "RecipeBookDataC2SPacket", + "side": "serverbound", + "state": "play", + "id": 34 + }, + { + "name": "RenameItemC2SPacket", + "side": "serverbound", + "state": "play", + "id": 35 + }, + { + "name": "ResourcePackStatusC2SPacket", + "side": "serverbound", + "state": "play", + "id": 36 + }, + { + "name": "AdvancementTabC2SPacket", + "side": "serverbound", + "state": "play", + "id": 37 + }, + { + "name": "SelectMerchantTradeC2SPacket", + "side": "serverbound", + "state": "play", + "id": 38 + }, + { + "name": "UpdateBeaconC2SPacket", + "side": "serverbound", + "state": "play", + "id": 39 + }, + { + "name": "UpdateSelectedSlotC2SPacket", + "side": "serverbound", + "state": "play", + "id": 40 + }, + { + "name": "UpdateCommandBlockC2SPacket", + "side": "serverbound", + "state": "play", + "id": 41 + }, + { + "name": "UpdateCommandBlockMinecartC2SPacket", + "side": "serverbound", + "state": "play", + "id": 42 + }, + { + "name": "CreativeInventoryActionC2SPacket", + "side": "serverbound", + "state": "play", + "id": 43 + }, + { + "name": "UpdateJigsawC2SPacket", + "side": "serverbound", + "state": "play", + "id": 44 + }, + { + "name": "UpdateStructureBlockC2SPacket", + "side": "serverbound", + "state": "play", + "id": 45 + }, + { + "name": "UpdateSignC2SPacket", + "side": "serverbound", + "state": "play", + "id": 46 + }, + { + "name": "HandSwingC2SPacket", + "side": "serverbound", + "state": "play", + "id": 47 + }, + { + "name": "SpectatorTeleportC2SPacket", + "side": "serverbound", + "state": "play", + "id": 48 + }, + { + "name": "PlayerInteractBlockC2SPacket", + "side": "serverbound", + "state": "play", + "id": 49 + }, + { + "name": "PlayerInteractItemC2SPacket", + "side": "serverbound", + "state": "play", + "id": 50 + }, + { + "name": "QueryRequestC2SPacket", + "side": "serverbound", + "state": "status", + "id": 0 + }, + { + "name": "QueryPingC2SPacket", + "side": "serverbound", + "state": "status", + "id": 1 + }, + { + "name": "LoginHelloC2SPacket", + "side": "serverbound", + "state": "login", + "id": 0 + }, + { + "name": "LoginKeyC2SPacket", + "side": "serverbound", + "state": "login", + "id": 1 + }, + { + "name": "LoginQueryResponseC2SPacket", + "side": "serverbound", + "state": "login", + "id": 2 + }, + { + "name": "BundleSplitterPacket", + "side": "clientbound", + "state": "play", + "id": 0 + }, + { + "name": "EntitySpawnS2CPacket", + "side": "clientbound", + "state": "play", + "id": 1 + }, + { + "name": "ExperienceOrbSpawnS2CPacket", + "side": "clientbound", + "state": "play", + "id": 2 + }, + { + "name": "PlayerSpawnS2CPacket", + "side": "clientbound", + "state": "play", + "id": 3 + }, + { + "name": "EntityAnimationS2CPacket", + "side": "clientbound", + "state": "play", + "id": 4 + }, + { + "name": "StatisticsS2CPacket", + "side": "clientbound", + "state": "play", + "id": 5 + }, + { + "name": "PlayerActionResponseS2CPacket", + "side": "clientbound", + "state": "play", + "id": 6 + }, + { + "name": "BlockBreakingProgressS2CPacket", + "side": "clientbound", + "state": "play", + "id": 7 + }, + { + "name": "BlockEntityUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 8 + }, + { + "name": "BlockEventS2CPacket", + "side": "clientbound", + "state": "play", + "id": 9 + }, + { + "name": "BlockUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 10 + }, + { + "name": "BossBarS2CPacket", + "side": "clientbound", + "state": "play", + "id": 11 + }, + { + "name": "DifficultyS2CPacket", + "side": "clientbound", + "state": "play", + "id": 12 + }, + { + "name": "ChunkBiomeDataS2CPacket", + "side": "clientbound", + "state": "play", + "id": 13 + }, + { + "name": "ClearTitleS2CPacket", + "side": "clientbound", + "state": "play", + "id": 14 + }, + { + "name": "CommandSuggestionsS2CPacket", + "side": "clientbound", + "state": "play", + "id": 15 + }, + { + "name": "CommandTreeS2CPacket", + "side": "clientbound", + "state": "play", + "id": 16 + }, + { + "name": "CloseScreenS2CPacket", + "side": "clientbound", + "state": "play", + "id": 17 + }, + { + "name": "InventoryS2CPacket", + "side": "clientbound", + "state": "play", + "id": 18 + }, + { + "name": "ScreenHandlerPropertyUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 19 + }, + { + "name": "ScreenHandlerSlotUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 20 + }, + { + "name": "CooldownUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 21 + }, + { + "name": "ChatSuggestionsS2CPacket", + "side": "clientbound", + "state": "play", + "id": 22 + }, + { + "name": "CustomPayloadS2CPacket", + "side": "clientbound", + "state": "play", + "id": 23 + }, + { + "name": "EntityDamageS2CPacket", + "side": "clientbound", + "state": "play", + "id": 24 + }, + { + "name": "RemoveMessageS2CPacket", + "side": "clientbound", + "state": "play", + "id": 25 + }, + { + "name": "DisconnectS2CPacket", + "side": "clientbound", + "state": "play", + "id": 26 + }, + { + "name": "ProfilelessChatMessageS2CPacket", + "side": "clientbound", + "state": "play", + "id": 27 + }, + { + "name": "EntityStatusS2CPacket", + "side": "clientbound", + "state": "play", + "id": 28 + }, + { + "name": "ExplosionS2CPacket", + "side": "clientbound", + "state": "play", + "id": 29 + }, + { + "name": "UnloadChunkS2CPacket", + "side": "clientbound", + "state": "play", + "id": 30 + }, + { + "name": "GameStateChangeS2CPacket", + "side": "clientbound", + "state": "play", + "id": 31 + }, + { + "name": "OpenHorseScreenS2CPacket", + "side": "clientbound", + "state": "play", + "id": 32 + }, + { + "name": "DamageTiltS2CPacket", + "side": "clientbound", + "state": "play", + "id": 33 + }, + { + "name": "WorldBorderInitializeS2CPacket", + "side": "clientbound", + "state": "play", + "id": 34 + }, + { + "name": "KeepAliveS2CPacket", + "side": "clientbound", + "state": "play", + "id": 35 + }, + { + "name": "ChunkDataS2CPacket", + "side": "clientbound", + "state": "play", + "id": 36 + }, + { + "name": "WorldEventS2CPacket", + "side": "clientbound", + "state": "play", + "id": 37 + }, + { + "name": "ParticleS2CPacket", + "side": "clientbound", + "state": "play", + "id": 38 + }, + { + "name": "LightUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 39 + }, + { + "name": "GameJoinS2CPacket", + "side": "clientbound", + "state": "play", + "id": 40 + }, + { + "name": "MapUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 41 + }, + { + "name": "SetTradeOffersS2CPacket", + "side": "clientbound", + "state": "play", + "id": 42 + }, + { + "name": "MoveRelative", + "side": "clientbound", + "state": "play", + "id": 43 + }, + { + "name": "RotateAndMoveRelative", + "side": "clientbound", + "state": "play", + "id": 44 + }, + { + "name": "Rotate", + "side": "clientbound", + "state": "play", + "id": 45 + }, + { + "name": "VehicleMoveS2CPacket", + "side": "clientbound", + "state": "play", + "id": 46 + }, + { + "name": "OpenWrittenBookS2CPacket", + "side": "clientbound", + "state": "play", + "id": 47 + }, + { + "name": "OpenScreenS2CPacket", + "side": "clientbound", + "state": "play", + "id": 48 + }, + { + "name": "SignEditorOpenS2CPacket", + "side": "clientbound", + "state": "play", + "id": 49 + }, + { + "name": "PlayPingS2CPacket", + "side": "clientbound", + "state": "play", + "id": 50 + }, + { + "name": "CraftFailedResponseS2CPacket", + "side": "clientbound", + "state": "play", + "id": 51 + }, + { + "name": "PlayerAbilitiesS2CPacket", + "side": "clientbound", + "state": "play", + "id": 52 + }, + { + "name": "ChatMessageS2CPacket", + "side": "clientbound", + "state": "play", + "id": 53 + }, + { + "name": "EndCombatS2CPacket", + "side": "clientbound", + "state": "play", + "id": 54 + }, + { + "name": "EnterCombatS2CPacket", + "side": "clientbound", + "state": "play", + "id": 55 + }, + { + "name": "DeathMessageS2CPacket", + "side": "clientbound", + "state": "play", + "id": 56 + }, + { + "name": "PlayerRemoveS2CPacket", + "side": "clientbound", + "state": "play", + "id": 57 + }, + { + "name": "PlayerListS2CPacket", + "side": "clientbound", + "state": "play", + "id": 58 + }, + { + "name": "LookAtS2CPacket", + "side": "clientbound", + "state": "play", + "id": 59 + }, + { + "name": "PlayerPositionLookS2CPacket", + "side": "clientbound", + "state": "play", + "id": 60 + }, + { + "name": "UnlockRecipesS2CPacket", + "side": "clientbound", + "state": "play", + "id": 61 + }, + { + "name": "EntitiesDestroyS2CPacket", + "side": "clientbound", + "state": "play", + "id": 62 + }, + { + "name": "RemoveEntityStatusEffectS2CPacket", + "side": "clientbound", + "state": "play", + "id": 63 + }, + { + "name": "ResourcePackSendS2CPacket", + "side": "clientbound", + "state": "play", + "id": 64 + }, + { + "name": "PlayerRespawnS2CPacket", + "side": "clientbound", + "state": "play", + "id": 65 + }, + { + "name": "EntitySetHeadYawS2CPacket", + "side": "clientbound", + "state": "play", + "id": 66 + }, + { + "name": "ChunkDeltaUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 67 + }, + { + "name": "SelectAdvancementTabS2CPacket", + "side": "clientbound", + "state": "play", + "id": 68 + }, + { + "name": "ServerMetadataS2CPacket", + "side": "clientbound", + "state": "play", + "id": 69 + }, + { + "name": "OverlayMessageS2CPacket", + "side": "clientbound", + "state": "play", + "id": 70 + }, + { + "name": "WorldBorderCenterChangedS2CPacket", + "side": "clientbound", + "state": "play", + "id": 71 + }, + { + "name": "WorldBorderInterpolateSizeS2CPacket", + "side": "clientbound", + "state": "play", + "id": 72 + }, + { + "name": "WorldBorderSizeChangedS2CPacket", + "side": "clientbound", + "state": "play", + "id": 73 + }, + { + "name": "WorldBorderWarningTimeChangedS2CPacket", + "side": "clientbound", + "state": "play", + "id": 74 + }, + { + "name": "WorldBorderWarningBlocksChangedS2CPacket", + "side": "clientbound", + "state": "play", + "id": 75 + }, + { + "name": "SetCameraEntityS2CPacket", + "side": "clientbound", + "state": "play", + "id": 76 + }, + { + "name": "UpdateSelectedSlotS2CPacket", + "side": "clientbound", + "state": "play", + "id": 77 + }, + { + "name": "ChunkRenderDistanceCenterS2CPacket", + "side": "clientbound", + "state": "play", + "id": 78 + }, + { + "name": "ChunkLoadDistanceS2CPacket", + "side": "clientbound", + "state": "play", + "id": 79 + }, + { + "name": "PlayerSpawnPositionS2CPacket", + "side": "clientbound", + "state": "play", + "id": 80 + }, + { + "name": "ScoreboardDisplayS2CPacket", + "side": "clientbound", + "state": "play", + "id": 81 + }, + { + "name": "EntityTrackerUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 82 + }, + { + "name": "EntityAttachS2CPacket", + "side": "clientbound", + "state": "play", + "id": 83 + }, + { + "name": "EntityVelocityUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 84 + }, + { + "name": "EntityEquipmentUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 85 + }, + { + "name": "ExperienceBarUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 86 + }, + { + "name": "HealthUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 87 + }, + { + "name": "ScoreboardObjectiveUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 88 + }, + { + "name": "EntityPassengersSetS2CPacket", + "side": "clientbound", + "state": "play", + "id": 89 + }, + { + "name": "TeamS2CPacket", + "side": "clientbound", + "state": "play", + "id": 90 + }, + { + "name": "ScoreboardPlayerUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 91 + }, + { + "name": "SimulationDistanceS2CPacket", + "side": "clientbound", + "state": "play", + "id": 92 + }, + { + "name": "SubtitleS2CPacket", + "side": "clientbound", + "state": "play", + "id": 93 + }, + { + "name": "WorldTimeUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 94 + }, + { + "name": "TitleS2CPacket", + "side": "clientbound", + "state": "play", + "id": 95 + }, + { + "name": "TitleFadeS2CPacket", + "side": "clientbound", + "state": "play", + "id": 96 + }, + { + "name": "PlaySoundFromEntityS2CPacket", + "side": "clientbound", + "state": "play", + "id": 97 + }, + { + "name": "PlaySoundS2CPacket", + "side": "clientbound", + "state": "play", + "id": 98 + }, + { + "name": "StopSoundS2CPacket", + "side": "clientbound", + "state": "play", + "id": 99 + }, + { + "name": "GameMessageS2CPacket", + "side": "clientbound", + "state": "play", + "id": 100 + }, + { + "name": "PlayerListHeaderS2CPacket", + "side": "clientbound", + "state": "play", + "id": 101 + }, + { + "name": "NbtQueryResponseS2CPacket", + "side": "clientbound", + "state": "play", + "id": 102 + }, + { + "name": "ItemPickupAnimationS2CPacket", + "side": "clientbound", + "state": "play", + "id": 103 + }, + { + "name": "EntityPositionS2CPacket", + "side": "clientbound", + "state": "play", + "id": 104 + }, + { + "name": "AdvancementUpdateS2CPacket", + "side": "clientbound", + "state": "play", + "id": 105 + }, + { + "name": "EntityAttributesS2CPacket", + "side": "clientbound", + "state": "play", + "id": 106 + }, + { + "name": "FeaturesS2CPacket", + "side": "clientbound", + "state": "play", + "id": 107 + }, + { + "name": "EntityStatusEffectS2CPacket", + "side": "clientbound", + "state": "play", + "id": 108 + }, + { + "name": "SynchronizeRecipesS2CPacket", + "side": "clientbound", + "state": "play", + "id": 109 + }, + { + "name": "SynchronizeTagsS2CPacket", + "side": "clientbound", + "state": "play", + "id": 110 + }, + { + "name": "QueryResponseS2CPacket", + "side": "clientbound", + "state": "status", + "id": 0 + }, + { + "name": "QueryPongS2CPacket", + "side": "clientbound", + "state": "status", + "id": 1 + }, + { + "name": "LoginDisconnectS2CPacket", + "side": "clientbound", + "state": "login", + "id": 0 + }, + { + "name": "LoginHelloS2CPacket", + "side": "clientbound", + "state": "login", + "id": 1 + }, + { + "name": "LoginSuccessS2CPacket", + "side": "clientbound", + "state": "login", + "id": 2 + }, + { + "name": "LoginCompressionS2CPacket", + "side": "clientbound", + "state": "login", + "id": 3 + }, + { + "name": "LoginQueryRequestS2CPacket", + "side": "clientbound", + "state": "login", + "id": 4 + } +] \ No newline at end of file diff --git a/vendor/valence/tools/packet_inspector/src/app.rs b/vendor/valence/tools/packet_inspector/src/app.rs new file mode 100644 index 00000000..0dbe8c83 --- /dev/null +++ b/vendor/valence/tools/packet_inspector/src/app.rs @@ -0,0 +1,194 @@ +use std::net::SocketAddr; +use std::sync::{Arc, RwLock}; + +use egui_dock::{DockArea, NodeIndex, Style, Tree}; +use packet_inspector::Proxy; +use tokio::task::JoinHandle; + +use crate::shared_state::{Event, SharedState}; + +mod connection; +mod filter; +mod hex_viewer; +mod packet_list; +mod text_viewer; + +pub trait View { + fn ui(&mut self, ui: &mut egui::Ui, shared_state: &mut SharedState); +} + +/// Something to view +pub trait Tab: View { + fn new() -> Self + where + Self: Sized; + + /// `&'static` so we can also use it as a key to store open/close state. + fn name(&self) -> &'static str; +} + +struct TabViewer { + shared_state: Arc>, +} + +impl egui_dock::TabViewer for TabViewer { + type Tab = Box; + + fn ui(&mut self, ui: &mut egui::Ui, tab: &mut Self::Tab) { + tab.ui(ui, &mut self.shared_state.write().unwrap()); + } + + fn title(&mut self, tab: &mut Self::Tab) -> egui::WidgetText { + tab.name().into() + } + + fn on_close(&mut self, _tab: &mut Self::Tab) -> bool { + false + } +} + +pub struct GuiApp { + tree: Tree>, + shared_state: Arc>, + tab_viewer: TabViewer, +} + +impl GuiApp { + pub fn new(cc: &eframe::CreationContext<'_>) -> Self { + let ctx = cc.egui_ctx.clone(); + + // Default Application Layout + let mut tree: Tree> = Tree::new(vec![Box::new(connection::Connection::new())]); + + let [a, b] = tree.split_right( + NodeIndex::root(), + 0.3, + vec![Box::new(packet_list::PacketList::new())], + ); + + let [_, _] = tree.split_below(a, 0.25, vec![Box::new(filter::Filter::new())]); + let [_, _] = tree.split_below( + b, + 0.5, + vec![ + Box::new(text_viewer::TextView::new()), + Box::new(hex_viewer::HexView::new()), + ], + ); + + // Persistent Storage + let mut shared_state = SharedState::new(ctx); + + if let Some(storage) = cc.storage { + if let Some(value) = eframe::get_value::(storage, eframe::APP_KEY) { + shared_state = value.merge(shared_state); + } + } + + let autostart = shared_state.autostart; + let shared_state = Arc::new(RwLock::new(shared_state)); + + // Event Handling + handle_events(shared_state.clone()); + + if autostart { + let state = shared_state.read().unwrap(); + state.send_event(Event::StartListening); + } + + // Consumer thread + + // Tab Viewer + let tab_viewer = TabViewer { + shared_state: shared_state.clone(), + }; + + Self { + shared_state, + tree, + tab_viewer, + } + } +} + +impl eframe::App for GuiApp { + fn save(&mut self, storage: &mut dyn eframe::Storage) { + eframe::set_value( + storage, + eframe::APP_KEY, + &*self.shared_state.read().unwrap(), + ); + } + + fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { + DockArea::new(&mut self.tree) + .show_add_buttons(false) + .show_add_popup(false) + .show_close_buttons(false) + .style(Style::from_egui(ctx.style().as_ref())) + .show(ctx, &mut self.tab_viewer); + } +} + +// This function is getting waaaay too complicated and messy +fn handle_events(state: Arc>) { + tokio::spawn(async move { + let mut proxy_thread: Option> = None; + + let receiver = state.write().unwrap().receiver.take().unwrap(); + while let Ok(event) = receiver.recv_async().await { + match event { + Event::StartListening => { + let mut w_state = state.write().unwrap(); + if w_state.is_listening { + continue; + } + + let Ok(listener_addr) = w_state.listener_addr.parse::() else { + w_state.is_listening = false; + continue; + }; + let Ok(server_addr) = w_state.server_addr.parse::() else { + w_state.is_listening = false; + continue; + }; + + let state = state.clone(); + + proxy_thread = Some(tokio::spawn(async move { + let proxy = Proxy::start(listener_addr, server_addr).await?; + let receiver = proxy.subscribe().await; + + while let Ok(packet) = receiver.recv_async().await { + let state = state.read().unwrap(); + state.packets.write().unwrap().push(packet); + state.send_event(Event::PacketReceived); + } + + Ok::<(), anyhow::Error>(()) + })); + + w_state.is_listening = true; + } + Event::StopListening => { + let mut state = state.write().unwrap(); + if !state.is_listening { + continue; + } + + if let Some(proxy_thread) = proxy_thread.take() { + proxy_thread.abort(); + } + + state.is_listening = false; + } + Event::PacketReceived => { + // Refresh UI + if let Some(ctx) = &state.read().unwrap().ctx { + ctx.request_repaint(); + } + } + } + } + }); +} diff --git a/vendor/valence/tools/packet_inspector/src/app/connection.rs b/vendor/valence/tools/packet_inspector/src/app/connection.rs new file mode 100644 index 00000000..90db3410 --- /dev/null +++ b/vendor/valence/tools/packet_inspector/src/app/connection.rs @@ -0,0 +1,43 @@ +use super::{SharedState, Tab, View}; +use crate::shared_state::Event; + +pub struct Connection {} + +impl Tab for Connection { + fn new() -> Self { + Self {} + } + + fn name(&self) -> &'static str { + "Connection" + } +} + +impl View for Connection { + fn ui(&mut self, ui: &mut egui::Ui, state: &mut SharedState) { + if state.is_listening { + ui.label("Listener Address"); + ui.text_edit_singleline(&mut state.listener_addr.clone()); + ui.label("Server Address"); + ui.text_edit_singleline(&mut state.server_addr.clone()); + + ui.horizontal(|ui| { + if ui.button("Stop Listening").clicked() { + state.send_event(Event::StopListening); + } + ui.checkbox(&mut state.autostart, "Autostart"); + }); + } else { + ui.label("Listener Address"); + ui.text_edit_singleline(&mut state.listener_addr); + ui.label("Server Address"); + ui.text_edit_singleline(&mut state.server_addr); + ui.horizontal(|ui| { + if ui.button("Start Listening").clicked() { + state.send_event(Event::StartListening); + } + ui.checkbox(&mut state.autostart, "Autostart"); + }); + } + } +} diff --git a/vendor/valence/tools/packet_inspector/src/app/filter.rs b/vendor/valence/tools/packet_inspector/src/app/filter.rs new file mode 100644 index 00000000..e12e4671 --- /dev/null +++ b/vendor/valence/tools/packet_inspector/src/app/filter.rs @@ -0,0 +1,152 @@ +use egui::{RichText, TextEdit, Ui, Widget}; +use itertools::Itertools; +use valence_protocol::PacketState; + +use super::{SharedState, Tab, View}; +use crate::tri_checkbox::{TriCheckbox, TriCheckboxState}; + +pub struct Filter {} + +impl Tab for Filter { + fn new() -> Self { + Self {} + } + + fn name(&self) -> &'static str { + "Filters" + } +} + +impl View for Filter { + fn ui(&mut self, ui: &mut egui::Ui, state: &mut SharedState) { + ui.horizontal(|ui| { + ui.label("Search:"); + if ui.button("x").clicked() { + state.packet_search.clear(); + } + TextEdit::singleline(&mut state.packet_search) + .hint_text("Filter shown packets, e.g \"0x00\" or \"S2c\"") + .ui(ui); + }); + + egui::ScrollArea::vertical() + .auto_shrink([false, false]) + .stick_to_bottom(false) + .show(ui, |ui| { + if draw_packet_list(ui, state, PacketState::Handshaking) > 0 { + ui.separator(); + } + if draw_packet_list(ui, state, PacketState::Status) > 0 { + ui.separator(); + } + if draw_packet_list(ui, state, PacketState::Login) > 0 { + ui.separator(); + } + draw_packet_list(ui, state, PacketState::Play); + }); + } +} + +fn get_checkbox_state(state: &SharedState, packet_state: PacketState) -> TriCheckboxState { + let mut p_enabled = 0; + let mut disabled = 0; + for (_, enabled) in state + .packet_filter + .iter() + .filter(|(p, _)| p.state == packet_state) + { + if *enabled { + p_enabled += 1; + } else { + disabled += 1; + } + } + if p_enabled > 0 && disabled == 0 { + TriCheckboxState::Enabled + } else if p_enabled > 0 && disabled > 0 { + TriCheckboxState::Partial + } else { + TriCheckboxState::Disabled + } +} + +fn draw_packet_list(ui: &mut Ui, state: &mut SharedState, packet_state: PacketState) -> usize { + let title = match packet_state { + PacketState::Handshaking => "Handshaking", + PacketState::Status => "Status", + PacketState::Login => "Login", + PacketState::Play => "Play", + }; + + let search = state.packet_search.to_lowercase(); + + let count = state + .packet_filter + .iter_mut() + .filter(|(p, _)| { + p.state == packet_state + && (p.name.to_lowercase().contains(&search) + || int_to_hex_lower(p.id).contains(&search)) + }) + .count(); + + let count_enabled = state + .packet_filter + .iter_mut() + .filter(|(p, enabled)| { + p.state == packet_state + && (p.name.to_lowercase().contains(&search) + || int_to_hex_lower(p.id).contains(&search)) + && **enabled + }) + .count(); + + if count == 0 { + return 0; + } + + let mut checkbox = get_checkbox_state(state, packet_state); + if TriCheckbox::new(&mut checkbox, RichText::new(title).heading().strong()) + .ui(ui) + .changed() + { + for (_, enabled) in state.packet_filter.iter_mut().filter(|(p, _)| { + p.state == packet_state + && (p.name.to_lowercase().contains(&search) + || int_to_hex_lower(p.id).contains(&search)) + }) { + if count == count_enabled || count_enabled == 0 { + *enabled = !*enabled; + continue; + } + + *enabled = (count / 2) <= count_enabled; + } + } + + for (p, enabled) in state + .packet_filter + .iter_mut() + .filter(|(p, _)| { + p.state == packet_state + && (p.name.to_lowercase().contains(&search) + || int_to_hex_lower(p.id).contains(&search)) + }) + .sorted_by(|(a, _), (b, _)| { + a.id.cmp(&b.id) + .then((a.side as usize).cmp(&(b.side as usize))) + }) + { + ui.checkbox(enabled, format!("[{}] {}", int_to_hex(p.id), p.name)); + } + + count +} + +fn int_to_hex(i: i32) -> String { + format!("0x{:0>2X}", i) +} + +fn int_to_hex_lower(i: i32) -> String { + format!("0x{:0>2x}", i) +} diff --git a/vendor/valence/tools/packet_inspector/src/app/hex_viewer.rs b/vendor/valence/tools/packet_inspector/src/app/hex_viewer.rs new file mode 100644 index 00000000..2c76db9b --- /dev/null +++ b/vendor/valence/tools/packet_inspector/src/app/hex_viewer.rs @@ -0,0 +1,72 @@ +use std::io::Read; + +use super::{SharedState, Tab, View}; + +pub struct HexView {} + +impl Tab for HexView { + fn new() -> Self { + Self {} + } + + fn name(&self) -> &'static str { + "Hex Viewer" + } +} + +impl View for HexView { + fn ui(&mut self, ui: &mut egui::Ui, state: &mut SharedState) { + let mut buf = [0u8; 16]; + let mut count = 0; + + let packets = state.packets.read().unwrap(); + let Some(packet_index) = state.selected_packet else { + return; + }; + + let bytes = &packets[packet_index].data.as_ref().unwrap(); + let mut file = &(*bytes).clone()[..]; + + egui::Grid::new("hex_grid") + .spacing([4.0, 1.5]) + .striped(true) + .min_col_width(0.0) + .show(ui, |ui| { + ui.label(" "); + for i in 0..16 { + ui.label(format!("{:02X}", i)); + } + ui.end_row(); + loop { + let bytes_read = file.read(&mut buf).unwrap(); + if bytes_read == 0 { + break; + } + + ui.label(format!("{:08X}", count)); + let text_color = if ui.style().visuals.dark_mode { + egui::Color32::from_gray(255) + } else { + egui::Color32::from_gray(0) + }; + for b in buf.iter().take(bytes_read) { + ui.colored_label(text_color, format!("{:02X}", b)); + } + for _ in 0..16 - bytes_read { + ui.label(" "); + } + ui.label(" "); + for b in buf.iter().take(bytes_read) { + if *b >= 0x20 && *b <= 0x7e { + ui.label(format!("{}", *b as char)); + } else { + ui.label("."); + } + } + + ui.end_row(); + count += bytes_read; + } + }); + } +} diff --git a/vendor/valence/tools/packet_inspector/src/app/packet_list.rs b/vendor/valence/tools/packet_inspector/src/app/packet_list.rs new file mode 100644 index 00000000..21c1c827 --- /dev/null +++ b/vendor/valence/tools/packet_inspector/src/app/packet_list.rs @@ -0,0 +1,270 @@ +use eframe::epaint::{PathShape, RectShape}; +use egui::{ + Color32, Pos2, Rect, Response, Rgba, Rounding, Sense, Shape, Stroke, TextStyle, Ui, Vec2, + WidgetText, +}; +use packet_inspector::Packet; +use valence_protocol::PacketSide; + +use super::{SharedState, Tab, View}; + +pub struct PacketList {} + +impl Tab for PacketList { + fn new() -> Self { + Self {} + } + + fn name(&self) -> &'static str { + "Packets" + } +} + +impl View for PacketList { + fn ui(&mut self, ui: &mut egui::Ui, state: &mut SharedState) { + handle_keyboard_input(state, ui); + + ui.horizontal(|ui| { + ui.heading("Packets"); + draw_packet_counter(state, ui); + draw_clear_button(state, ui); + }); + + draw_packet_list(state, ui); + } +} + +fn handle_keyboard_input(state: &mut SharedState, ui: &Ui) { + if ui.input(|i| i.key_pressed(egui::Key::ArrowUp)) { + // select previous packet + let index = state.selected_packet.unwrap_or(1); + + let packets = state.packets.read().unwrap(); + let filtered_packets = packets + .iter() + .enumerate() + .filter(|(i, p)| *i < index && state.packet_filter.get(p).unwrap_or(true)) + .map(|(i, _)| i) + .collect::>(); + + if let Some(&prev_index) = filtered_packets.last() { + state.selected_packet = Some(prev_index); + state.update_scroll = true; + } + } + + if ui.input(|i| i.key_pressed(egui::Key::ArrowDown)) { + // select next packet + let index = state.selected_packet.unwrap_or(0); + + let packets = state.packets.read().unwrap(); + let filtered_packets = packets + .iter() + .enumerate() + .filter(|(i, p)| *i > index && state.packet_filter.get(p).unwrap_or(true)) + .map(|(i, _)| i) + .collect::>(); + + if let Some(&next_index) = filtered_packets.first() { + state.selected_packet = Some(next_index); + state.update_scroll = true; + } + } +} + +fn draw_packet_counter(state: &SharedState, ui: &mut Ui) { + let packets = state.packets.read().unwrap(); + let length = packets.len(); + + let filtered_packets = packets + .iter() + .filter(|p| state.packet_filter.get(p).unwrap_or(true)) + .count(); + + ui.label(format!("({}/{})", filtered_packets, length)); +} + +fn draw_clear_button(state: &mut SharedState, ui: &mut Ui) { + if ui.button("Clear").clicked() { + state.selected_packet = None; + state.packets.write().unwrap().clear(); + } +} + +fn draw_packet_list(state: &mut SharedState, ui: &mut Ui) { + let packets = state.packets.read().unwrap(); + egui::ScrollArea::vertical() + .auto_shrink([false, false]) + .stick_to_bottom(!state.update_scroll) + .show(ui, |ui| { + for (i, packet) in packets.iter().enumerate() { + if let Some(filtered) = state.packet_filter.get(packet) { + if !filtered { + continue; + } + } + + let selected = { + if let Some(selected) = state.selected_packet { + selected == i + } else { + false + } + }; + + let widget = draw_packet_widget(ui, packet, selected); + + if state.update_scroll && state.selected_packet == Some(i) { + state.update_scroll = false; + ui.scroll_to_rect(widget.rect, None); + } + + if widget.clicked() { + state.selected_packet = Some(i); + } + } + }); +} + +fn draw_packet_widget(ui: &mut Ui, packet: &Packet, selected: bool) -> Response { + let (mut rect, response) = ui.allocate_at_least( + Vec2 { + x: ui.available_width(), + y: 24.0, + }, + Sense::click(), + ); // this should give me a new rect inside the scroll area... no? + + let fill = match selected /*packet.selected*/ { + true => Rgba::from_rgba_premultiplied(0.1, 0.1, 0.1, 0.5), + false => Rgba::from_rgba_premultiplied(0.0, 0.0, 0.0, 0.0), + }; + + let text_color: Color32 = match selected /*packet.selected*/ { + true => Rgba::from_rgba_premultiplied(0.0, 0.0, 0.0, 1.0).into(), + false => ui.visuals().strong_text_color(), + }; + + if ui.is_rect_visible(rect) { + ui.painter().add(Shape::Rect(RectShape { + rect, + rounding: Rounding::none(), + fill: fill.into(), + stroke: Stroke::new(1.0, Rgba::BLACK), + })); + + let shape = get_triangle(packet.side, &rect); + ui.painter().add(Shape::Path(shape)); + + let identifier: WidgetText = format!("0x{:0>2X?}", packet.id).into(); + + let identifier = + identifier.into_galley(ui, Some(false), rect.width() - 21.0, TextStyle::Button); + + let label: WidgetText = packet.name.into(); + let label = label.into_galley(ui, Some(false), rect.width() - 60.0, TextStyle::Button); + + let timestamp: WidgetText = systemtime_strftime(packet.timestamp.unwrap()).into(); + let timestamp = + timestamp.into_galley(ui, Some(false), rect.width() - 60.0, TextStyle::Button); + + let id_and_timestamp_color = if selected { + text_color + } else { + ui.visuals().weak_text_color() + }; + + identifier.paint_with_fallback_color( + ui.painter(), + Pos2 { + x: rect.left() + 21.0, + y: rect.top() + 6.0, + }, + id_and_timestamp_color, + ); + + rect.set_width(rect.width() - 5.0); + + let label_width = label.size().x + 50.0; + + label.paint_with_fallback_color( + &ui.painter().with_clip_rect(rect), + Pos2 { + x: rect.left() + 55.0, + y: rect.top() + 6.0, + }, + text_color, + ); + + timestamp.paint_with_fallback_color( + &ui.painter().with_clip_rect(rect), + Pos2 { + x: rect.left() + label_width + 8.0, + y: rect.top() + 6.0, + }, + id_and_timestamp_color, + ); + } + + response +} + +fn get_triangle(direction: PacketSide, outer_rect: &Rect) -> PathShape { + let rect = Rect::from_min_size( + Pos2 { + x: outer_rect.left() + 6.0, + y: outer_rect.top() + 8.0, + }, + Vec2 { x: 8.0, y: 8.0 }, + ); + + let color = match direction { + PacketSide::Clientbound => Rgba::from_rgb(255.0, 0.0, 0.0), + PacketSide::Serverbound => Rgba::from_rgb(0.0, 255.0, 0.0), + }; + + let points = match direction { + PacketSide::Clientbound => vec![ + Pos2 { + x: rect.left() + (rect.width() / 2.0), + y: rect.top() + rect.height(), + }, + Pos2 { + x: rect.left() + 0.0, + y: rect.top(), + }, + Pos2 { + x: rect.left() + rect.width(), + y: rect.top(), + }, + ], + PacketSide::Serverbound => vec![ + Pos2 { + x: rect.left() + (rect.width() / 2.0), + y: rect.top() + 0.0, + }, + Pos2 { + x: rect.left() + 0.0, + y: rect.top() + rect.height(), + }, + Pos2 { + x: rect.left() + rect.width(), + y: rect.top() + rect.height(), + }, + ], + }; + + let mut shape = PathShape::closed_line(points, Stroke::new(2.0, color)); + shape.fill = color.into(); + + shape +} + +pub fn systemtime_strftime(odt: time::OffsetDateTime) -> String { + let hour = odt.hour(); + let minute = odt.minute(); + let second = odt.second(); + let millis = odt.millisecond(); + + format!("{hour:0>2}:{minute:0>2}:{second:0>2}.{millis:0>4}") +} diff --git a/vendor/valence/tools/packet_inspector/src/app/text_viewer.rs b/vendor/valence/tools/packet_inspector/src/app/text_viewer.rs new file mode 100644 index 00000000..739bc3b7 --- /dev/null +++ b/vendor/valence/tools/packet_inspector/src/app/text_viewer.rs @@ -0,0 +1,327 @@ +use super::{SharedState, Tab, View}; + +mod utils { + use packet_inspector::Packet as ProxyPacket; + use valence_protocol::packets::handshaking::*; + use valence_protocol::packets::login::*; + use valence_protocol::packets::play::*; + use valence_protocol::packets::status::*; + use valence_protocol::{Decode, Packet}; + + include!(concat!(env!("OUT_DIR"), "/packet_to_string.rs")); +} + +pub struct TextView { + last_packet_id: Option, + packet_str: String, +} + +impl Tab for TextView { + fn new() -> Self { + Self { + last_packet_id: None, + packet_str: "".to_string(), + } + } + + fn name(&self) -> &'static str { + "Text Viewer" + } +} + +impl View for TextView { + fn ui(&mut self, ui: &mut egui::Ui, state: &mut SharedState) { + let packets = state.packets.read().unwrap(); + let Some(packet_index) = state.selected_packet else { + self.last_packet_id = None; + self.packet_str = "".to_string(); + return; + }; + + if self.last_packet_id != Some(packet_index) { + self.last_packet_id = Some(packet_index); + + self.packet_str = match utils::packet_to_string(&packets[packet_index]) { + Ok(str) => str, + Err(err) => format!("Error: {}", err), + }; + } + + code_view_ui(ui, &self.packet_str); + } +} + +// From: https://github.com/emilk/egui/blob/master/crates/egui_demo_lib/src/syntax_highlighting.rs + +use egui::text::LayoutJob; + +/// View some code with syntax highlighting and selection. +pub fn code_view_ui(ui: &mut egui::Ui, mut code: &str) { + let language = "rs"; + let theme = CodeTheme::from_memory(ui.ctx()); + + let mut layouter = |ui: &egui::Ui, string: &str, wrap_width: f32| { + let mut layout_job = highlight(ui.ctx(), &theme, string, language); + layout_job.wrap.max_width = wrap_width; // no wrapping + ui.fonts(|f| f.layout_job(layout_job)) + }; + + ui.add( + egui::TextEdit::multiline(&mut code) + .font(egui::TextStyle::Monospace) // for cursor height + .code_editor() + .desired_width(ui.available_width()) + .desired_rows(24) + .lock_focus(true) + .layouter(&mut layouter), + ); +} + +/// Memoized Code highlighting +pub fn highlight(ctx: &egui::Context, theme: &CodeTheme, code: &str, language: &str) -> LayoutJob { + impl egui::util::cache::ComputerMut<(&CodeTheme, &str, &str), LayoutJob> for Highlighter { + fn compute(&mut self, (theme, code, lang): (&CodeTheme, &str, &str)) -> LayoutJob { + self.highlight(theme, code, lang) + } + } + + type HighlightCache = egui::util::cache::FrameCache; + + ctx.memory_mut(|mem| { + mem.caches + .cache::() + .get((theme, code, language)) + }) +} + +// ---------------------------------------------------------------------------- + +#[derive(Clone, Copy, Hash, PartialEq, serde::Deserialize, serde::Serialize)] +#[allow(unused)] +enum SyntectTheme { + Base16EightiesDark, + Base16MochaDark, + Base16OceanDark, + Base16OceanLight, + InspiredGitHub, + SolarizedDark, + SolarizedLight, +} + +#[allow(unused)] +impl SyntectTheme { + fn all() -> impl ExactSizeIterator { + [ + Self::Base16EightiesDark, + Self::Base16MochaDark, + Self::Base16OceanDark, + Self::Base16OceanLight, + Self::InspiredGitHub, + Self::SolarizedDark, + Self::SolarizedLight, + ] + .iter() + .copied() + } + + fn name(&self) -> &'static str { + match self { + Self::Base16EightiesDark => "Base16 Eighties (dark)", + Self::Base16MochaDark => "Base16 Mocha (dark)", + Self::Base16OceanDark => "Base16 Ocean (dark)", + Self::Base16OceanLight => "Base16 Ocean (light)", + Self::InspiredGitHub => "InspiredGitHub (light)", + Self::SolarizedDark => "Solarized (dark)", + Self::SolarizedLight => "Solarized (light)", + } + } + + fn syntect_key_name(&self) -> &'static str { + match self { + Self::Base16EightiesDark => "base16-eighties.dark", + Self::Base16MochaDark => "base16-mocha.dark", + Self::Base16OceanDark => "base16-ocean.dark", + Self::Base16OceanLight => "base16-ocean.light", + Self::InspiredGitHub => "InspiredGitHub", + Self::SolarizedDark => "Solarized (dark)", + Self::SolarizedLight => "Solarized (light)", + } + } + + pub fn is_dark(&self) -> bool { + match self { + Self::Base16EightiesDark + | Self::Base16MochaDark + | Self::Base16OceanDark + | Self::SolarizedDark => true, + + Self::Base16OceanLight | Self::InspiredGitHub | Self::SolarizedLight => false, + } + } +} + +#[derive(Clone, Hash, PartialEq, serde::Deserialize, serde::Serialize)] +#[serde(default)] +pub struct CodeTheme { + dark_mode: bool, + + syntect_theme: SyntectTheme, +} + +impl Default for CodeTheme { + fn default() -> Self { + Self::dark() + } +} + +#[allow(unused)] +impl CodeTheme { + pub fn from_style(style: &egui::Style) -> Self { + if style.visuals.dark_mode { + Self::dark() + } else { + Self::light() + } + } + + pub fn from_memory(ctx: &egui::Context) -> Self { + if ctx.style().visuals.dark_mode { + ctx.data_mut(|d| { + d.get_persisted(egui::Id::new("dark")) + .unwrap_or_else(CodeTheme::dark) + }) + } else { + ctx.data_mut(|d| { + d.get_persisted(egui::Id::new("light")) + .unwrap_or_else(CodeTheme::light) + }) + } + } + + pub fn store_in_memory(self, ctx: &egui::Context) { + if self.dark_mode { + ctx.data_mut(|d| d.insert_persisted(egui::Id::new("dark"), self)); + } else { + ctx.data_mut(|d| d.insert_persisted(egui::Id::new("light"), self)); + } + } +} + +#[allow(unused)] +impl CodeTheme { + pub fn dark() -> Self { + Self { + dark_mode: true, + syntect_theme: SyntectTheme::SolarizedDark, + } + } + + pub fn light() -> Self { + Self { + dark_mode: false, + syntect_theme: SyntectTheme::SolarizedLight, + } + } + + pub fn ui(&mut self, ui: &mut egui::Ui) { + egui::widgets::global_dark_light_mode_buttons(ui); + + for theme in SyntectTheme::all() { + if theme.is_dark() == self.dark_mode { + ui.radio_value(&mut self.syntect_theme, theme, theme.name()); + } + } + } +} + +// ---------------------------------------------------------------------------- + +struct Highlighter { + ps: syntect::parsing::SyntaxSet, + ts: syntect::highlighting::ThemeSet, +} + +impl Default for Highlighter { + fn default() -> Self { + Self { + ps: syntect::parsing::SyntaxSet::load_defaults_newlines(), + ts: syntect::highlighting::ThemeSet::load_defaults(), + } + } +} + +impl Highlighter { + #[allow(clippy::unused_self, clippy::unnecessary_wraps)] + fn highlight(&self, theme: &CodeTheme, code: &str, lang: &str) -> LayoutJob { + self.highlight_impl(theme, code, lang).unwrap_or_else(|| { + // Fallback: + LayoutJob::simple( + code.into(), + egui::FontId::monospace(12.0), + if theme.dark_mode { + egui::Color32::LIGHT_GRAY + } else { + egui::Color32::DARK_GRAY + }, + f32::INFINITY, + ) + }) + } + + fn highlight_impl(&self, theme: &CodeTheme, text: &str, language: &str) -> Option { + use syntect::easy::HighlightLines; + use syntect::highlighting::FontStyle; + use syntect::util::LinesWithEndings; + + let syntax = self + .ps + .find_syntax_by_name(language) + .or_else(|| self.ps.find_syntax_by_extension(language))?; + + let theme = theme.syntect_theme.syntect_key_name(); + let mut h = HighlightLines::new(syntax, &self.ts.themes[theme]); + + use egui::text::{LayoutSection, TextFormat}; + + let mut job = LayoutJob { + text: text.into(), + ..Default::default() + }; + + for line in LinesWithEndings::from(text) { + for (style, range) in h.highlight_line(line, &self.ps).ok()? { + let fg = style.foreground; + let text_color = egui::Color32::from_rgb(fg.r, fg.g, fg.b); + let italics = style.font_style.contains(FontStyle::ITALIC); + let underline = style.font_style.contains(FontStyle::ITALIC); + let underline = if underline { + egui::Stroke::new(1.0, text_color) + } else { + egui::Stroke::NONE + }; + job.sections.push(LayoutSection { + leading_space: 0.0, + byte_range: as_byte_range(text, range), + format: TextFormat { + font_id: egui::FontId::monospace(12.0), + color: text_color, + italics, + underline, + ..Default::default() + }, + }); + } + } + + Some(job) + } +} + +fn as_byte_range(whole: &str, range: &str) -> std::ops::Range { + let whole_start = whole.as_ptr() as usize; + let range_start = range.as_ptr() as usize; + assert!(whole_start <= range_start); + assert!(range_start + range.len() <= whole_start + whole.len()); + let offset = range_start - whole_start; + offset..(offset + range.len()) +} diff --git a/vendor/valence/tools/packet_inspector/src/lib.rs b/vendor/valence/tools/packet_inspector/src/lib.rs new file mode 100644 index 00000000..dd21474f --- /dev/null +++ b/vendor/valence/tools/packet_inspector/src/lib.rs @@ -0,0 +1,315 @@ +mod packet_io; +mod packet_registry; + +use std::net::SocketAddr; +use std::sync::Arc; +use std::time::Duration; + +use anyhow::bail; +use bytes::{BufMut, BytesMut}; +use tokio::net::{TcpListener, TcpStream}; +use tokio::sync::RwLock; +use tokio::task::JoinHandle; +use valence_protocol::decode::PacketFrame; +use valence_protocol::packets::handshaking::handshake_c2s::HandshakeNextState; +use valence_protocol::packets::handshaking::HandshakeC2s; +use valence_protocol::packets::login::{ + LoginCompressionS2c, LoginDisconnectS2c, LoginHelloS2c, LoginSuccessS2c, +}; +use valence_protocol::text::color::NamedColor; +use valence_protocol::text::{Color, IntoText}; +use valence_protocol::{ + CompressionThreshold, Decode, Encode, Packet as ValencePacket, PacketSide, PacketState, +}; + +use crate::packet_io::PacketIo; +pub use crate::packet_registry::Packet; +use crate::packet_registry::PacketRegistry; + +include!(concat!(env!("OUT_DIR"), "/packets.rs")); + +/// Messages for talking to the running proxy task +#[derive(Debug, Clone)] +pub enum ProxyMessage { + Stop, + // In the future there could be a message like + // InjectPacket(SocketAddr, PacketFrame) +} + +#[derive(Debug)] +pub enum DisconnectionReason { + OnlineModeRequired, + Error(anyhow::Error), +} + +/// Messages sent by the proxy for the controlling GUI/CLI. +#[derive(Debug)] +pub enum ProxyLog { + /// A new client has connected to the listener. + ClientConnected(SocketAddr), + /// A client has disconnected from the listener. + ClientDisconnected(SocketAddr, DisconnectionReason), +} + +pub struct Proxy { + pub main_task: JoinHandle>, + pub message_tx: flume::Sender, + pub logs_rx: flume::Receiver, + pub packet_registry: Arc>, +} + +impl Proxy { + /// Creates a new proxy, and starts its listener task. + pub async fn start(listener_addr: SocketAddr, server_addr: SocketAddr) -> anyhow::Result { + let (message_tx, message_rx) = flume::unbounded(); + let (logs_tx, logs_rx) = flume::unbounded(); + + let packet_registry = Arc::new(RwLock::new({ + let registry = PacketRegistry::new(); + registry.register_all(&STD_PACKETS); + registry + })); + + let main_task = tokio::spawn(Self::run_main_task( + packet_registry.clone(), + TcpListener::bind(listener_addr).await?, + server_addr, + message_rx, + logs_tx, + )); + + Ok(Self { + main_task, + message_tx, + logs_rx, + packet_registry, + }) + } + + /// Subscribes to the proxy's packet registry. + pub async fn subscribe(&self) -> flume::Receiver { + self.packet_registry.read().await.subscribe() + } + + /// Sends a request to stop the proxy and awaits its task's termination. + /// There's a hardcoded 5 second long timeout after which the task is + /// considered unresponsive and automatically aborted. + pub async fn stop(self) { + // The task may have already stopped, so we can ignore a Disconnected error + let _ = self.message_tx.send_async(ProxyMessage::Stop).await; + + let abort_handle = self.main_task.abort_handle(); + tokio::select! { + _ = self.main_task => {}, + + // If the main task doesn't stop after 5 seconds, we force terminate it + _ = tokio::time::sleep(Duration::from_secs(5)) => { + abort_handle.abort(); + }, + } + } + + /// The main listener task is responsible for handling the TCP listener and + /// managing child tasks for each client connected to the inspector. + async fn run_main_task( + packet_registry: Arc>, + listener: TcpListener, + server_addr: SocketAddr, + message_rx: flume::Receiver, + logs_tx: flume::Sender, + ) -> anyhow::Result<()> { + let mut individual_tasks = vec![]; + loop { + tokio::select! { + r = listener.accept() => { + let (stream, addr) = r?; + + logs_tx.send_async(ProxyLog::ClientConnected(addr)).await?; + individual_tasks.push(tokio::spawn(Self::run_individual_proxy( + stream, + TcpStream::connect(server_addr).await?, + logs_tx.clone(), + packet_registry.clone(), + ))); + } + m = message_rx.recv_async() => match m { + Ok(ProxyMessage::Stop) | Err(_) => { + tracing::trace!("Stopping the proxy task..."); + + // TODO: stop these tasks properly instead of just leaving the TCP connections for timeout + for task in individual_tasks.drain(..) { + task.abort(); + } + + return Ok(()); + } + } + } + } + } + + /// Each client connected to the inspector is handled in its own individual + /// task, defined here. + async fn run_individual_proxy( + client: TcpStream, + server: TcpStream, + a_logs_tx: flume::Sender, + packet_registry: Arc>, + ) -> anyhow::Result<()> { + let client_addr = client.peer_addr()?; + + let client = PacketIo::new(client); + let server = PacketIo::new(server); + + let (mut client_reader, mut client_writer) = client.split(); + let (mut server_reader, mut server_writer) = server.split(); + + let a_state = Arc::new(RwLock::new(PacketState::Handshaking)); + let a_threshold = Arc::new(RwLock::new(CompressionThreshold::DEFAULT)); + + let registry = packet_registry.clone(); + let state_lock = a_state.clone(); + let threshold_lock = a_threshold.clone(); + let logs_tx = a_logs_tx.clone(); + let c2s = tokio::spawn(async move { + loop { + let threshold = *threshold_lock.read().await; + client_reader.set_compression(threshold); + server_writer.set_compression(threshold); + + // client to server handling + let packet = match client_reader.recv_packet_raw().await { + Ok(packet) => packet, + Err(e) => { + server_writer.shutdown().await?; + logs_tx + .send_async(ProxyLog::ClientDisconnected( + client_addr, + DisconnectionReason::Error(e), + )) + .await?; + + bail!("connection error"); + } + }; + + let state = *state_lock.read().await; + + registry + .write() + .await + .process(PacketSide::Serverbound, state, threshold, &packet) + .await?; + + if state == PacketState::Handshaking { + if let Some(handshake) = extrapolate_packet::(&packet) { + *state_lock.write().await = match handshake.next_state { + HandshakeNextState::Status => PacketState::Status, + HandshakeNextState::Login => PacketState::Login, + }; + } + } + + server_writer.send_packet_raw(&packet).await?; + } + }); + + let registry = packet_registry.clone(); + let state_lock = a_state.clone(); + let threshold_lock = a_threshold.clone(); + let logs_tx = a_logs_tx.clone(); + let s2c = tokio::spawn(async move { + loop { + let threshold = *threshold_lock.read().await; + server_reader.set_compression(threshold); + client_writer.set_compression(threshold); + + // server to client handling + let packet = match server_reader.recv_packet_raw().await { + Ok(packet) => packet, + Err(e) => { + client_writer.shutdown().await?; + return Err(e); + } + }; + + let state = *state_lock.read().await; + + if state == PacketState::Login { + if let Some(LoginCompressionS2c { threshold }) = extrapolate_packet(&packet) { + *threshold_lock.write().await = CompressionThreshold(threshold.0); + } + + if extrapolate_packet::(&packet).is_some() { + *state_lock.write().await = PacketState::Play; + } + } + + registry + .write() + .await + .process(PacketSide::Clientbound, state, threshold, &packet) + .await?; + + // (The check is done in this if rather than the one above, to still send the + // encryption request packet to the inspector) + if state == PacketState::Login + && extrapolate_packet::(&packet).is_some() + { + // The server is requesting encryption, we can't support that + + let disconnect_packet = LoginDisconnectS2c { + reason: "This server is running in online mode, which is unsupported by \ + the Packet Inspector." + .into_text() + .color(Color::Named(NamedColor::Red)) + .into_cow_text(), + }; + + client_writer + .send_packet_raw(&PacketFrame { + id: LoginDisconnectS2c::ID, + body: { + let mut writer = BytesMut::new().writer(); + disconnect_packet.encode(&mut writer)?; + writer.into_inner() + }, + }) + .await?; + + client_writer.shutdown().await?; + + logs_tx + .send_async(ProxyLog::ClientDisconnected( + client_addr, + DisconnectionReason::OnlineModeRequired, + )) + .await?; + + bail!("server is running in online mode"); + } + + client_writer.send_packet_raw(&packet).await?; + } + }); + + // wait for either to finish + tokio::select! { + res = c2s => res?, + res = s2c => res?, + } + } +} + +fn extrapolate_packet<'a, P>(packet: &'a PacketFrame) -> Option

+where + P: ValencePacket + Decode<'a> + Clone, +{ + if packet.id != P::ID { + return None; + } + + let mut r = &packet.body[..]; + let packet = P::decode(&mut r).ok()?; + Some(packet) +} diff --git a/vendor/valence/tools/packet_inspector/src/main.rs b/vendor/valence/tools/packet_inspector/src/main.rs new file mode 100644 index 00000000..fa7e7b0a --- /dev/null +++ b/vendor/valence/tools/packet_inspector/src/main.rs @@ -0,0 +1,46 @@ +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +mod tri_checkbox; + +mod app; +mod shared_state; + +#[tokio::main] +async fn main() -> Result<(), Box> { + let native_options = eframe::NativeOptions { + icon_data: Some(load_icon()), + initial_window_size: Some(egui::Vec2::new(1024.0, 768.0)), + decorated: true, + ..Default::default() + }; + + eframe::run_native( + "Valence Packet Inspector", + native_options, + Box::new(move |cc| { + let gui_app = app::GuiApp::new(cc); + + Box::new(gui_app) + }), + )?; + + Ok(()) +} + +fn load_icon() -> eframe::IconData { + let (icon_rgba, icon_width, icon_height) = { + let icon = include_bytes!("../../../assets/logo-256x256.png"); + let image = image::load_from_memory(icon) + .expect("Failed to open icon path") + .into_rgba8(); + let (width, height) = image.dimensions(); + let rgba = image.into_raw(); + (rgba, width, height) + }; + + eframe::IconData { + rgba: icon_rgba, + width: icon_width, + height: icon_height, + } +} diff --git a/vendor/valence/tools/packet_inspector/src/main_cli.rs b/vendor/valence/tools/packet_inspector/src/main_cli.rs new file mode 100644 index 00000000..f1bbc3a4 --- /dev/null +++ b/vendor/valence/tools/packet_inspector/src/main_cli.rs @@ -0,0 +1,86 @@ +use clap::Parser; +use packet_inspector::Packet; +use packet_inspector::Proxy; +use packet_inspector::ProxyLog; +use packet_inspector::DisconnectionReason; +use std::net::SocketAddr; +use tracing::Level; + +#[derive(Parser, Clone, Debug)] +#[clap(author, version, about)] +struct CliArgs { + /// The socket address to listen for connections on. This is the address clients should connect to + listener_addr: SocketAddr, + /// The socket address the proxy will connect to. This is the address of the server + server_addr: SocketAddr, +} + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + tracing_subscriber::fmt() + .with_max_level(Level::TRACE) + .init(); + + let args = CliArgs::parse(); + + let proxy = Proxy::start(args.listener_addr, args.server_addr).await?; + let receiver = proxy.subscribe().await; + + tokio::spawn(async move { + proxy.main_task.await??; + Ok::<(), anyhow::Error>(()) + }); + + // consumer + tokio::spawn(async move { + while let Ok(packet) = receiver.recv_async().await { + log(&packet); + } + }); + + tokio::spawn(async move { + loop { + let next = proxy.logs_rx.recv_async().await?; + match next { + ProxyLog::ClientConnected(addr) => { + tracing::trace!("Accepted a new client {addr}."); + } + ProxyLog::ClientDisconnected(addr, DisconnectionReason::Error(_)) => { + tracing::trace!("Client {addr} disconnected."); + } + ProxyLog::ClientDisconnected(addr, DisconnectionReason::OnlineModeRequired) => { + tracing::error!( + "Client {addr} was disconnected due to a server encryption request. \ + The packet inspector does not support online mode." + ); + } + } + } + + #[allow(unreachable_code)] + Ok::<(), anyhow::Error>(()) + }); + + tokio::signal::ctrl_c().await.unwrap(); + + Ok(()) +} + +fn log(packet: &Packet) { + tracing::debug!( + "{:?} -> [{:?}] 0x{:0>2X} \"{}\" {:?}", + packet.side, + packet.state, + packet.id, + packet.name, + truncated(format!("{:?}", packet.data), 512) + ); +} + +fn truncated(string: String, max_len: usize) -> String { + if string.len() > max_len { + format!("{}...", &string[..max_len]) + } else { + string + } +} diff --git a/vendor/valence/tools/packet_inspector/src/packet_io.rs b/vendor/valence/tools/packet_inspector/src/packet_io.rs new file mode 100644 index 00000000..d073db9f --- /dev/null +++ b/vendor/valence/tools/packet_inspector/src/packet_io.rs @@ -0,0 +1,200 @@ +use std::io; +use std::io::ErrorKind; + +use anyhow::ensure; +use bytes::{BufMut, BytesMut}; +use tokio::io::{AsyncReadExt, AsyncWriteExt}; +use tokio::net::TcpStream; +use valence_protocol::decode::{PacketDecoder, PacketFrame}; +use valence_protocol::encode::PacketEncoder; +use valence_protocol::{CompressionThreshold, Encode, VarInt, MAX_PACKET_SIZE}; + +pub(crate) struct PacketIoReader { + reader: tokio::io::ReadHalf, + dec: PacketDecoder, + threshold: CompressionThreshold, +} + +impl PacketIoReader { + pub(crate) async fn recv_packet_raw(&mut self) -> anyhow::Result { + loop { + if let Some(frame) = self.dec.try_next_packet()? { + // self.logger + // .log("Unknown".to_string(), self.direction.clone(), frame.clone()); + + return Ok(frame); + } + + self.dec.reserve(READ_BUF_SIZE); + let mut buf = self.dec.take_capacity(); + + if self.reader.read_buf(&mut buf).await? == 0 { + return Err(io::Error::from(ErrorKind::UnexpectedEof).into()); + } + + // This should always be an O(1) unsplit because we reserved space earlier and + // the call to `read_buf` shouldn't have grown the allocation. + self.dec.queue_bytes(buf); + } + } + + #[allow(dead_code)] + pub(crate) fn set_compression(&mut self, threshold: CompressionThreshold) { + self.threshold = threshold; + self.dec.set_compression(threshold); + } +} + +pub(crate) struct PacketIoWriter { + writer: tokio::io::WriteHalf, + enc: PacketEncoder, + threshold: CompressionThreshold, +} + +impl PacketIoWriter { + /* + No | Packet Length | VarInt | Length of (Data Length) + Compressed length of (Packet ID + Data) + No | Data Length | VarInt | Length of uncompressed (Packet ID + Data) or 0 + Yes | Packet ID | VarInt | zlib compressed packet ID (see the sections below) + Yes | Data | Byte Array | zlib compressed packet data (see the sections below) + */ + pub(crate) async fn send_packet_raw(&mut self, frame: &PacketFrame) -> anyhow::Result<()> { + let id_varint = VarInt(frame.id); + let id_buf = varint_to_bytes(id_varint); + + let mut uncompressed_packet = BytesMut::new(); + uncompressed_packet.extend_from_slice(&id_buf); + uncompressed_packet.extend_from_slice(&frame.body); + let uncompressed_packet_length = uncompressed_packet.len(); + let uncompressed_packet_length_varint = VarInt(uncompressed_packet_length as i32); + + if self.threshold.0 >= 0 { + if uncompressed_packet_length > self.threshold.0 as usize { + use std::io::Read; + + use flate2::bufread::ZlibEncoder; + use flate2::Compression; + + let mut z = ZlibEncoder::new(&uncompressed_packet[..], Compression::new(4)); + let mut compressed = Vec::new(); + + let data_len_size = uncompressed_packet_length_varint.written_size(); + + let packet_len = data_len_size + z.read_to_end(&mut compressed)?; + + ensure!( + packet_len <= MAX_PACKET_SIZE as usize, + "packet exceeds maximum length" + ); + + drop(z); + + self.enc + .append_bytes(&varint_to_bytes(VarInt(packet_len as i32))); + + self.enc + .append_bytes(&varint_to_bytes(uncompressed_packet_length_varint)); + + self.enc.append_bytes(&compressed); + + let bytes = self.enc.take(); + + self.writer.write_all(&bytes).await?; + self.writer.flush().await?; + + // now we need to compress the packet. + } else { + // no need to compress, but we do need to inject a zero + let empty = VarInt(0); + + let data_len_size = empty.written_size(); + let packet_len = data_len_size + uncompressed_packet_length; + + self.enc + .append_bytes(&varint_to_bytes(VarInt(packet_len as i32))); + self.enc.append_bytes(&varint_to_bytes(empty)); + self.enc.append_bytes(&uncompressed_packet); + let bytes = self.enc.take(); + self.writer.write_all(&bytes).await?; + self.writer.flush().await?; + } + + return Ok(()); + } + + let length = varint_to_bytes(VarInt(uncompressed_packet_length as i32)); + + // the frame should be uncompressed at this point. + self.enc.append_bytes(&length); + self.enc.append_bytes(&uncompressed_packet); + + let bytes = self.enc.take(); + + self.writer.write_all(&bytes).await?; + + Ok(()) + } + + #[allow(dead_code)] + pub(crate) fn set_compression(&mut self, threshold: CompressionThreshold) { + self.threshold = threshold; + self.enc.set_compression(threshold); + } + + pub async fn shutdown(&mut self) -> std::io::Result<()> { + self.writer.shutdown().await?; + Ok(()) + } +} + +pub(crate) struct PacketIo { + stream: TcpStream, + enc: PacketEncoder, + dec: PacketDecoder, + threshold: CompressionThreshold, +} + +const READ_BUF_SIZE: usize = 1024; + +impl PacketIo { + pub(crate) fn new(stream: TcpStream) -> Self { + Self { + stream, + enc: PacketEncoder::new(), + dec: PacketDecoder::new(), + threshold: CompressionThreshold::DEFAULT, + } + } + + pub fn split(self) -> (PacketIoReader, PacketIoWriter) { + let (reader, writer) = tokio::io::split(self.stream); + + ( + PacketIoReader { + reader, + dec: self.dec, + threshold: self.threshold, + }, + PacketIoWriter { + writer, + enc: self.enc, + threshold: self.threshold, + }, + ) + } + + #[allow(dead_code)] + pub(crate) async fn set_compression(&mut self, threshold: CompressionThreshold) { + self.threshold = threshold; + self.enc.set_compression(threshold); + self.dec.set_compression(threshold); + } +} + +pub fn varint_to_bytes(i: VarInt) -> BytesMut { + let mut buf = BytesMut::new(); + let mut writer = (&mut buf).writer(); + i.encode(&mut writer).unwrap(); + + buf +} diff --git a/vendor/valence/tools/packet_inspector/src/packet_registry.rs b/vendor/valence/tools/packet_inspector/src/packet_registry.rs new file mode 100644 index 00000000..68819496 --- /dev/null +++ b/vendor/valence/tools/packet_inspector/src/packet_registry.rs @@ -0,0 +1,120 @@ +use std::hash::{Hash, Hasher}; +use std::sync::RwLock; + +use bytes::Bytes; +use time::OffsetDateTime; +use valence_protocol::decode::PacketFrame; +use valence_protocol::{CompressionThreshold, PacketSide, PacketState}; + +pub struct PacketRegistry { + packets: RwLock>, + receiver: flume::Receiver, + sender: flume::Sender, +} + +#[allow(unused)] +impl PacketRegistry { + pub fn new() -> Self { + let (sender, receiver) = flume::unbounded::(); + + Self { + packets: RwLock::new(Vec::new()), + receiver, + sender, + } + } + + pub fn subscribe(&self) -> flume::Receiver { + self.receiver.clone() + } + + pub fn register(&self, packet: Packet) { + self.packets.write().unwrap().push(packet); + } + + // register_all(takes an array of packets) + pub fn register_all(&self, packets: &[Packet]) { + self.packets.write().unwrap().extend_from_slice(packets); + } + + fn get_specific_packet(&self, side: PacketSide, state: PacketState, packet_id: i32) -> Packet { + let time = match OffsetDateTime::now_local() { + Ok(time) => time, + Err(_) => OffsetDateTime::now_utc(), + }; + + self.packets + .read() + .unwrap() + .iter() + .find(|packet| packet.id == packet_id && packet.side == side && packet.state == state) + .unwrap_or(&Packet { + side, + state, + id: packet_id, + timestamp: Some(time), + name: "Unknown Packet", + data: None, + }) + .clone() + } + + pub async fn process( + &self, + side: PacketSide, + state: PacketState, + threshold: CompressionThreshold, + packet: &PacketFrame, + ) -> anyhow::Result<()> { + let mut p = self.get_specific_packet(side, state, packet.id); + let time = match OffsetDateTime::now_local() { + Ok(time) => time, + Err(_) => OffsetDateTime::now_utc(), + }; + + p.data = Some(packet.body.clone().freeze()); + p.timestamp = Some(time); + + // store in received_packets + self.sender.send_async(p).await?; + + Ok(()) + } +} + +impl Default for PacketRegistry { + fn default() -> Self { + Self::new() + } +} + +#[derive(Clone, Debug, Eq, serde::Serialize, serde::Deserialize)] +pub struct Packet { + pub side: PacketSide, + pub state: PacketState, + pub id: i32, + #[serde(skip)] + pub timestamp: Option, + #[serde(skip)] + pub name: &'static str, + /// Uncompressed packet data + #[serde(skip)] + pub data: Option, +} + +impl PartialEq for Packet { + fn eq(&self, other: &Self) -> bool { + self.side == other.side + && self.state == other.state + && self.id == other.id + && self.data == other.data + } +} + +impl Hash for Packet { + fn hash(&self, state: &mut H) { + self.id.hash(state); + self.side.hash(state); + self.state.hash(state); + } +} diff --git a/vendor/valence/tools/packet_inspector/src/shared_state.rs b/vendor/valence/tools/packet_inspector/src/shared_state.rs new file mode 100644 index 00000000..d21de63d --- /dev/null +++ b/vendor/valence/tools/packet_inspector/src/shared_state.rs @@ -0,0 +1,134 @@ +#![allow(clippy::mutable_key_type)] + +use std::collections::HashMap; +use std::sync::RwLock; + +use egui::Context; +use packet_inspector::Packet; + +#[derive(serde::Deserialize, serde::Serialize)] +pub struct PacketFilter { + inner: HashMap, +} + +impl PacketFilter { + pub fn new() -> Self { + let mut inner = HashMap::new(); + + for p in packet_inspector::STD_PACKETS.iter() { + inner.insert(p.clone(), true); + } + + Self { inner } + } + + pub fn get(&self, packet: &Packet) -> Option { + self.inner + .iter() + .find(|(k, _)| k.id == packet.id && k.side == packet.side && k.state == packet.state) + .map(|(_, v)| v) + .copied() + } + + pub fn insert(&mut self, packet: Packet, value: bool) { + self.inner.insert(packet, value); + } + + pub fn iter(&self) -> impl Iterator { + self.inner.iter() + } + + pub fn iter_mut(&mut self) -> impl Iterator { + self.inner.iter_mut() + } +} + +pub enum Event { + StartListening, + StopListening, + PacketReceived, +} + +#[derive(serde::Deserialize, serde::Serialize)] +pub struct SharedState { + pub listener_addr: String, + pub server_addr: String, + pub autostart: bool, + pub packet_filter: PacketFilter, + pub packet_search: String, + #[serde(skip)] + pub is_listening: bool, + #[serde(skip)] + pub selected_packet: Option, + #[serde(skip)] + pub update_scroll: bool, + #[serde(skip)] + pub packets: RwLock>, + #[serde(skip)] + pub(super) receiver: Option>, + #[serde(skip)] + sender: Option>, + #[serde(skip)] + pub ctx: Option, +} + +impl Default for SharedState { + fn default() -> Self { + let (sender, receiver) = flume::unbounded(); + + Self { + listener_addr: "127.0.0.1:25566".to_string(), + server_addr: "127.0.0.1:25565".to_string(), + autostart: false, + is_listening: false, + packet_search: String::new(), + packet_filter: PacketFilter::new(), + selected_packet: None, + update_scroll: false, + packets: RwLock::new(Vec::new()), + receiver: Some(receiver), + sender: Some(sender), + ctx: None, + } + } +} + +#[allow(unused)] +impl SharedState { + pub fn new(ctx: Context) -> Self { + Self { + ctx: Some(ctx), + ..Self::default() + } + } + pub(super) fn merge(mut self, other: Self) -> Self { + self.ctx = other.ctx; + self.sender = other.sender; + self.receiver = other.receiver; + + // make a backup of self.packet_filter + + let mut packet_filter = PacketFilter::new(); + // iterate over packet_inspector::STD_PACKETS + for p in packet_inspector::STD_PACKETS.iter() { + // if the packet is in the current packet_filter + if let Some(v) = self.packet_filter.get(p) { + // insert it into packet_filter + packet_filter.insert(p.clone(), v); + } else { + // otherwise insert it into packet_filter with a default value of true + packet_filter.insert(p.clone(), true); + } + } + + self.packet_filter = packet_filter; + + self + } + + pub fn send_event(&self, event: Event) { + if let Some(sender) = &self.sender { + sender.send(event); + } + } +} diff --git a/vendor/valence/tools/packet_inspector/src/tri_checkbox.rs b/vendor/valence/tools/packet_inspector/src/tri_checkbox.rs new file mode 100644 index 00000000..df9fbf08 --- /dev/null +++ b/vendor/valence/tools/packet_inspector/src/tri_checkbox.rs @@ -0,0 +1,134 @@ +use egui::{ + epaint, pos2, vec2, NumExt, Response, Sense, Shape, TextStyle, Ui, Vec2, Widget, WidgetInfo, + WidgetText, WidgetType, +}; + +#[derive(Clone, Copy, Debug, PartialEq)] +pub enum TriCheckboxState { + Enabled, + Partial, + Disabled, +} + +// TODO(emilk): allow checkbox without a text label +/// Boolean on/off control with text label. +/// +/// Usually you'd use [`Ui::checkbox`] instead. +/// +/// ``` +/// # egui::__run_test_ui(|ui| { +/// # let mut my_bool = true; +/// // These are equivalent: +/// ui.checkbox(&mut my_bool, "Checked"); +/// ui.add(egui::Checkbox::new(&mut my_bool, "Checked")); +/// # }); +/// ``` +#[must_use = "You should put this widget in an ui with `ui.add(widget);`"] +pub struct TriCheckbox<'a> { + checked: &'a mut TriCheckboxState, + text: WidgetText, +} + +#[allow(unused)] +impl<'a> TriCheckbox<'a> { + pub fn new(checked: &'a mut TriCheckboxState, text: impl Into) -> Self { + TriCheckbox { + checked, + text: text.into(), + } + } + + pub fn without_text(checked: &'a mut TriCheckboxState) -> Self { + Self::new(checked, WidgetText::default()) + } +} + +impl<'a> Widget for TriCheckbox<'a> { + fn ui(self, ui: &mut Ui) -> Response { + let TriCheckbox { checked, text } = self; + + let spacing = &ui.spacing(); + let icon_width = spacing.icon_width; + let icon_spacing = spacing.icon_spacing; + + let (text, mut desired_size) = if text.is_empty() { + (None, vec2(icon_width, 0.0)) + } else { + let total_extra = vec2(icon_width + icon_spacing, 0.0); + + let wrap_width = ui.available_width() - total_extra.x; + let text = text.into_galley(ui, None, wrap_width, TextStyle::Button); + + let mut desired_size = total_extra + text.size(); + desired_size = desired_size.at_least(spacing.interact_size); + + (Some(text), desired_size) + }; + + desired_size = desired_size.at_least(Vec2::splat(spacing.interact_size.y)); + desired_size.y = desired_size.y.max(icon_width); + let (rect, mut response) = ui.allocate_exact_size(desired_size, Sense::click()); + + if response.clicked() { + *checked = match *checked { + TriCheckboxState::Partial | TriCheckboxState::Disabled => TriCheckboxState::Enabled, + TriCheckboxState::Enabled => TriCheckboxState::Disabled, + }; + response.mark_changed(); + } + response.widget_info(|| { + WidgetInfo::selected( + WidgetType::Checkbox, + *checked == TriCheckboxState::Enabled, + text.as_ref().map_or("", |x| x.text()), + ) + }); + + if ui.is_rect_visible(rect) { + // Too colorful + // let visuals = ui.style().interact_selectable(&response, *checked); + let visuals = ui.style().interact(&response); + let (small_icon_rect, big_icon_rect) = ui.spacing().icon_rectangles(rect); + ui.painter().add(epaint::RectShape { + rect: big_icon_rect.expand(visuals.expansion), + rounding: visuals.rounding, + fill: visuals.bg_fill, + stroke: visuals.bg_stroke, + }); + + match *checked { + TriCheckboxState::Enabled => { + // Check mark: + ui.painter().add(Shape::line( + vec![ + pos2(small_icon_rect.left(), small_icon_rect.center().y), + pos2(small_icon_rect.center().x, small_icon_rect.bottom()), + pos2(small_icon_rect.right(), small_icon_rect.top()), + ], + visuals.fg_stroke, + )); + } + TriCheckboxState::Partial => { + // Minus sign: + ui.painter().add(Shape::line( + vec![ + pos2(small_icon_rect.left(), small_icon_rect.center().y), + pos2(small_icon_rect.right(), small_icon_rect.center().y), + ], + visuals.fg_stroke, + )); + } + _ => {} + } + if let Some(text) = text { + let text_pos = pos2( + rect.min.x + icon_width + icon_spacing, + rect.center().y - 0.5 * text.size().y, + ); + text.paint_with_visuals(ui.painter(), text_pos, visuals); + } + } + + response + } +} diff --git a/vendor/valence/tools/playground/Cargo.toml b/vendor/valence/tools/playground/Cargo.toml new file mode 100644 index 00000000..16166f0f --- /dev/null +++ b/vendor/valence/tools/playground/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "playground" +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true +publish = false + +[dependencies] +anyhow.workspace = true +clap.workspace = true +valence_math.workspace = true +tracing-subscriber.workspace = true +tracing.workspace = true +valence_server_common.workspace = true +valence.workspace = true \ No newline at end of file diff --git a/vendor/valence/tools/playground/README.md b/vendor/valence/tools/playground/README.md new file mode 100644 index 00000000..c6ba5b15 --- /dev/null +++ b/vendor/valence/tools/playground/README.md @@ -0,0 +1,3 @@ +# playground + +An environment for testing code or reproducing bugs. Checkout out CONTRIBUTING.md for more information. \ No newline at end of file diff --git a/vendor/valence/tools/playground/build.rs b/vendor/valence/tools/playground/build.rs new file mode 100644 index 00000000..4f75cfb8 --- /dev/null +++ b/vendor/valence/tools/playground/build.rs @@ -0,0 +1,21 @@ +use std::path::Path; + +fn main() { + let current = std::env::current_dir().unwrap(); + println!("current directory: {}", current.display()); + + let src = current.join(Path::new("src/playground.template.rs")); + let dst = current.join(Path::new("src/playground.rs")); + + if dst.exists() { + println!("{dst:?} already exists, skipping"); + return; + } + + if !src.exists() { + println!("{src:?} does not exist, skipping"); + return; + } + + std::fs::copy(src, dst).unwrap(); +} diff --git a/vendor/valence/tools/playground/src/.gitignore b/vendor/valence/tools/playground/src/.gitignore new file mode 100644 index 00000000..68aefd1e --- /dev/null +++ b/vendor/valence/tools/playground/src/.gitignore @@ -0,0 +1 @@ +playground.rs \ No newline at end of file diff --git a/vendor/valence/tools/playground/src/extras.rs b/vendor/valence/tools/playground/src/extras.rs new file mode 100644 index 00000000..fe4071e9 --- /dev/null +++ b/vendor/valence/tools/playground/src/extras.rs @@ -0,0 +1,23 @@ +//! Put stuff in here if you find that you have to write the same code for +//! multiple playgrounds. + +use valence::prelude::*; + +/// Toggles client's game mode between survival and creative when they start +/// sneaking. +pub fn toggle_gamemode_on_sneak( + mut clients: Query<&mut GameMode>, + mut events: EventReader, +) { + for event in events.read() { + if event.state == SneakState::Start { + if let Ok(mut mode) = clients.get_mut(event.client) { + *mode = match *mode { + GameMode::Survival => GameMode::Creative, + GameMode::Creative => GameMode::Survival, + _ => GameMode::Creative, + }; + } + } + } +} diff --git a/vendor/valence/tools/playground/src/main.rs b/vendor/valence/tools/playground/src/main.rs new file mode 100644 index 00000000..d5301cbc --- /dev/null +++ b/vendor/valence/tools/playground/src/main.rs @@ -0,0 +1,47 @@ +#![doc = include_str!("../README.md")] +#![deny( + rustdoc::broken_intra_doc_links, + rustdoc::private_intra_doc_links, + rustdoc::missing_crate_level_docs, + rustdoc::invalid_codeblock_attributes, + rustdoc::invalid_rust_codeblocks, + rustdoc::bare_urls, + rustdoc::invalid_html_tags +)] +#![warn( + trivial_casts, + trivial_numeric_casts, + unused_lifetimes, + unused_import_braces, + clippy::dbg_macro +)] + +use clap::Parser; +use tracing::Level; +use valence::app::App; +use valence::log::LogPlugin; + +#[allow(dead_code)] +mod extras; +mod playground; + +#[derive(Parser)] +struct Args { + #[arg(short, default_value_t = Level::DEBUG)] + log_level: Level, +} + +fn main() { + let args = Args::parse(); + + let mut app = App::new(); + + app.add_plugins(LogPlugin { + level: args.log_level, + ..Default::default() + }); + + playground::build_app(&mut app); + + app.run(); +} diff --git a/vendor/valence/tools/playground/src/playground.template.rs b/vendor/valence/tools/playground/src/playground.template.rs new file mode 100644 index 00000000..01476ed5 --- /dev/null +++ b/vendor/valence/tools/playground/src/playground.template.rs @@ -0,0 +1,77 @@ +use valence::log::LogPlugin; +use valence::prelude::*; + +#[allow(unused_imports)] +use crate::extras::*; + +const SPAWN_Y: i32 = 64; + +pub fn build_app(app: &mut App) { + app.insert_resource(NetworkSettings { + connection_mode: ConnectionMode::Offline, + ..Default::default() + }) + .add_plugins(DefaultPlugins.build().disable::()) + .add_systems(Startup, setup) + .add_systems(EventLoopUpdate, toggle_gamemode_on_sneak) + .add_systems(Update, (init_clients, despawn_disconnected_clients)) + .run(); +} + +fn setup( + mut commands: Commands, + server: Res, + biomes: Res, + dimensions: Res, +) { + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + for z in -5..5 { + for x in -5..5 { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + for z in -25..25 { + for x in -25..25 { + layer + .chunk + .set_block([x, SPAWN_Y, z], BlockState::GRASS_BLOCK); + } + } + + commands.spawn(layer); +} + +fn init_clients( + mut clients: Query< + ( + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut Position, + &mut GameMode, + ), + Added, + >, + layers: Query, With)>, +) { + for ( + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut pos, + mut game_mode, + ) in &mut clients + { + let layer = layers.single(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.0.insert(layer); + pos.set([0.0, SPAWN_Y as f64 + 1.0, 0.0]); + *game_mode = GameMode::Creative; + } +} + +// Add more systems here! diff --git a/vendor/valence/tools/stresser/Cargo.toml b/vendor/valence/tools/stresser/Cargo.toml new file mode 100644 index 00000000..60ec3ffe --- /dev/null +++ b/vendor/valence/tools/stresser/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "stresser" +description = "A stresser for Valence Minecraft server framework development purposes" +authors = ["qualterz "] +version.workspace = true +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true +publish = false + +[dependencies] +anyhow.workspace = true +clap.workspace = true +tokio.workspace = true +uuid = { workspace = true, features = ["v4"] } +valence_protocol.workspace = true diff --git a/vendor/valence/tools/stresser/README.md b/vendor/valence/tools/stresser/README.md new file mode 100644 index 00000000..372db154 --- /dev/null +++ b/vendor/valence/tools/stresser/README.md @@ -0,0 +1,13 @@ +# stresser + +A Minecraft client for testing server performance under heavy load. (Incomplete) + +## Usage + +``` +# Run the example in valence +cargo run --example bench_players + +# Run the stressor tool in tools/stresser +cargo run -p stresser -- --target 127.0.0.1:25565 --count 1000 +``` \ No newline at end of file diff --git a/vendor/valence/tools/stresser/src/args.rs b/vendor/valence/tools/stresser/src/args.rs new file mode 100644 index 00000000..e7e33d7d --- /dev/null +++ b/vendor/valence/tools/stresser/src/args.rs @@ -0,0 +1,29 @@ +use clap::{arg, command, Parser}; + +#[derive(Parser)] +#[command(author, version, about)] +pub(crate) struct StresserArgs { + /// IPv4/IPv6/DNS address of a server. + #[arg(short = 't', long = "target")] + pub target_host: String, + + /// Number of sessions. + #[arg(short = 'c', long = "count")] + pub sessions_count: usize, + + /// Name prefix of sessions. + #[arg(default_value = "Stresser")] + #[arg(short = 'n', long = "name")] + pub name_prefix: String, + + /// Spawn cooldown of sessions in milliseconds. + /// The lower the value, the more frequently sessions are spawned. + #[arg(default_value = "10")] + #[arg(long = "cooldown")] + pub spawn_cooldown: u64, + + /// Read buffer size in bytes. + #[arg(default_value = "4096")] + #[arg(long = "read-buffer")] + pub read_buffer_size: usize, +} diff --git a/vendor/valence/tools/stresser/src/main.rs b/vendor/valence/tools/stresser/src/main.rs new file mode 100644 index 00000000..91cf49c2 --- /dev/null +++ b/vendor/valence/tools/stresser/src/main.rs @@ -0,0 +1,62 @@ +#![doc = include_str!("../README.md")] +#![deny( + rustdoc::broken_intra_doc_links, + rustdoc::private_intra_doc_links, + rustdoc::missing_crate_level_docs, + rustdoc::invalid_codeblock_attributes, + rustdoc::invalid_rust_codeblocks, + rustdoc::bare_urls, + rustdoc::invalid_html_tags +)] +#![warn( + trivial_casts, + trivial_numeric_casts, + unused_lifetimes, + unused_import_braces, + clippy::dbg_macro +)] + +use core::time::Duration; +use std::net::ToSocketAddrs; +use std::sync::Arc; + +use args::StresserArgs; +use clap::Parser; +use stresser::{make_session, SessionParams}; +use tokio::sync::Semaphore; + +mod args; +pub mod stresser; + +#[tokio::main] +async fn main() { + let args = StresserArgs::parse(); + + let target_addr = args.target_host.to_socket_addrs().unwrap().next().unwrap(); + + let mut session_index: usize = 0; + + let sema = Arc::new(Semaphore::new(args.sessions_count)); + + while let Ok(perm) = sema.clone().acquire_owned().await { + let session_name = format!("{}{}", args.name_prefix, session_index); + + tokio::spawn(async move { + let params = SessionParams { + socket_addr: target_addr, + session_name: session_name.as_str(), + read_buffer_size: args.read_buffer_size, + }; + + if let Err(err) = make_session(¶ms).await { + eprintln!("Session {session_name} interrupted with error: {err}") + }; + + drop(perm); + }); + + session_index += 1; + + tokio::time::sleep(Duration::from_millis(args.spawn_cooldown)).await; + } +} diff --git a/vendor/valence/tools/stresser/src/stresser.rs b/vendor/valence/tools/stresser/src/stresser.rs new file mode 100644 index 00000000..13181a53 --- /dev/null +++ b/vendor/valence/tools/stresser/src/stresser.rs @@ -0,0 +1,153 @@ +use std::io::{self, ErrorKind}; +use std::net::SocketAddr; + +use anyhow::bail; +use tokio::io::AsyncWriteExt; +use tokio::net::TcpStream; +use uuid::Uuid; +use valence_protocol::packets::handshaking::handshake_c2s::HandshakeNextState; +use valence_protocol::packets::handshaking::HandshakeC2s; +use valence_protocol::packets::login::{ + LoginCompressionS2c, LoginHelloC2s, LoginHelloS2c, LoginSuccessS2c, +}; +use valence_protocol::packets::play::{ + KeepAliveC2s, KeepAliveS2c, PlayerPositionLookS2c, PositionAndOnGroundC2s, TeleportConfirmC2s, +}; +use valence_protocol::var_int::VarInt; +use valence_protocol::{ + CompressionThreshold, Packet, PacketDecoder, PacketEncoder, PROTOCOL_VERSION, +}; + +pub struct SessionParams<'a> { + pub socket_addr: SocketAddr, + pub session_name: &'a str, + pub read_buffer_size: usize, +} + +pub async fn make_session<'a>(params: &SessionParams<'a>) -> anyhow::Result<()> { + let sock_addr = params.socket_addr; + let sess_name = params.session_name; + let rb_size = params.read_buffer_size; + + let mut conn = match TcpStream::connect(sock_addr).await { + Ok(conn) => { + println!("{sess_name} connected"); + conn + } + Err(err) => { + eprintln!("{sess_name} connection failed"); + return Err(err.into()); + } + }; + + conn.set_nodelay(true)?; + + let mut dec = PacketDecoder::new(); + let mut enc = PacketEncoder::new(); + + let server_addr_str = sock_addr.ip().to_string(); + + let handshake_pkt = HandshakeC2s { + protocol_version: VarInt(PROTOCOL_VERSION), + server_address: server_addr_str.as_str().into(), + server_port: sock_addr.port(), + next_state: HandshakeNextState::Login, + }; + + enc.append_packet(&handshake_pkt)?; + + enc.append_packet(&LoginHelloC2s { + username: sess_name.into(), + profile_id: Some(Uuid::new_v4()), + })?; + + let write_buf = enc.take(); + conn.write_all(&write_buf).await?; + + loop { + dec.reserve(rb_size); + + let mut read_buf = dec.take_capacity(); + + conn.readable().await?; + + match conn.try_read_buf(&mut read_buf) { + Ok(0) => return Err(io::Error::from(ErrorKind::UnexpectedEof).into()), + Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => continue, + Err(e) => return Err(e.into()), + Ok(_) => (), + }; + + dec.queue_bytes(read_buf); + + if let Ok(Some(frame)) = dec.try_next_packet() { + match frame.id { + LoginCompressionS2c::ID => { + let packet: LoginCompressionS2c = frame.decode()?; + let threshold = packet.threshold.0; + + dec.set_compression(CompressionThreshold(threshold)); + enc.set_compression(CompressionThreshold(threshold)); + } + + LoginSuccessS2c::ID => { + break; + } + + LoginHelloS2c::ID => { + bail!("encryption not implemented"); + } + + _ => (), + } + } + } + + println!("{sess_name} logged in"); + + loop { + while let Some(frame) = dec.try_next_packet()? { + match frame.id { + KeepAliveS2c::ID => { + let packet: KeepAliveS2c = frame.decode()?; + enc.clear(); + + enc.append_packet(&KeepAliveC2s { id: packet.id })?; + conn.write_all(&enc.take()).await?; + } + + PlayerPositionLookS2c::ID => { + let packet: PlayerPositionLookS2c = frame.decode()?; + enc.clear(); + + enc.append_packet(&TeleportConfirmC2s { + teleport_id: packet.teleport_id, + })?; + + enc.append_packet(&PositionAndOnGroundC2s { + position: packet.position, + on_ground: true, + })?; + + conn.write_all(&enc.take()).await?; + } + _ => (), + } + } + + dec.reserve(rb_size); + + let mut read_buf = dec.take_capacity(); + + conn.readable().await?; + + match conn.try_read_buf(&mut read_buf) { + Ok(0) => return Err(io::Error::from(ErrorKind::UnexpectedEof).into()), + Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => continue, + Err(e) => return Err(e.into()), + Ok(_) => (), + }; + + dec.queue_bytes(read_buf); + } +} diff --git a/vendor/valence/typos.toml b/vendor/valence/typos.toml new file mode 100644 index 00000000..ad9370a6 --- /dev/null +++ b/vendor/valence/typos.toml @@ -0,0 +1,5 @@ +[files] +extend-exclude = ["*.svg", "*.json", "crates/java_string/src/slice.rs"] + +[default] +extend-ignore-re = ['\d+ths', 'CC BY-NC-ND', "trUe", "fAlse"] diff --git a/vendor/valence/website/.gitignore b/vendor/valence/website/.gitignore new file mode 100644 index 00000000..a48cf0de --- /dev/null +++ b/vendor/valence/website/.gitignore @@ -0,0 +1 @@ +public diff --git a/vendor/valence/website/README.md b/vendor/valence/website/README.md new file mode 100644 index 00000000..cb3531da --- /dev/null +++ b/vendor/valence/website/README.md @@ -0,0 +1,44 @@ +# Valence.rs + +This website is built using the Static Site Generator [Zola](https://github.com/getzola/zola). +The theme is derived from https://github.com/huhu/juice. + +All colors can be edited in `templates/_variables.html`. + +## Building + +The entire page including the [mdbook](https://github.com/rust-lang/mdBook) and the nightly RustDoc can be built using `./build.sh`. The contents will be output in `./public`. + +## Testing + +To test the website locally you can execute `./build.sh` and serve the contents through +``` +$ python -m http.server -d public +``` +or any other similar http server. + +To test on GitHub pages: +1. Change the source for Pages deployments in the Repository Settings > Pages to GitHub Actions. +2. This step is only needed if you don't put a custom domain in front of Pages: Change the `base_url` in `./config.toml` to `//` as GitHub Pages deployments for repositories aren't available at `/`. +3. Push to main or manually start the workflow in the Actions-tab on GitHub. + +## Deployment + +The deployment process is stated above in the Testing-section. + +## Contribute Content to the Site + +### Contribute to the FAQ / News + +All contents are made in plain Markdown defined by [CommonMark](https://commonmark.org/). +A new FAQ / News entry can be added by simply creating a new Heading in `./content/faq.md` or `./content/news.md` respectively. + +This can be tested locally by using `zola serve`. + +### Contribute to the book + +The book is made using mdbook and the source file lay in `./book/`. +See the [official documentation](https://rust-lang.github.io/mdBook/format/index.html) for how to create new pages. + +This can be tested locally by using `mdbook serve`. + diff --git a/vendor/valence/website/book.toml b/vendor/valence/website/book.toml new file mode 100644 index 00000000..ac722a37 --- /dev/null +++ b/vendor/valence/website/book.toml @@ -0,0 +1,8 @@ +[book] +language = "en" +multilingual = false +src = "book" +title = "Valence Documentation" + +[build] +build-dir = "public/book" diff --git a/vendor/valence/website/book/1-getting-started/setup.md b/vendor/valence/website/book/1-getting-started/setup.md new file mode 100644 index 00000000..ea0758c4 --- /dev/null +++ b/vendor/valence/website/book/1-getting-started/setup.md @@ -0,0 +1,118 @@ +# Before You Start + +We recommend you get familiar with Bevy's Entity Component System architecture and API, as Valence uses the exact same crate for its ECS. You can find [Bevy's introduction to ECS here](https://bevyengine.org/learn/book/getting-started/ecs/). + +You should also download Minecraft, obviously. You can use any launcher you'd like, but we recommend using the [Prism Launcher](https://prismlauncher.org/) as it will let you run offline mode clients a bit easier. + +# Getting Started + +The first thing you'll need to do is create a new binary Rust project. You can do this by running `cargo new --bin my_project` in your terminal. Once you've done that, you'll need to add Valence as a dependency: + +```bash +cargo add valence +``` + +Next, you'll need to set up a new `App` in `main()`. This is the bare minimum you need to get a Valence app running. + +```rust +use valence::prelude::*; + +fn main() { + App::new() + .add_plugins(DefaultPlugins) + .run(); +} +``` + +If you run this and try to join the server, you'll see "Joining world..." and then... nothing. It just sits there. That's because we need to tell the client what position to spawn at. Let's fix that. + +# Hello World + +Let's add a startup system that will put a single block under the spawn position. There's gonna be a lot of new stuff here, but don't worry, we'll briefly touch on most of it. + +Chunk Layers are the way Valence handles worlds. A client can only view a single chunk layer at a time. So the first thing we need to do is create a new pair of chunk and entity layers (`LayerBundle`), add some chunks to it, and then set our desired block in the world. + +```rust +fn setup( + mut commands: Commands, + server: Res, + biomes: Res, + dimensions: Res, +) { + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + // We have to add chunks to the world first, they start empty. + for z in -5..5 { + for x in -5..5 { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + // This actually sets the block in the world. + layer + .chunk + .set_block([0, 64, 0], BlockState::GRASS_BLOCK); + + // This spawns the layer into the world. + commands.spawn(layer); +} +``` + +Now we need to handle clients when they join the server. Valence automatically spawns a new entity for each client that joins the server, we just need to add a system detects when clients are added. + +```rust +fn init_clients( + mut clients: Query< + ( + &mut EntityLayerId, + &mut VisibleChunkLayer, + &mut VisibleEntityLayers, + &mut Position, + &mut GameMode, + ), + Added, + >, + layers: Query, With)>, +) { + for ( + mut layer_id, + mut visible_chunk_layer, + mut visible_entity_layers, + mut pos, + mut game_mode, + ) in &mut clients + { + let layer = layers.single(); + + layer_id.0 = layer; + visible_chunk_layer.0 = layer; + visible_entity_layers.insert(layer); + pos.set([0.5, 65.0, 0.5]); + *game_mode = GameMode::Creative; + } +} +``` + +So what's going on here? Similar to chunk layers, there are also entity layers. However, unlike chunk layers, a client can view any number of entity layers. These can be used to show different entities to different clients. + +So from top to bottom this code does the following: + +1. Sets the client's _player entity_ to the layer we created in `setup()`. This makes the player visible to other clients viewing this layer. +2. Sets the client's visible chunk layer to the layer we created in `setup()`. +3. Sets the client's visible entity layers to include the layer we created in `setup()`. +4. Sets the client's position to the spawn position. +5. Sets the client's game mode to creative. + +Finally, we'll need to add these systems to our `App`: + +```rust +fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, setup) + .add_systems(Update, init_clients) + .run(); +} +``` + +That's it! You should now be able to run your server and join it from Minecraft. You should see a single grass block under your feet, and be able to move around and jump. diff --git a/vendor/valence/website/book/SUMMARY.md b/vendor/valence/website/book/SUMMARY.md new file mode 100644 index 00000000..a72f6fd9 --- /dev/null +++ b/vendor/valence/website/book/SUMMARY.md @@ -0,0 +1,7 @@ +# Summary + +- [Introduction](introduction.md) +- [Getting Started](1-getting-started/setup.md) + +# Developer Guide + diff --git a/vendor/valence/website/book/introduction.md b/vendor/valence/website/book/introduction.md new file mode 100644 index 00000000..e10b99d0 --- /dev/null +++ b/vendor/valence/website/book/introduction.md @@ -0,0 +1 @@ +# Introduction diff --git a/vendor/valence/website/build.sh b/vendor/valence/website/build.sh new file mode 100755 index 00000000..802f84d4 --- /dev/null +++ b/vendor/valence/website/build.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env sh + +# This script builds the website and outputs ready-to-serve contents in ./public/ +# +# Requirements: +# - zola https://www.getzola.org/documentation/getting-started/installation/ +# - cargo https://doc.rust-lang.org/cargo/getting-started/installation.html +# - mdBook https://rust-lang.github.io/mdBook/guide/installation.html + +set -eu + +# cd into this directory +cd "$(dirname "$0")" + +# clean the ./public directory +rm -rf public/* + +# build zola +zola build + +# build mdBook +mdbook build + +# build rustdoc +mkdir public/rustdoc +RUSTDOCFLAGS='--cfg unstable_doc' cargo doc --no-deps --workspace --all-features +cp -r ../target/doc/* public/rustdoc + +# copy logo assets +cp ../assets/logo.svg public/valence.svg diff --git a/vendor/valence/website/config.toml b/vendor/valence/website/config.toml new file mode 100644 index 00000000..5a2d09df --- /dev/null +++ b/vendor/valence/website/config.toml @@ -0,0 +1,29 @@ +# The URL the site will be built for +base_url = "/" + +title = "Valence - A Minecraft server framework" + +# Whether to automatically compile all Sass files in the sass directory +compile_sass = true + +# When set to "true", the generated HTML files are minified. +minify_html = true + +[markdown] +# Whether to do syntax highlighting +# Theme can be customised by setting the `highlight_theme` variable to a theme supported by Zola +highlight_code = true + +# The theme to use for code highlighting. +highlight_theme = "css" +highlight_themes_css = [{ theme = "one-dark", filename = "syntax-theme.css" }] + +[extra] +juice_extra_menu = [ + { title = "Discord", link = "https://discord.gg/8Fqqy9XrYb" }, + { title = "GitHub", link = "https://github.com/valence-rs/valence" }, +] + +juice_logo_name = "Valence" +juice_logo_path = "valence.svg" +repository_url = "https://github.com/valence-rs/valence" diff --git a/vendor/valence/website/content/_index.md b/vendor/valence/website/content/_index.md new file mode 100644 index 00000000..daf8f0e4 --- /dev/null +++ b/vendor/valence/website/content/_index.md @@ -0,0 +1,5 @@ ++++ +title = "Valence" +sort_by = "weight" ++++ + diff --git a/vendor/valence/website/content/faq.md b/vendor/valence/website/content/faq.md new file mode 100644 index 00000000..793b96f8 --- /dev/null +++ b/vendor/valence/website/content/faq.md @@ -0,0 +1,13 @@ ++++ +title = "FAQ" +description = "Frequently Asked Questions" +weight = 4 ++++ + +# Can I use Valence as a replacement for a Vanilla Minecraft Server? + +No. + +Valence is a Minecraft server *framework*. The goal of Valence is to provide a platform for developers to build custom Minecraft servers. **Valence, on its own, is not a direct replacement for a Vanilla Minecraft server.** However, it should be flexible enough to build a Vanilla Minecraft server on top of it. You just have to implement the game logic yourself. + +Valence is best suited for building minigame servers that can handle large amounts of players. It intentionally implements the least amount of Vanilla Minecraft so that you can appropriately override and customize the logic. diff --git a/vendor/valence/website/content/news.md b/vendor/valence/website/content/news.md new file mode 100644 index 00000000..70a62f4e --- /dev/null +++ b/vendor/valence/website/content/news.md @@ -0,0 +1,6 @@ ++++ +title = "News" +description = "News" +weight = 5 ++++ + diff --git a/vendor/valence/website/sass/_markdown.scss b/vendor/valence/website/sass/_markdown.scss new file mode 100644 index 00000000..8b02f46f --- /dev/null +++ b/vendor/valence/website/sass/_markdown.scss @@ -0,0 +1,45 @@ +.content { + padding: 0 40px; + display: flex; + flex-direction: column; + overflow-x: auto; +} + +.content pre { + overflow-x: auto; + padding: .6rem .75rem; + white-space: pre; + word-wrap: normal; + background-color: var(--code-background-color); + color: var(--code-color); + font-size: .875em; + font-family: monospace; +} + +.content code { + background-color: var(--code-background-color); + color: var(--code-color); + font-size: .875em; + font-weight: normal; + padding: 0.25em 0.5em; + font-family: monospace; +} + +.content pre code { + padding: 0; +} + +.content a { + color: var(--primary-link-color); + + &:hover { + text-decoration: underline; + } +} + +.content blockquote { + border-left: #e2dede 8px solid; + margin: 0; + background-color: #f2f1f0; + padding: 0 20px; +} diff --git a/vendor/valence/website/sass/_text.scss b/vendor/valence/website/sass/_text.scss new file mode 100644 index 00000000..d63a3778 --- /dev/null +++ b/vendor/valence/website/sass/_text.scss @@ -0,0 +1,40 @@ +.heading-text { + font-family: var(--header-font-family); + font-size: 32px; + font-weight: 600; + padding: 10px 0 10px 0; + margin: 0.5rem 0; + color: var(--primary-text-color); +} + +h1, .title-text { + font-family: var(--header-font-family); + font-size: 25px; + font-weight: 500; + color: var(--primary-text-color); + border-left: var(--primary-color) 8px solid; + padding-left: 10px; +} + +h2, .subtitle-text { + font-family: var(--header-font-family); + font-size: 20px; + font-weight: 500; + color: var(--primary-text-color); +} + +.text { + font-family: var(--text-font-family); + font-size: 18px; + font-weight: 400; + line-height: 26px; + letter-spacing: 0.2px; + color: var(--primary-text-color); +} + +.subtext { + font-family: var(--text-font-family); + font-size: 16px; + font-weight: 400; + letter-spacing: 0.1px; +} diff --git a/vendor/valence/website/sass/_ultility.scss b/vendor/valence/website/sass/_ultility.scss new file mode 100644 index 00000000..59b76e9a --- /dev/null +++ b/vendor/valence/website/sass/_ultility.scss @@ -0,0 +1,13 @@ +.text-center { + text-align: center; +} + +.pos-absolute { + right: 0; + left: 0; + position: absolute; +} + +.box-shadow { + box-shadow: 0 2px 10px 2px var(--shadow-color); +} diff --git a/vendor/valence/website/sass/juice.scss b/vendor/valence/website/sass/juice.scss new file mode 100644 index 00000000..90e76e9e --- /dev/null +++ b/vendor/valence/website/sass/juice.scss @@ -0,0 +1,217 @@ +@import "_ultility.scss"; +@import "_text.scss"; +@import "_markdown.scss"; + +body { + padding: 0; + margin: 0; + box-sizing: border-box; + background-color: var(--secondary-color); + display: flex; + flex-direction: column; + min-height: 100vh; +} + +a { + text-decoration: none; +} + +ul { + margin-top: 0.5rem; +} + +ul > li { + padding: 0.3rem 0; +} + +p > img { + width: 100%; + height: auto; +} + +header { + background-color: var(--primary-color); + color: var(--primary-text-color); + padding: 20px 50px; + display: flex; + align-items: center; + justify-content: space-between; +} + +.logo { + font-family: "Alfa Slab One", serif; + font-size: 32px; + color: var(--primary-text-color); + display: flex; + align-items: center; + margin: 0 40px; + + img { + width: 60px; + margin: 0 25px; + } +} + +.nav-item { + margin: 0 10px; + text-decoration: none; + font-size: 20px; + font-weight: bold; + + &:hover { + color: var(--primary-text-color-over); + text-decoration: underline; + } +} + +.hero { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-evenly; + background-color: var(--primary-color); + padding: 3rem 40px; + position: relative; + overflow: hidden; + height: 100%; + + .explore-more { + position: absolute; + bottom: 20px; + cursor: pointer; + } +} + + // only apply this when the screen is small + @media screen and (min-width: 1300px) { + .hero { + flex-wrap: nowrap + } +} + +.hero-code { + position: relative; +} + +main { + display: flex; + padding: 50px 100px; + flex-grow: 1; + + .toc { + max-width: 260px; + min-width: 240px; + } + + .toc-item { + padding: 10px 20px; + color: #424242; + } + + .toc-item a, + .toc-item-child a { + color: var(--secondary-text-color); + + &:hover { + cursor: pointer; + text-decoration: underline; + } + } + + .toc-item a.active, + .toc-item-child a.active { + color: var(--toc-highlight-text-color); + } + + .toc-item-child { + padding: 0 30px 5px; + color: #424242; + } +} + +.toc-sticky { + border-radius: 3px; + border-top: 5px solid var(--primary-color); + background-color: var(--toc-background-color); + position: sticky; + position: -webkit-sticky; + position: -moz-sticky; + position: -ms-sticky; + position: -o-sticky; + top: 10px; + padding: 10px 0 20px; + max-height: 100vh; + overflow: auto; +} + +footer { + padding: 50px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + flex-wrap: wrap; + background-color: var(--primary-color); + color: var(--primary-text-color); + text-align: center; + line-height: 1.5; + white-space: pre-wrap; + + a { + color: #fcfcfc; + text-decoration: underline; + } +} + +footer > small * { + margin: auto 1rem; + display: inline-block; +} + +@media screen and (min-width: 1280px) { + .content { + max-width: 60%; + min-width: 800px; + } +} + +@media screen and (max-width: 768px) { + header { + padding: 10px 30px; + flex-direction: column; + align-items: center; + justify-content: center; + } + + .logo { + font-size: 28px; + margin: 10px; + + img { + width: 45px; + margin: 0 10px 0 0; + } + } + + .nav-item { + margin: 0 5px; + font-size: 14px; + } + + .hero { + padding: 40px 30px; + } + + main { + padding: 30px; + } + + .content { + padding: 0; + } + + .explore-more, + .toc { + display: none; + } +} diff --git a/vendor/valence/website/static/favicon.ico b/vendor/valence/website/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ed2771215731bd784e3a0348441dc3ad983f2fa2 GIT binary patch literal 176974 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 code[class*="language-"] { + font-size: 1em; +} + +pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #6a51e6; +} + +pre[class*="language-"]::selection, pre[class*="language-"] ::selection, +code[class*="language-"]::selection, code[class*="language-"] ::selection { + text-shadow: none; + background: #6a51e6; +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1rem; + border-radius: 10px; + margin: .5em 0; + overflow: auto; +} + +pre[data-file]::before { + content: attr(data-file); + color: gray; + line-height: 1; + text-align: center; + font-size: 1rem; + margin-bottom: 0.4rem; + position: absolute; + left: 50%; + transform: translateX(-50%); +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: #6c6783; +} + +.token.punctuation { + color: #6c6783; +} + +.token.namespace { + opacity: .7; +} + +.token.tag, +.token.operator, +.token.number { + color: #e09142; +} + +.token.property, +.token.function { + color: #9a86fd; +} + +.token.tag-id, +.token.selector, +.token.atrule-id { + color: #eeebff; +} + +code.language-javascript, +.token.attr-name { + color: #c4b9fe; +} + +code.language-css, +code.language-scss, +.token.boolean, +.token.string, +.token.entity, +.token.url, +.language-css .token.string, +.language-scss .token.string, +.style .token.string, +.token.attr-value, +.token.keyword, +.token.control, +.token.directive, +.token.unit, +.token.statement, +.token.regex, +.token.atrule { + color: #ffcc99; +} + +.token.placeholder, +.token.variable { + color: #ffcc99; +} + +.token.deleted { + text-decoration: line-through; +} + +.token.inserted { + border-bottom: 1px dotted #eeebff; + text-decoration: none; +} + +.token.italic { + font-style: italic; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.important { + color: #c4b9fe; +} + +.token.entity { + cursor: help; +} + +pre > code.highlight { + outline: .4em solid #8a75f5; + outline-offset: .4em; +} + +/* overrides color-values for the Line Numbers plugin + * http://prismjs.com/plugins/line-numbers/ + */ +.line-numbers.line-numbers .line-numbers-rows { + border-right-color: #2c2937; +} + +.line-numbers .line-numbers-rows > span:before { + color: #3c3949; +} + +/* overrides color-values for the Line Highlight plugin +* http://prismjs.com/plugins/line-highlight/ +*/ +.line-highlight.line-highlight { + background: rgba(224, 145, 66, 0.2); + background: -webkit-linear-gradient(left, rgba(224, 145, 66, 0.2) 70%, rgba(224, 145, 66, 0)); + background: linear-gradient(to right, rgba(224, 145, 66, 0.2) 70%, rgba(224, 145, 66, 0)); +} diff --git a/vendor/valence/website/static/prism.js b/vendor/valence/website/static/prism.js new file mode 100644 index 00000000..d13b80cf --- /dev/null +++ b/vendor/valence/website/static/prism.js @@ -0,0 +1,256 @@ +/* PrismJS 1.29.0 +https://prismjs.com/download.html#themes=prism-tomorrow&languages=rust&plugins=line-numbers */ +var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(e){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,r={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof i?new i(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=g.reach);A+=w.value.length,w=w.next){var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){var P,L=1;if(y){if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(jg.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){var I={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a"+i.content+""},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); +!function(e){for(var a="/\\*(?:[^*/]|\\*(?!/)|/(?!\\*)|)*\\*/",t=0;t<2;t++)a=a.replace(//g,(function(){return a}));a=a.replace(//g,(function(){return"[^\\s\\S]"})),e.languages.rust={comment:[{pattern:RegExp("(^|[^\\\\])"+a),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(Prism); +(function () { + + if (typeof Prism === 'undefined' || typeof document === 'undefined') { + return; + } + + /** + * Plugin name which is used as a class name for

 which is activating the plugin
+	 *
+	 * @type {string}
+	 */
+	var PLUGIN_NAME = 'line-numbers';
+
+	/**
+	 * Regular expression used for determining line breaks
+	 *
+	 * @type {RegExp}
+	 */
+	var NEW_LINE_EXP = /\n(?!$)/g;
+
+
+	/**
+	 * Global exports
+	 */
+	var config = Prism.plugins.lineNumbers = {
+		/**
+		 * Get node for provided line number
+		 *
+		 * @param {Element} element pre element
+		 * @param {number} number line number
+		 * @returns {Element|undefined}
+		 */
+		getLine: function (element, number) {
+			if (element.tagName !== 'PRE' || !element.classList.contains(PLUGIN_NAME)) {
+				return;
+			}
+
+			var lineNumberRows = element.querySelector('.line-numbers-rows');
+			if (!lineNumberRows) {
+				return;
+			}
+			var lineNumberStart = parseInt(element.getAttribute('data-start'), 10) || 1;
+			var lineNumberEnd = lineNumberStart + (lineNumberRows.children.length - 1);
+
+			if (number < lineNumberStart) {
+				number = lineNumberStart;
+			}
+			if (number > lineNumberEnd) {
+				number = lineNumberEnd;
+			}
+
+			var lineIndex = number - lineNumberStart;
+
+			return lineNumberRows.children[lineIndex];
+		},
+
+		/**
+		 * Resizes the line numbers of the given element.
+		 *
+		 * This function will not add line numbers. It will only resize existing ones.
+		 *
+		 * @param {HTMLElement} element A `
` element with line numbers.
+		 * @returns {void}
+		 */
+		resize: function (element) {
+			resizeElements([element]);
+		},
+
+		/**
+		 * Whether the plugin can assume that the units font sizes and margins are not depended on the size of
+		 * the current viewport.
+		 *
+		 * Setting this to `true` will allow the plugin to do certain optimizations for better performance.
+		 *
+		 * Set this to `false` if you use any of the following CSS units: `vh`, `vw`, `vmin`, `vmax`.
+		 *
+		 * @type {boolean}
+		 */
+		assumeViewportIndependence: true
+	};
+
+	/**
+	 * Resizes the given elements.
+	 *
+	 * @param {HTMLElement[]} elements
+	 */
+	function resizeElements(elements) {
+		elements = elements.filter(function (e) {
+			var codeStyles = getStyles(e);
+			var whiteSpace = codeStyles['white-space'];
+			return whiteSpace === 'pre-wrap' || whiteSpace === 'pre-line';
+		});
+
+		if (elements.length == 0) {
+			return;
+		}
+
+		var infos = elements.map(function (element) {
+			var codeElement = element.querySelector('code');
+			var lineNumbersWrapper = element.querySelector('.line-numbers-rows');
+			if (!codeElement || !lineNumbersWrapper) {
+				return undefined;
+			}
+
+			/** @type {HTMLElement} */
+			var lineNumberSizer = element.querySelector('.line-numbers-sizer');
+			var codeLines = codeElement.textContent.split(NEW_LINE_EXP);
+
+			if (!lineNumberSizer) {
+				lineNumberSizer = document.createElement('span');
+				lineNumberSizer.className = 'line-numbers-sizer';
+
+				codeElement.appendChild(lineNumberSizer);
+			}
+
+			lineNumberSizer.innerHTML = '0';
+			lineNumberSizer.style.display = 'block';
+
+			var oneLinerHeight = lineNumberSizer.getBoundingClientRect().height;
+			lineNumberSizer.innerHTML = '';
+
+			return {
+				element: element,
+				lines: codeLines,
+				lineHeights: [],
+				oneLinerHeight: oneLinerHeight,
+				sizer: lineNumberSizer,
+			};
+		}).filter(Boolean);
+
+		infos.forEach(function (info) {
+			var lineNumberSizer = info.sizer;
+			var lines = info.lines;
+			var lineHeights = info.lineHeights;
+			var oneLinerHeight = info.oneLinerHeight;
+
+			lineHeights[lines.length - 1] = undefined;
+			lines.forEach(function (line, index) {
+				if (line && line.length > 1) {
+					var e = lineNumberSizer.appendChild(document.createElement('span'));
+					e.style.display = 'block';
+					e.textContent = line;
+				} else {
+					lineHeights[index] = oneLinerHeight;
+				}
+			});
+		});
+
+		infos.forEach(function (info) {
+			var lineNumberSizer = info.sizer;
+			var lineHeights = info.lineHeights;
+
+			var childIndex = 0;
+			for (var i = 0; i < lineHeights.length; i++) {
+				if (lineHeights[i] === undefined) {
+					lineHeights[i] = lineNumberSizer.children[childIndex++].getBoundingClientRect().height;
+				}
+			}
+		});
+
+		infos.forEach(function (info) {
+			var lineNumberSizer = info.sizer;
+			var wrapper = info.element.querySelector('.line-numbers-rows');
+
+			lineNumberSizer.style.display = 'none';
+			lineNumberSizer.innerHTML = '';
+
+			info.lineHeights.forEach(function (height, lineNumber) {
+				wrapper.children[lineNumber].style.height = height + 'px';
+			});
+		});
+	}
+
+	/**
+	 * Returns style declarations for the element
+	 *
+	 * @param {Element} element
+	 */
+	function getStyles(element) {
+		if (!element) {
+			return null;
+		}
+
+		return window.getComputedStyle ? getComputedStyle(element) : (element.currentStyle || null);
+	}
+
+	var lastWidth = undefined;
+	window.addEventListener('resize', function () {
+		if (config.assumeViewportIndependence && lastWidth === window.innerWidth) {
+			return;
+		}
+		lastWidth = window.innerWidth;
+
+		resizeElements(Array.prototype.slice.call(document.querySelectorAll('pre.' + PLUGIN_NAME)));
+	});
+
+	Prism.hooks.add('complete', function (env) {
+		if (!env.code) {
+			return;
+		}
+
+		var code = /** @type {Element} */ (env.element);
+		var pre = /** @type {HTMLElement} */ (code.parentNode);
+
+		// works only for  wrapped inside 
 (not inline)
+		if (!pre || !/pre/i.test(pre.nodeName)) {
+			return;
+		}
+
+		// Abort if line numbers already exists
+		if (code.querySelector('.line-numbers-rows')) {
+			return;
+		}
+
+		// only add line numbers if  or one of its ancestors has the `line-numbers` class
+		if (!Prism.util.isActive(code, PLUGIN_NAME)) {
+			return;
+		}
+
+		// Remove the class 'line-numbers' from the 
+		code.classList.remove(PLUGIN_NAME);
+		// Add the class 'line-numbers' to the 
+		pre.classList.add(PLUGIN_NAME);
+
+		var match = env.code.match(NEW_LINE_EXP);
+		var linesNum = match ? match.length + 1 : 1;
+		var lineNumbersWrapper;
+
+		var lines = new Array(linesNum + 1).join('');
+
+		lineNumbersWrapper = document.createElement('span');
+		lineNumbersWrapper.setAttribute('aria-hidden', 'true');
+		lineNumbersWrapper.className = 'line-numbers-rows';
+		lineNumbersWrapper.innerHTML = lines;
+
+		if (pre.hasAttribute('data-start')) {
+			pre.style.counterReset = 'linenumber ' + (parseInt(pre.getAttribute('data-start'), 10) - 1);
+		}
+
+		env.element.appendChild(lineNumbersWrapper);
+
+		resizeElements([pre]);
+
+		Prism.hooks.run('line-numbers', env);
+	});
+
+	Prism.hooks.add('line-numbers', function (env) {
+		env.plugins = env.plugins || {};
+		env.plugins.lineNumbers = true;
+	});
+
+}());
diff --git a/vendor/valence/website/static/syntax-theme.css b/vendor/valence/website/static/syntax-theme.css
new file mode 100644
index 00000000..9cdeaadf
--- /dev/null
+++ b/vendor/valence/website/static/syntax-theme.css
@@ -0,0 +1,232 @@
+/*
+ * theme "One Dark" generated by syntect
+ */
+
+.z-code {
+ color: #6c7079;
+ background-color: #272D3E;
+}
+
+.z-text, .z-source {
+ color: #abb2bf;
+}
+.z-variable.z-parameter.z-function {
+ color: #adb7c9;
+}
+.z-comment, .z-punctuation.z-definition.z-comment {
+ color: #5f697a;
+font-style: italic;
+}
+.z-none {
+ color: #adb7c9;
+}
+.z-keyword.z-operator {
+ color: #adb7c9;
+}
+.z-keyword {
+ color: #cd74e8;
+}
+.z-variable {
+ color: #eb6772;
+}
+.z-entity.z-name.z-function, .z-meta.z-require, .z-support.z-function.z-any-method {
+ color: #5cb3fa;
+}
+.z-support.z-class, .z-entity.z-name.z-class, .z-entity.z-name.z-type.z-class {
+ color: #f0c678;
+}
+.z-meta.z-class {
+ color: #adb7c9;
+}
+.z-keyword.z-other.z-special-method {
+ color: #5cb3fa;
+}
+.z-storage {
+ color: #cd74e8;
+}
+.z-support.z-function {
+ color: #5ebfcc;
+}
+.z-string, .z-constant.z-other.z-symbol, .z-entity.z-other.z-inherited-class {
+ color: #9acc76;
+}
+.z-constant.z-numeric {
+ color: #db9d63;
+}
+.z-none {
+ color: #db9d63;
+}
+.z-none {
+ color: #db9d63;
+}
+.z-constant {
+ color: #db9d63;
+}
+.z-entity.z-name.z-tag {
+ color: #eb6772;
+}
+.z-entity.z-other.z-attribute-name {
+ color: #db9d63;
+}
+.z-entity.z-other.z-attribute-name.z-id, .z-punctuation.z-definition.z-entity {
+ color: #db9d63;
+}
+.z-meta.z-selector {
+ color: #cd74e8;
+}
+.z-none {
+ color: #db9d63;
+}
+.z-markup.z-heading .z-punctuation.z-definition.z-heading, .z-entity.z-name.z-section {
+ color: #5cb3fa;
+}
+.z-keyword.z-other.z-unit {
+ color: #db9d63;
+}
+.z-markup.z-bold, .z-punctuation.z-definition.z-bold {
+ color: #f0c678;
+}
+.z-markup.z-italic, .z-punctuation.z-definition.z-italic {
+ color: #cd74e8;
+}
+.z-markup.z-raw.z-inline {
+ color: #9acc76;
+}
+.z-string.z-other.z-link, .z-punctuation.z-definition.z-string.z-end.z-markdown {
+ color: #eb6772;
+}
+.z-meta.z-link {
+ color: #db9d63;
+}
+.z-markup.z-list {
+ color: #eb6772;
+}
+.z-markup.z-quote {
+ color: #db9d63;
+}
+.z-meta.z-separator {
+ color: #adb7c9;
+ background-color: #515151;
+}
+.z-markup.z-inserted {
+ color: #9acc76;
+}
+.z-markup.z-deleted {
+ color: #eb6772;
+}
+.z-markup.z-changed {
+ color: #cd74e8;
+}
+.z-constant.z-other.z-color {
+ color: #5ebfcc;
+}
+.z-string.z-regexp {
+ color: #5ebfcc;
+}
+.z-constant.z-character.z-escape {
+ color: #5ebfcc;
+}
+.z-punctuation.z-section.z-embedded, .z-variable.z-interpolation {
+ color: #c94e42;
+}
+.z-invalid.z-illegal {
+ color: #ffffff;
+ background-color: #e05252;
+}
+.z-invalid.z-broken {
+ color: #2d2d2d;
+ background-color: #f99157;
+}
+.z-invalid.z-deprecated {
+ color: #2c323d;
+ background-color: #d27b53;
+}
+.z-invalid.z-unimplemented {
+ color: #2c323d;
+ background-color: #747369;
+}
+.z-source.z-json .z-meta.z-structure.z-dictionary.z-json .z-string.z-quoted.z-double.z-json {
+ color: #eb6772;
+}
+.z-source.z-json .z-meta.z-structure.z-dictionary.z-json .z-meta.z-structure.z-dictionary.z-value.z-json .z-string.z-quoted.z-double.z-json {
+ color: #9acc76;
+}
+.z-source.z-json .z-meta.z-structure.z-dictionary.z-json .z-meta.z-structure.z-dictionary.z-value.z-json .z-meta.z-structure.z-dictionary.z-json .z-string.z-quoted.z-double.z-json {
+ color: #eb6772;
+}
+.z-source.z-json .z-meta.z-structure.z-dictionary.z-json .z-meta.z-structure.z-dictionary.z-value.z-json .z-meta.z-structure.z-dictionary.z-json .z-meta.z-structure.z-dictionary.z-value.z-json .z-string.z-quoted.z-double.z-json {
+ color: #9acc76;
+}
+.z-text.z-html.z-laravel-blade .z-source.z-php.z-embedded.z-line.z-html .z-entity.z-name.z-tag.z-laravel-blade {
+ color: #cd74e8;
+}
+.z-text.z-html.z-laravel-blade .z-source.z-php.z-embedded.z-line.z-html .z-support.z-constant.z-laravel-blade {
+ color: #cd74e8;
+}
+.z-source.z-python .z-meta.z-function.z-python .z-meta.z-function.z-parameters.z-python .z-variable.z-parameter.z-function.z-python {
+ color: #db9d63;
+}
+.z-source.z-python .z-meta.z-function-call.z-python .z-support.z-type.z-python {
+ color: #5ebfcc;
+}
+.z-source.z-python .z-keyword.z-operator.z-logical.z-python {
+ color: #cd74e8;
+}
+.z-source.z-python .z-meta.z-class.z-python .z-punctuation.z-definition.z-inheritance.z-begin.z-python {
+ color: #f0c678;
+}
+.z-source.z-python .z-meta.z-class.z-python .z-punctuation.z-definition.z-inheritance.z-end.z-python {
+ color: #f0c678;
+}
+.z-source.z-python .z-meta.z-function-call.z-python .z-meta.z-function-call.z-arguments.z-python .z-variable.z-parameter.z-function.z-python {
+ color: #db9d63;
+}
+.z-text.z-html.z-basic .z-source.z-php.z-embedded.z-block.z-html .z-support.z-constant.z-std.z-php {
+ color: #db9d63;
+}
+.z-text.z-html.z-basic .z-source.z-php.z-embedded.z-block.z-html .z-meta.z-namespace.z-php .z-entity.z-name.z-type.z-namespace.z-php {
+ color: #f0c678;
+}
+.z-source.z-js .z-meta.z-function.z-js .z-support.z-constant.z-js {
+ color: #db9d63;
+}
+.z-text.z-html.z-basic` .z-source.z-php.z-embedded.z-block.z-html .z-constant.z-other.z-php {
+ color: #cd74e8;
+}
+.z-text.z-html.z-basic .z-source.z-php.z-embedded.z-block.z-html .z-support.z-other.z-namespace.z-php {
+ color: #db9d63;
+}
+.z-text.z-tex.z-latex .z-meta.z-function.z-environment.z-math.z-latex .z-string.z-other.z-math.z-block.z-environment.z-latex .z-meta.z-definition.z-label.z-latex .z-variable.z-parameter.z-definition.z-label.z-latex {
+ color: #adb7c9;
+}
+.z-text.z-tex.z-latex .z-meta.z-function.z-emph.z-latex .z-markup.z-italic.z-emph.z-latex {
+ color: #cd74e8;
+font-style: italic;
+}
+.z-source.z-js .z-variable.z-other.z-readwrite.z-js {
+ color: #adb7c9;
+}
+.z-source.z-js .z-meta.z-function-call.z-with-arguments.z-js .z-variable.z-function.z-js {
+ color: #adb7c9;
+}
+.z-source.z-js .z-meta.z-group.z-braces.z-round .z-meta.z-group.z-braces.z-curly .z-meta.z-function-call.z-method.z-without-arguments.z-js .z-variable.z-function.z-js {
+ color: #adb7c9;
+}
+.z-source.z-js .z-meta.z-group.z-braces.z-round .z-meta.z-group.z-braces.z-curly .z-variable.z-other.z-object.z-js {
+ color: #adb7c9;
+}
+.z-source.z-js .z-meta.z-group.z-braces.z-round .z-meta.z-group.z-braces.z-curly .z-constant.z-other.z-object.z-key.z-js .z-string.z-unquoted.z-label.z-js {
+ color: #adb7c9;
+}
+.z-source.z-js .z-meta.z-group.z-braces.z-round .z-meta.z-group.z-braces.z-curly .z-constant.z-other.z-object.z-key.z-js .z-punctuation.z-separator.z-key-value.z-js {
+ color: #adb7c9;
+}
+.z-source.z-js .z-meta.z-group.z-braces.z-round .z-meta.z-group.z-braces.z-curly .z-meta.z-function-call.z-method.z-with-arguments.z-js .z-variable.z-function.z-js {
+ color: #adb7c9;
+}
+.z-source.z-js .z-meta.z-function-call.z-method.z-with-arguments.z-js .z-variable.z-function.z-js {
+ color: #adb7c9;
+}
+.z-source.z-js .z-meta.z-function-call.z-method.z-without-arguments.z-js .z-variable.z-function.z-js {
+ color: #adb7c9;
+}
diff --git a/vendor/valence/website/templates/_macros.html b/vendor/valence/website/templates/_macros.html
new file mode 100644
index 00000000..33b5acd8
--- /dev/null
+++ b/vendor/valence/website/templates/_macros.html
@@ -0,0 +1,25 @@
+{% macro render_header() %}
+{% set section = get_section(path="_index.md") %}
+
+    
+
+
+
+{% endmacro render_header %}
diff --git a/vendor/valence/website/templates/_variables.html b/vendor/valence/website/templates/_variables.html
new file mode 100644
index 00000000..ba063adb
--- /dev/null
+++ b/vendor/valence/website/templates/_variables.html
@@ -0,0 +1,19 @@
+
diff --git a/vendor/valence/website/templates/index.html b/vendor/valence/website/templates/index.html
new file mode 100644
index 00000000..8f6f7f44
--- /dev/null
+++ b/vendor/valence/website/templates/index.html
@@ -0,0 +1,176 @@
+{% import "_macros.html" as macros %}
+
+
+  
+    
+    {% block title %}{{ config.title }}{% endblock title %}
+    
+    {% block favicon %}
+    
+    {% endblock favicon %} {% include "_variables.html" %} {% block fonts %}
+    
+    
+  {% endblock fonts %}
+  
+  
+  
+  
+
+
+  {% block header %}
+
+  
+ {{ macros::render_header() }} +
+ +
+ {% block hero %} + +
+

+ Minecraft servers for the modern age +

+

+ Valence is a Rust framework for building modular and high performance Minecraft servers. +

+
+ GitHub Repo stars + GitHub release (with filter) + Discord +
+ Quick Start +
+ +
+

+
+fn pause_on_crouch(
+    mut events: EventReader<SneakEvent>,
+    mut board: ResMut<LifeBoard>,
+    mut layers: Query<&mut EntityLayer>,
+) {
+    for event in events.iter() {
+        if event.state == SneakState::Start {
+            let mut layer = layers.single_mut();
+
+            if board.playing {
+                board.playing = false;
+                layer.set_action_bar("Paused".italic().color(Color::RED));
+            } else {
+                board.playing = true;
+                layer.set_action_bar("Playing".italic().color(Color::GREEN));
+            }
+        }
+    }
+}
+
+ + + {% endblock hero %} +
+ + {% endblock header %} + +
+ {% block toc %} {% if section.toc %} {% set toc = section.toc %} {% elif + page.toc %} {% set toc = page.toc %} {% endif %} {% if toc %} +
+
+ {% for h in toc %} + + {% if h.children %} {% for h2 in h.children %} + + {% endfor %} {% endif %} {% endfor %} +
+
+ {% endif %} {% endblock toc %} + +
+ {% block content %} +
Overview
+ {{ section.content | safe }} {% endblock content %} +
+ + {% block sidebar %} {% endblock sidebar %} +
+ {% block footer %} + + {% endblock footer %} + + diff --git a/vendor/valence/website/templates/page.html b/vendor/valence/website/templates/page.html new file mode 100644 index 00000000..c6d86107 --- /dev/null +++ b/vendor/valence/website/templates/page.html @@ -0,0 +1,15 @@ +{% import "_macros.html" as macros %} +{% extends "index.html" %} + +{% block title %}{{ page.title }} | {{ super() }} {% endblock title %} + +{% block header %} +
+ {{ macros::render_header() }} +
+{% endblock header %} + +{% block content %} +
{{ page.description }}
+{{ page.content | safe }} +{% endblock content %} \ No newline at end of file diff --git a/vendor/valence/website/templates/shortcodes/issue.html b/vendor/valence/website/templates/shortcodes/issue.html new file mode 100644 index 00000000..3006d9b6 --- /dev/null +++ b/vendor/valence/website/templates/shortcodes/issue.html @@ -0,0 +1 @@ +#{{ id }} \ No newline at end of file From 721275e22464858ab99eea28ef31fc46b58acc07 Mon Sep 17 00:00:00 2001 From: Andrew Gazelka Date: Tue, 9 Sep 2025 19:58:40 -0700 Subject: [PATCH 6/9] update --- .gitignore | 9 +++ process-compose.yml | 68 +++++++++++++++++++ .../valence/crates/java_string/src/cesu8.rs | 6 +- vendor/valence/crates/java_string/src/char.rs | 2 +- .../valence/crates/java_string/src/slice.rs | 22 +++--- .../valence/crates/valence_anvil/src/lib.rs | 9 ++- vendor/valence/crates/valence_entity/build.rs | 29 ++++---- .../valence/crates/valence_ident/src/lib.rs | 8 +-- vendor/valence/crates/valence_nbt/README.md | 4 +- .../crates/valence_nbt/src/compound.rs | 12 ++-- vendor/valence/crates/valence_nbt/src/list.rs | 8 +-- .../valence/crates/valence_nbt/src/serde.rs | 1 - .../crates/valence_nbt/src/serde/ser.rs | 40 +++++------ .../valence/crates/valence_nbt/src/value.rs | 20 ++---- .../valence_protocol/src/impls/sequence.rs | 1 - .../crates/valence_protocol/src/lib.rs | 5 +- .../crates/valence_protocol/src/var_int.rs | 10 +-- .../crates/valence_protocol/src/var_long.rs | 6 +- .../crates/valence_text/src/into_text.rs | 4 +- 19 files changed, 165 insertions(+), 99 deletions(-) create mode 100644 process-compose.yml diff --git a/.gitignore b/.gitignore index 8bc5d79d..1ae216de 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,12 @@ perf.data .trigger-debug .trigger # valence/ + +proxy.crt +proxy_private_key.pem +root_ca.crt +root_ca.pem +root_ca.srl +server.crt +server_private_key.pem +logs diff --git a/process-compose.yml b/process-compose.yml new file mode 100644 index 00000000..c09acfa5 --- /dev/null +++ b/process-compose.yml @@ -0,0 +1,68 @@ +version: "0.5" + +processes: + # Single build process (cargo builds all binaries in parallel) + build: + command: "cargo build --bin hyperion-proxy --bin bedwars --bin rust-mc-bot" + working_dir: "/Users/andrewgazelka/Projects/personal/hyperion" + environment: + - RUST_LOG=debug + log_location: "./logs/build.log" + + # Run processes (dependent on build) + hyperion-proxy: + command: "./target/debug/hyperion-proxy --root-ca-cert root_ca.crt --cert proxy.crt --private-key proxy_private_key.pem --server 127.0.0.1:35565 0.0.0.0:25565" + working_dir: "/Users/andrewgazelka/Projects/personal/hyperion" + depends_on: + build: + condition: process_completed_successfully + environment: + - RUST_LOG=debug + - RUST_BACKTRACE=1 + log_location: "./logs/hyperion-proxy.log" + restart: "on_failure" + restart_policy: + restart_delay: 5s + max_restarts: 3 + + bedwars: + command: "./target/debug/bedwars --root-ca-cert root_ca.crt --cert server.crt --private-key server_private_key.pem --ip 0.0.0.0 --port 35565" + working_dir: "/Users/andrewgazelka/Projects/personal/hyperion" + depends_on: + build: + condition: process_completed_successfully + environment: + - RUST_LOG=debug + - RUST_BACKTRACE=1 + log_location: "./logs/bedwars.log" + restart: "on_failure" + restart_policy: + restart_delay: 5s + max_restarts: 3 + + rust-mc-bot: + command: "./target/debug/rust-mc-bot" + working_dir: "/Users/andrewgazelka/Projects/personal/hyperion" + depends_on: + build: + condition: process_completed_successfully + hyperion-proxy: + condition: process_healthy + environment: + - RUST_LOG=debug + - RUST_BACKTRACE=1 + - BOT_SERVER=127.0.0.1:25565 + - BOT_BOT_COUNT=500 + - BOT_THREADS=2 + log_location: "./logs/rust-mc-bot.log" + restart: "on_failure" + restart_policy: + restart_delay: 5s + max_restarts: 3 + disabled: true # Similar to docker profile, can be enabled when needed + +log: + fields: + - "time" + - "level" + - "message" diff --git a/vendor/valence/crates/java_string/src/cesu8.rs b/vendor/valence/crates/java_string/src/cesu8.rs index eb94ee6c..1191c573 100644 --- a/vendor/valence/crates/java_string/src/cesu8.rs +++ b/vendor/valence/crates/java_string/src/cesu8.rs @@ -1,6 +1,6 @@ use std::borrow::Cow; -use crate::validations::{utf8_char_width, CONT_MASK, TAG_CONT}; +use crate::validations::{CONT_MASK, TAG_CONT, utf8_char_width}; use crate::{JavaStr, JavaString, Utf8Error}; impl JavaStr { @@ -28,7 +28,7 @@ impl JavaStr { /// assert!(result.is_err()); /// ``` #[inline] - pub fn from_modified_utf8(bytes: &[u8]) -> Result, Utf8Error> { + pub fn from_modified_utf8(bytes: &[u8]) -> Result, Utf8Error> { match JavaStr::from_full_utf8(bytes) { Ok(str) => Ok(Cow::Borrowed(str)), Err(_) => JavaString::from_modified_utf8_internal(bytes).map(Cow::Owned), @@ -57,7 +57,7 @@ impl JavaStr { /// ``` #[inline] #[must_use] - pub fn to_modified_utf8(&self) -> Cow<[u8]> { + pub fn to_modified_utf8(&self) -> Cow<'_, [u8]> { if is_valid_cesu8(self) { Cow::Borrowed(self.as_bytes()) } else { diff --git a/vendor/valence/crates/java_string/src/char.rs b/vendor/valence/crates/java_string/src/char.rs index 5bb3163c..816b8d7f 100644 --- a/vendor/valence/crates/java_string/src/char.rs +++ b/vendor/valence/crates/java_string/src/char.rs @@ -101,7 +101,7 @@ impl JavaCodePoint { pub const fn as_u32(self) -> u32 { unsafe { // SAFETY: JavaCodePoint has the same repr as a u32 - let result = std::mem::transmute(self); + let result = std::mem::transmute::(self); if result > 0x10ffff { // SAFETY: JavaCodePoint can never have a value > 0x10FFFF. diff --git a/vendor/valence/crates/java_string/src/slice.rs b/vendor/valence/crates/java_string/src/slice.rs index e9faadf4..aa65946c 100644 --- a/vendor/valence/crates/java_string/src/slice.rs +++ b/vendor/valence/crates/java_string/src/slice.rs @@ -585,7 +585,7 @@ impl JavaStr { /// assert_eq!(v, [(0, JavaStr::from_str("aba"))]); // only the first `aba` /// ``` #[inline] - pub fn match_indices

(&self, pat: P) -> MatchIndices

+ pub fn match_indices

(&self, pat: P) -> MatchIndices<'_, P> where P: JavaStrPattern, { @@ -625,7 +625,7 @@ impl JavaStr { /// ); /// ``` #[inline] - pub fn matches

(&self, pat: P) -> Matches

+ pub fn matches

(&self, pat: P) -> Matches<'_, P> where P: JavaStrPattern, { @@ -777,7 +777,7 @@ impl JavaStr { /// assert_eq!(v, [(2, JavaStr::from_str("aba"))]); // only the last `aba` /// ``` #[inline] - pub fn rmatch_indices

(&self, pat: P) -> RMatchIndices

+ pub fn rmatch_indices

(&self, pat: P) -> RMatchIndices<'_, P> where P: JavaStrPattern, { @@ -815,7 +815,7 @@ impl JavaStr { /// ); /// ``` #[inline] - pub fn rmatches

(&self, pat: P) -> RMatches

+ pub fn rmatches

(&self, pat: P) -> RMatches<'_, P> where P: JavaStrPattern, { @@ -871,7 +871,7 @@ impl JavaStr { /// ); /// ``` #[inline] - pub fn rsplit

(&self, pat: P) -> RSplit

+ pub fn rsplit

(&self, pat: P) -> RSplit<'_, P> where P: JavaStrPattern, { @@ -940,7 +940,7 @@ impl JavaStr { /// ); /// ``` #[inline] - pub fn rsplit_terminator

(&self, pat: P) -> RSplitTerminator

+ pub fn rsplit_terminator

(&self, pat: P) -> RSplitTerminator<'_, P> where P: JavaStrPattern, { @@ -987,7 +987,7 @@ impl JavaStr { /// ); /// ``` #[inline] - pub fn rsplitn

(&self, n: usize, pat: P) -> RSplitN

+ pub fn rsplitn

(&self, n: usize, pat: P) -> RSplitN<'_, P> where P: JavaStrPattern, { @@ -1065,7 +1065,7 @@ impl JavaStr { /// ); /// ``` #[inline] - pub fn split

(&self, pat: P) -> Split

+ pub fn split

(&self, pat: P) -> Split<'_, P> where P: JavaStrPattern, { @@ -1193,7 +1193,7 @@ impl JavaStr { /// ); /// ``` #[inline] - pub fn split_inclusive

(&self, pat: P) -> SplitInclusive

+ pub fn split_inclusive

(&self, pat: P) -> SplitInclusive<'_, P> where P: JavaStrPattern, { @@ -1266,7 +1266,7 @@ impl JavaStr { /// ); /// ``` #[inline] - pub fn split_terminator

(&self, pat: P) -> SplitTerminator

+ pub fn split_terminator

(&self, pat: P) -> SplitTerminator<'_, P> where P: JavaStrPattern, { @@ -1318,7 +1318,7 @@ impl JavaStr { /// assert_eq!(v, [JavaStr::from_str("")]); /// ``` #[inline] - pub fn splitn

(&self, n: usize, pat: P) -> SplitN

+ pub fn splitn

(&self, n: usize, pat: P) -> SplitN<'_, P> where P: JavaStrPattern, { diff --git a/vendor/valence/crates/valence_anvil/src/lib.rs b/vendor/valence/crates/valence_anvil/src/lib.rs index b50507c4..5d535c14 100644 --- a/vendor/valence/crates/valence_anvil/src/lib.rs +++ b/vendor/valence/crates/valence_anvil/src/lib.rs @@ -32,8 +32,8 @@ use flate2::bufread::{GzDecoder, ZlibDecoder}; use flate2::write::{GzEncoder, ZlibEncoder}; use lru::LruCache; use thiserror::Error; -use valence_nbt::binary::{FromModifiedUtf8, ToModifiedUtf8}; use valence_nbt::Compound; +use valence_nbt::binary::{FromModifiedUtf8, ToModifiedUtf8}; #[cfg(feature = "bevy_plugin")] mod bevy; @@ -298,8 +298,8 @@ impl RegionFolder { fn region_chunks( this: &mut RegionFolder, pos: Result<(i32, i32), RegionError>, - ) -> impl Iterator> { - let positions = match pos { + ) -> Vec> { + match pos { Ok((region_x, region_z)) => { match RegionFolder::region( &mut this.regions, @@ -313,8 +313,7 @@ impl RegionFolder { } } Err(err) => vec![Err(err)], - }; - positions.into_iter() + } } Ok(std::fs::read_dir(&self.region_root)? diff --git a/vendor/valence/crates/valence_entity/build.rs b/vendor/valence/crates/valence_entity/build.rs index 46c70ccb..bdfdbbb1 100644 --- a/vendor/valence/crates/valence_entity/build.rs +++ b/vendor/valence/crates/valence_entity/build.rs @@ -384,20 +384,23 @@ fn build_entities() -> anyhow::Result { }]); // Get the default values of the attributes. - let mut attribute_default_values = TokenStream::new(); - - if let Some(attributes) = &entity.attributes { - for attribute in attributes { - let name = ident(attribute.name.to_pascal_case()); - let base_value = attribute.base_value; - attribute_default_values.extend([quote! { - .with_attribute_and_value( - super::EntityAttribute::#name, - #base_value, - ) - }]); + #[allow(clippy::excessive_nesting)] + let attribute_default_values = { + let mut values = TokenStream::new(); + if let Some(attributes) = &entity.attributes { + for attribute in attributes { + let name = ident(attribute.name.to_pascal_case()); + let base_value = attribute.base_value; + values.extend([quote! { + .with_attribute_and_value( + super::EntityAttribute::#name, + #base_value, + ) + }]); + } } - } + values + }; bundle_init_fields.extend([quote! { living_attributes: super::attributes::EntityAttributes::new() #attribute_default_values, diff --git a/vendor/valence/crates/valence_ident/src/lib.rs b/vendor/valence/crates/valence_ident/src/lib.rs index 6936ec5c..831fbc18 100644 --- a/vendor/valence/crates/valence_ident/src/lib.rs +++ b/vendor/valence/crates/valence_ident/src/lib.rs @@ -34,11 +34,9 @@ macro_rules! ident { ($string:literal) => { // SAFETY: parse_ident_str returns a &'static str, which is guaranteed to be // valid UTF-8 - unsafe { - $crate::Ident::new_unchecked($crate::Utf8Bytes::from_static($crate::parse_ident_str!( - $string - ))) - } + $crate::Ident::new_unchecked($crate::Utf8Bytes::from_static($crate::parse_ident_str!( + $string + ))) }; } diff --git a/vendor/valence/crates/valence_nbt/README.md b/vendor/valence/crates/valence_nbt/README.md index 7d3e1f42..8e930ea9 100644 --- a/vendor/valence/crates/valence_nbt/README.md +++ b/vendor/valence/crates/valence_nbt/README.md @@ -9,6 +9,6 @@ format. - `binary`: Adds support for serializing and deserializing in Java edition's binary format. - `snbt`: Adds support for serializing and deserializing in "stringified" format. - `preserve_order`: Causes the order of fields in [`Compound`]s to be -preserved during insertion and deletion at a slight cost to performance. -The iterators on `Compound` can then implement [`DoubleEndedIterator`]. + preserved during insertion and deletion at a slight cost to performance. + The iterators on `Compound` can then implement [`DoubleEndedIterator`]. - `serde` Adds support for [`serde`](https://docs.rs/serde/latest/serde/) diff --git a/vendor/valence/crates/valence_nbt/src/compound.rs b/vendor/valence/crates/valence_nbt/src/compound.rs index 636bb219..61cff4c5 100644 --- a/vendor/valence/crates/valence_nbt/src/compound.rs +++ b/vendor/valence/crates/valence_nbt/src/compound.rs @@ -208,7 +208,7 @@ where } } - pub fn entry(&mut self, k: K) -> Entry + pub fn entry(&mut self, k: K) -> Entry<'_, S> where K: Into, { @@ -232,31 +232,31 @@ where self.map.is_empty() } - pub fn iter(&self) -> Iter { + pub fn iter(&self) -> Iter<'_, S> { Iter { iter: self.map.iter(), } } - pub fn iter_mut(&mut self) -> IterMut { + pub fn iter_mut(&mut self) -> IterMut<'_, S> { IterMut { iter: self.map.iter_mut(), } } - pub fn keys(&self) -> Keys { + pub fn keys(&self) -> Keys<'_, S> { Keys { iter: self.map.keys(), } } - pub fn values(&self) -> Values { + pub fn values(&self) -> Values<'_, S> { Values { iter: self.map.values(), } } - pub fn values_mut(&mut self) -> ValuesMut { + pub fn values_mut(&mut self) -> ValuesMut<'_, S> { ValuesMut { iter: self.map.values_mut(), } diff --git a/vendor/valence/crates/valence_nbt/src/list.rs b/vendor/valence/crates/valence_nbt/src/list.rs index 8068d9d7..4be08872 100644 --- a/vendor/valence/crates/valence_nbt/src/list.rs +++ b/vendor/valence/crates/valence_nbt/src/list.rs @@ -118,7 +118,7 @@ impl List { /// Gets a reference to the value at the given index in this list, or `None` /// if the index is out of bounds. - pub fn get(&self, index: usize) -> Option> { + pub fn get(&self, index: usize) -> Option> { match self { List::End => None, List::Byte(list) => list.get(index).map(ValueRef::Byte), @@ -138,7 +138,7 @@ impl List { /// Gets a mutable reference to the value at the given index in this list, /// or `None` if the index is out of bounds. - pub fn get_mut(&mut self, index: usize) -> Option> { + pub fn get_mut(&mut self, index: usize) -> Option> { match self { List::End => None, List::Byte(list) => list.get_mut(index).map(ValueMut::Byte), @@ -463,7 +463,7 @@ impl List { } /// Returns an iterator over this list. This iterator yields [`ValueRef`]s. - pub fn iter(&self) -> Iter { + pub fn iter(&self) -> Iter<'_, S> { Iter { inner: match self { List::End => IterInner::End, @@ -485,7 +485,7 @@ impl List { /// Returns a mutable iterator over this list. This iterator yields /// [`ValueMut`]s. - pub fn iter_mut(&mut self) -> IterMut { + pub fn iter_mut(&mut self) -> IterMut<'_, S> { IterMut { inner: match self { List::End => IterMutInner::End, diff --git a/vendor/valence/crates/valence_nbt/src/serde.rs b/vendor/valence/crates/valence_nbt/src/serde.rs index 8159f5d7..de4994d6 100644 --- a/vendor/valence/crates/valence_nbt/src/serde.rs +++ b/vendor/valence/crates/valence_nbt/src/serde.rs @@ -11,7 +11,6 @@ mod tests; /// Errors that can occur while serializing or deserializing. #[derive(Clone, Error, Debug)] #[error("{0}")] - pub struct Error(Box); impl Error { diff --git a/vendor/valence/crates/valence_nbt/src/serde/ser.rs b/vendor/valence/crates/valence_nbt/src/serde/ser.rs index 25bfca89..d9263e91 100644 --- a/vendor/valence/crates/valence_nbt/src/serde/ser.rs +++ b/vendor/valence/crates/valence_nbt/src/serde/ser.rs @@ -147,9 +147,9 @@ impl Serializer for CompoundSerializer { unsupported!("none") } - fn serialize_some(self, _value: &T) -> Result + fn serialize_some(self, _value: &T) -> Result where - T: Serialize, + T: ?Sized + Serialize, { unsupported!("some") } @@ -171,18 +171,18 @@ impl Serializer for CompoundSerializer { unsupported!("unit variant") } - fn serialize_newtype_struct( + fn serialize_newtype_struct( self, _name: &'static str, _value: &T, ) -> Result where - T: Serialize, + T: ?Sized + Serialize, { unsupported!("newtype struct") } - fn serialize_newtype_variant( + fn serialize_newtype_variant( self, _name: &'static str, _variant_index: u32, @@ -190,7 +190,7 @@ impl Serializer for CompoundSerializer { _value: &T, ) -> Result where - T: Serialize, + T: ?Sized + Serialize, { unsupported!("newtype variant") } @@ -326,9 +326,9 @@ impl Serializer for ValueSerializer { unsupported!("none") } - fn serialize_some(self, value: &T) -> Result + fn serialize_some(self, value: &T) -> Result where - T: Serialize, + T: ?Sized + Serialize, { value.serialize(self) } @@ -350,18 +350,18 @@ impl Serializer for ValueSerializer { Ok(Value::String(variant.into())) } - fn serialize_newtype_struct( + fn serialize_newtype_struct( self, _name: &'static str, value: &T, ) -> Result where - T: Serialize, + T: ?Sized + Serialize, { value.serialize(self) } - fn serialize_newtype_variant( + fn serialize_newtype_variant( self, _name: &'static str, _variant_index: u32, @@ -369,7 +369,7 @@ impl Serializer for ValueSerializer { _value: &T, ) -> Result where - T: Serialize, + T: ?Sized + Serialize, { unsupported!("newtype variant") } @@ -446,9 +446,9 @@ impl SerializeSeq for ValueSerializeSeq { type Error = Error; - fn serialize_element(&mut self, value: &T) -> Result<(), Self::Error> + fn serialize_element(&mut self, value: &T) -> Result<(), Self::Error> where - T: Serialize, + T: ?Sized + Serialize, { macro_rules! serialize_variant { ($variant:ident, $vec:ident, $elem:ident) => {{ @@ -551,9 +551,9 @@ where type Error = Error; - fn serialize_key(&mut self, key: &T) -> Result<(), Self::Error> + fn serialize_key(&mut self, key: &T) -> Result<(), Self::Error> where - T: Serialize, + T: ?Sized + Serialize, { debug_assert!( self.key.is_none(), @@ -569,9 +569,9 @@ where } } - fn serialize_value(&mut self, value: &T) -> Result<(), Self::Error> + fn serialize_value(&mut self, value: &T) -> Result<(), Self::Error> where - T: Serialize, + T: ?Sized + Serialize, { let key = self .key @@ -609,13 +609,13 @@ where type Error = Error; - fn serialize_field( + fn serialize_field( &mut self, key: &'static str, value: &T, ) -> Result<(), Self::Error> where - T: Serialize, + T: ?Sized + Serialize, { self.c.insert(key, value.serialize(ValueSerializer)?); Ok(()) diff --git a/vendor/valence/crates/valence_nbt/src/value.rs b/vendor/valence/crates/valence_nbt/src/value.rs index 498cfc03..333d487e 100644 --- a/vendor/valence/crates/valence_nbt/src/value.rs +++ b/vendor/valence/crates/valence_nbt/src/value.rs @@ -210,7 +210,7 @@ impl_value!(ValueMut, 'a, (**), &'a mut); impl Value { /// Converts a reference to a value to a [`ValueRef`]. - pub fn as_value_ref(&self) -> ValueRef { + pub fn as_value_ref(&self) -> ValueRef<'_, S> { match self { Value::Byte(v) => ValueRef::Byte(v), Value::Short(v) => ValueRef::Short(v), @@ -228,7 +228,7 @@ impl Value { } /// Converts a mutable reference to a value to a [`ValueMut`]. - pub fn as_value_mut(&mut self) -> ValueMut { + pub fn as_value_mut(&mut self) -> ValueMut<'_, S> { match self { Value::Byte(v) => ValueMut::Byte(v), Value::Short(v) => ValueMut::Short(v), @@ -551,12 +551,9 @@ impl From for Value { } #[cfg(feature = "valence_ident")] -impl From> for Value -where - I: Into>, -{ - fn from(value: valence_ident::Ident) -> Self { - value.into_inner().into() +impl From for Value { + fn from(value: valence_ident::Ident) -> Self { + Value::String(value.as_str().to_owned()) } } @@ -596,13 +593,6 @@ impl<'a, S> From> for ValueRef<'a, S> { } } -#[cfg(feature = "valence_ident")] -impl<'a> From<&'a valence_ident::Ident> for ValueRef<'a, String> { - fn from(v: &'a valence_ident::Ident) -> Self { - Self::String(v.as_ref()) - } -} - impl<'a, S> From<&'a mut Vec> for ValueMut<'a, S> { fn from(v: &'a mut Vec) -> Self { Self::ByteArray(v) diff --git a/vendor/valence/crates/valence_protocol/src/impls/sequence.rs b/vendor/valence/crates/valence_protocol/src/impls/sequence.rs index e99354ab..298c27da 100644 --- a/vendor/valence/crates/valence_protocol/src/impls/sequence.rs +++ b/vendor/valence/crates/valence_protocol/src/impls/sequence.rs @@ -82,7 +82,6 @@ impl DecodeBytes for [T; N] { // Ok(arr) // } //} - impl Encode for [T] { fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { let len = self.len(); diff --git a/vendor/valence/crates/valence_protocol/src/lib.rs b/vendor/valence/crates/valence_protocol/src/lib.rs index d90f799e..d0eda742 100644 --- a/vendor/valence/crates/valence_protocol/src/lib.rs +++ b/vendor/valence/crates/valence_protocol/src/lib.rs @@ -38,7 +38,7 @@ mod bounded; mod byte_angle; pub mod chunk_pos; pub mod chunk_section_pos; -// pub mod decode; +pub mod decode; mod difficulty; mod direction; pub mod encode; @@ -392,7 +392,7 @@ pub enum PacketState { #[allow(dead_code)] #[cfg(test)] mod tests { - use std::borrow::Cow; + /* use bytes::BytesMut; @@ -546,4 +546,5 @@ mod tests { check_test_packet(&mut dec, "fourth"); check_test_packet(&mut dec, "third"); } + */ } diff --git a/vendor/valence/crates/valence_protocol/src/var_int.rs b/vendor/valence/crates/valence_protocol/src/var_int.rs index acf54307..6a01f14d 100644 --- a/vendor/valence/crates/valence_protocol/src/var_int.rs +++ b/vendor/valence/crates/valence_protocol/src/var_int.rs @@ -112,17 +112,17 @@ impl Decode for VarInt { #[cfg(test)] mod tests { - use rand::{thread_rng, Rng}; + use rand::{Rng, rng}; use super::*; #[test] fn varint_written_size() { - let mut rng = thread_rng(); + let mut rng = rng(); let mut buf = vec![]; for n in (0..100_000) - .map(|_| rng.r#gen()) + .map(|_| rng.random()) .chain([0, i32::MIN, i32::MAX]) .map(VarInt) { @@ -134,11 +134,11 @@ mod tests { #[test] fn varint_round_trip() { - let mut rng = thread_rng(); + let mut rng = rng(); let mut buf = vec![]; for n in (0..1_000_000) - .map(|_| rng.r#gen()) + .map(|_| rng.random()) .chain([0, i32::MIN, i32::MAX]) { VarInt(n).encode(&mut buf).unwrap(); diff --git a/vendor/valence/crates/valence_protocol/src/var_long.rs b/vendor/valence/crates/valence_protocol/src/var_long.rs index 75ec9091..0837b9a4 100644 --- a/vendor/valence/crates/valence_protocol/src/var_long.rs +++ b/vendor/valence/crates/valence_protocol/src/var_long.rs @@ -130,17 +130,17 @@ impl Decode for VarLong { #[cfg(test)] mod tests { - use rand::{thread_rng, Rng}; + use rand::{Rng, rng}; use super::*; #[test] fn encode_decode() { - let mut rng = thread_rng(); + let mut rng = rng(); let mut buf = vec![]; for n in (0..1_000_000) - .map(|_| rng.r#gen()) + .map(|_| rng.random()) .chain([0, i64::MIN, i64::MAX]) { VarLong(n).encode(&mut buf).unwrap(); diff --git a/vendor/valence/crates/valence_text/src/into_text.rs b/vendor/valence/crates/valence_text/src/into_text.rs index 5b0fb7c7..981b8c52 100644 --- a/vendor/valence/crates/valence_text/src/into_text.rs +++ b/vendor/valence/crates/valence_text/src/into_text.rs @@ -367,8 +367,8 @@ mod tests { matches!(value.into_cow_text(), Cow::Borrowed(..)) } - assert!(is_borrowed(&"this should be borrowed".into_text())); - assert!(is_borrowed(&"this should be borrowed too".bold())); + assert!(is_borrowed("this should be borrowed".into_text())); + assert!(is_borrowed("this should be borrowed too".bold())); assert!(!is_borrowed("this should be owned?".bold())); assert!(!is_borrowed("this should be owned")); assert!(!is_borrowed(465)); From f7e357cbae139e5d2e1010047cb235c96f18f5cc Mon Sep 17 00:00:00 2001 From: Andrew Gazelka Date: Tue, 9 Sep 2025 19:59:05 -0700 Subject: [PATCH 7/9] fmt --- .../valence/crates/java_string/src/pattern.rs | 12 ++-------- .../crates/valence_anvil/src/parsing.rs | 2 +- .../crates/valence_entity/src/attributes.rs | 2 +- .../crates/valence_entity/src/hitbox.rs | 6 +---- .../crates/valence_entity/src/query.rs | 2 +- .../crates/valence_generated/build/block.rs | 2 +- .../crates/valence_generated/src/block.rs | 2 +- .../crates/valence_ident_macros/src/lib.rs | 2 +- .../valence/crates/valence_math/src/aabb.rs | 6 +---- .../valence/crates/valence_nbt/src/binary.rs | 8 +++---- .../crates/valence_nbt/src/binary/encode.rs | 14 +++++------ .../crates/valence_nbt/src/binary/tests.rs | 2 +- vendor/valence/crates/valence_nbt/src/lib.rs | 2 +- .../crates/valence_nbt/src/serde/de.rs | 2 +- .../crates/valence_nbt/src/serde/ser.rs | 6 +---- .../crates/valence_nbt/src/serde/tests.rs | 2 +- vendor/valence/crates/valence_nbt/src/snbt.rs | 2 +- .../crates/valence_protocol/src/decode.rs | 10 ++++---- .../crates/valence_protocol/src/encode.rs | 6 ++--- .../crates/valence_protocol/src/impls/math.rs | 2 +- .../valence_protocol/src/impls/other.rs | 2 +- .../valence_protocol/src/impls/primitive.rs | 2 +- .../valence_protocol/src/impls/string.rs | 4 ++-- .../packets/play/advancement_update_s2c.rs | 2 +- .../src/packets/play/bundle_splitter_s2c.rs | 2 +- .../src/packets/play/disconnect_s2c.rs | 2 +- .../src/packets/play/full_c2s.rs | 2 +- .../packets/play/look_and_on_ground_c2s.rs | 2 +- .../src/packets/play/move_relative_s2c.rs | 2 +- .../src/packets/play/on_ground_only_c2s.rs | 2 +- .../src/packets/play/particle_s2c.rs | 2 +- .../play/position_and_on_ground_c2s.rs | 2 +- .../play/rotate_and_move_relative_s2c.rs | 2 +- .../src/packets/play/rotate_s2c.rs | 2 +- .../valence_protocol_macros/src/decode.rs | 4 ++-- .../valence_protocol_macros/src/encode.rs | 2 +- .../crates/valence_protocol_macros/src/lib.rs | 2 +- .../valence_protocol_macros/src/packet.rs | 4 ++-- .../crates/valence_registry/src/biome.rs | 4 ++-- .../crates/valence_registry/src/codec.rs | 2 +- .../valence_registry/src/dimension_type.rs | 4 ++-- .../crates/valence_registry/src/lib.rs | 2 +- .../crates/valence_registry/src/tags.rs | 2 +- .../crates/valence_server/src/layer/chunk.rs | 2 +- .../valence_server/src/layer/chunk/loaded.rs | 10 ++++---- .../src/layer/chunk/unloaded.rs | 4 ++-- .../crates/valence_server/src/layer/entity.rs | 2 +- .../valence_server/src/layer/message.rs | 24 ++++++++++--------- .../valence/crates/valence_server/src/lib.rs | 6 ++--- .../crates/valence_server_common/src/lib.rs | 2 +- vendor/valence/crates/valence_text/src/lib.rs | 5 ++-- 51 files changed, 93 insertions(+), 110 deletions(-) diff --git a/vendor/valence/crates/java_string/src/pattern.rs b/vendor/valence/crates/java_string/src/pattern.rs index 06cc7804..b77daefa 100644 --- a/vendor/valence/crates/java_string/src/pattern.rs +++ b/vendor/valence/crates/java_string/src/pattern.rs @@ -167,21 +167,13 @@ where #[inline] fn prefix_len_in(&mut self, haystack: &JavaStr) -> Option { let ch = haystack.chars().next()?; - if self(ch) { - Some(ch.len_utf8()) - } else { - None - } + if self(ch) { Some(ch.len_utf8()) } else { None } } #[inline] fn suffix_len_in(&mut self, haystack: &JavaStr) -> Option { let ch = haystack.chars().next_back()?; - if self(ch) { - Some(ch.len_utf8()) - } else { - None - } + if self(ch) { Some(ch.len_utf8()) } else { None } } #[inline] diff --git a/vendor/valence/crates/valence_anvil/src/parsing.rs b/vendor/valence/crates/valence_anvil/src/parsing.rs index 4971c5d9..737ab133 100644 --- a/vendor/valence/crates/valence_anvil/src/parsing.rs +++ b/vendor/valence/crates/valence_anvil/src/parsing.rs @@ -8,8 +8,8 @@ use valence_server::block::{PropName, PropValue}; use valence_server::layer::chunk::{Chunk, UnloadedChunk}; use valence_server::nbt::{Compound, List, Value}; use valence_server::protocol::BlockKind; -use valence_server::registry::biome::BiomeId; use valence_server::registry::BiomeRegistry; +use valence_server::registry::biome::BiomeId; use valence_server::{ChunkPos, Ident}; use crate::{RegionError, RegionFolder}; diff --git a/vendor/valence/crates/valence_entity/src/attributes.rs b/vendor/valence/crates/valence_entity/src/attributes.rs index ec71aca8..0feece3d 100644 --- a/vendor/valence/crates/valence_entity/src/attributes.rs +++ b/vendor/valence/crates/valence_entity/src/attributes.rs @@ -4,8 +4,8 @@ use bevy_ecs::prelude::*; use indexmap::IndexMap; use uuid::Uuid; pub use valence_generated::attributes::{EntityAttribute, EntityAttributeOperation}; -use valence_protocol::packets::play::entity_attributes_s2c::*; use valence_protocol::Ident; +use valence_protocol::packets::play::entity_attributes_s2c::*; /// An instance of an Entity Attribute. #[derive(Component, Clone, PartialEq, Debug)] diff --git a/vendor/valence/crates/valence_entity/src/hitbox.rs b/vendor/valence/crates/valence_entity/src/hitbox.rs index f5d600c8..bbf9d54d 100644 --- a/vendor/valence/crates/valence_entity/src/hitbox.rs +++ b/vendor/valence/crates/valence_entity/src/hitbox.rs @@ -276,11 +276,7 @@ fn update_armor_stand_hitbox( } fn child_hitbox(child: bool, v: DVec3) -> DVec3 { - if child { - v / 2.0 - } else { - v - } + if child { v / 2.0 } else { v } } fn update_passive_child_hitbox( diff --git a/vendor/valence/crates/valence_entity/src/query.rs b/vendor/valence/crates/valence_entity/src/query.rs index 081ef1ec..a9ee7f7c 100644 --- a/vendor/valence/crates/valence_entity/src/query.rs +++ b/vendor/valence/crates/valence_entity/src/query.rs @@ -4,6 +4,7 @@ use bevy_ecs::prelude::DetectChanges; use bevy_ecs::query::WorldQuery; use bevy_ecs::world::Ref; use valence_math::DVec3; +use valence_protocol::ByteAngle; use valence_protocol::encode::WritePacket; use valence_protocol::packets::play::{ EntityAnimationS2c, EntityAttributesS2c, EntityPositionS2c, EntitySetHeadYawS2c, @@ -11,7 +12,6 @@ use valence_protocol::packets::play::{ MoveRelativeS2c, PlayerSpawnS2c, RotateAndMoveRelativeS2c, RotateS2c, }; use valence_protocol::var_int::VarInt; -use valence_protocol::ByteAngle; use valence_server_common::UniqueId; use crate::attributes::TrackedEntityAttributes; diff --git a/vendor/valence/crates/valence_generated/build/block.rs b/vendor/valence/crates/valence_generated/build/block.rs index 43a22f7c..785f1b86 100644 --- a/vendor/valence/crates/valence_generated/build/block.rs +++ b/vendor/valence/crates/valence_generated/build/block.rs @@ -2,7 +2,7 @@ use std::collections::BTreeSet; use heck::{ToPascalCase, ToShoutySnakeCase}; use proc_macro2::TokenStream; -use quote::{quote, ToTokens}; +use quote::{ToTokens, quote}; use serde::Deserialize; use valence_build_utils::{ident, rerun_if_changed}; diff --git a/vendor/valence/crates/valence_generated/src/block.rs b/vendor/valence/crates/valence_generated/src/block.rs index 50075709..ba914b0e 100644 --- a/vendor/valence/crates/valence_generated/src/block.rs +++ b/vendor/valence/crates/valence_generated/src/block.rs @@ -4,7 +4,7 @@ use std::fmt; use std::fmt::Display; use std::iter::FusedIterator; -use valence_ident::{ident, Ident}; +use valence_ident::{Ident, ident}; use crate::item::ItemKind; diff --git a/vendor/valence/crates/valence_ident_macros/src/lib.rs b/vendor/valence/crates/valence_ident_macros/src/lib.rs index a8abb77c..ab9a2e12 100644 --- a/vendor/valence/crates/valence_ident_macros/src/lib.rs +++ b/vendor/valence/crates/valence_ident_macros/src/lib.rs @@ -3,7 +3,7 @@ use proc_macro::TokenStream as StdTokenStream; use proc_macro2::TokenStream; use quote::quote; -use syn::{parse2, Error, LitStr, Result}; +use syn::{Error, LitStr, Result, parse2}; #[proc_macro] pub fn parse_ident_str(item: StdTokenStream) -> StdTokenStream { diff --git a/vendor/valence/crates/valence_math/src/aabb.rs b/vendor/valence/crates/valence_math/src/aabb.rs index 48b02e2f..5617a349 100644 --- a/vendor/valence/crates/valence_math/src/aabb.rs +++ b/vendor/valence/crates/valence_math/src/aabb.rs @@ -125,11 +125,7 @@ impl Aabb { far = far.min(t0.max(t1)); } - if near <= far { - Some([near, far]) - } else { - None - } + if near <= far { Some([near, far]) } else { None } } } diff --git a/vendor/valence/crates/valence_nbt/src/binary.rs b/vendor/valence/crates/valence_nbt/src/binary.rs index d17f95a3..fca76ab4 100644 --- a/vendor/valence/crates/valence_nbt/src/binary.rs +++ b/vendor/valence/crates/valence_nbt/src/binary.rs @@ -4,7 +4,7 @@ //! # Examples //! //! ``` -//! use valence_nbt::{compound, to_binary, Compound, List}; +//! use valence_nbt::{Compound, List, compound, to_binary}; //! //! let c = compound! { //! "byte" => 5_i8, @@ -24,7 +24,7 @@ //! Decode NBT data from its binary form. //! //! ``` -//! use valence_nbt::{compound, from_binary, Compound}; +//! use valence_nbt::{Compound, compound, from_binary}; //! //! let some_bytes = [10, 0, 0, 3, 0, 3, 105, 110, 116, 0, 0, 222, 173, 0]; //! @@ -45,8 +45,8 @@ mod modified_utf8; #[cfg(test)] mod tests; -pub use decode::{from_binary, FromModifiedUtf8, FromModifiedUtf8Error}; -pub use encode::{to_binary, written_size, ToModifiedUtf8}; +pub use decode::{FromModifiedUtf8, FromModifiedUtf8Error, from_binary}; +pub use encode::{ToModifiedUtf8, to_binary, written_size}; pub use error::*; use crate::Tag; diff --git a/vendor/valence/crates/valence_nbt/src/binary/encode.rs b/vendor/valence/crates/valence_nbt/src/binary/encode.rs index 8cc50b81..dbbc61c2 100644 --- a/vendor/valence/crates/valence_nbt/src/binary/encode.rs +++ b/vendor/valence/crates/valence_nbt/src/binary/encode.rs @@ -4,7 +4,7 @@ use std::io::Write; use byteorder::{BigEndian, WriteBytesExt}; -use super::{modified_utf8, Error, Result}; +use super::{Error, Result, modified_utf8}; use crate::conv::i8_slice_as_u8_slice; use crate::tag::Tag; use crate::{Compound, List, Value}; @@ -163,7 +163,7 @@ impl EncodeState { return Err(Error::new_owned(format!( "byte array of length {} exceeds maximum of i32::MAX", bytes.len(), - ))) + ))); } } @@ -178,7 +178,7 @@ impl EncodeState { Err(_) => { return Err(Error::new_owned(format!( "string of length {len} exceeds maximum of u16::MAX" - ))) + ))); } } @@ -207,7 +207,7 @@ impl EncodeState { return Err(Error::new_owned(format!( "byte list of length {} exceeds maximum of i32::MAX", v.len(), - ))) + ))); } } @@ -244,7 +244,7 @@ impl EncodeState { "{} list of length {} exceeds maximum of i32::MAX", list.len(), elem_type.name() - ))) + ))); } } @@ -276,7 +276,7 @@ impl EncodeState { return Err(Error::new_owned(format!( "int array of length {} exceeds maximum of i32::MAX", ia.len(), - ))) + ))); } } @@ -294,7 +294,7 @@ impl EncodeState { return Err(Error::new_owned(format!( "long array of length {} exceeds maximum of i32::MAX", la.len(), - ))) + ))); } } diff --git a/vendor/valence/crates/valence_nbt/src/binary/tests.rs b/vendor/valence/crates/valence_nbt/src/binary/tests.rs index 837487ef..98494d0a 100644 --- a/vendor/valence/crates/valence_nbt/src/binary/tests.rs +++ b/vendor/valence/crates/valence_nbt/src/binary/tests.rs @@ -1,6 +1,6 @@ use crate::binary::written_size; use crate::tag::Tag; -use crate::{compound, from_binary, to_binary, Compound, List, Value}; +use crate::{Compound, List, Value, compound, from_binary, to_binary}; const ROOT_NAME: &str = "The root name‽"; diff --git a/vendor/valence/crates/valence_nbt/src/lib.rs b/vendor/valence/crates/valence_nbt/src/lib.rs index f422dc9d..85e72bdb 100644 --- a/vendor/valence/crates/valence_nbt/src/lib.rs +++ b/vendor/valence/crates/valence_nbt/src/lib.rs @@ -44,7 +44,7 @@ pub mod value; /// # Examples /// /// ``` -/// use valence_nbt::{compound, List}; +/// use valence_nbt::{List, compound}; /// /// let c = compound! { /// "byte" => 123_i8, diff --git a/vendor/valence/crates/valence_nbt/src/serde/de.rs b/vendor/valence/crates/valence_nbt/src/serde/de.rs index 0c5b280f..1f35eab4 100644 --- a/vendor/valence/crates/valence_nbt/src/serde/de.rs +++ b/vendor/valence/crates/valence_nbt/src/serde/de.rs @@ -7,7 +7,7 @@ use serde::de::value::{ StringDeserializer, }; use serde::de::{self, IntoDeserializer, SeqAccess, Visitor}; -use serde::{forward_to_deserialize_any, Deserialize, Deserializer}; +use serde::{Deserialize, Deserializer, forward_to_deserialize_any}; use super::Error; use crate::conv::{i8_vec_into_u8_vec, u8_slice_as_i8_slice, u8_vec_into_i8_vec}; diff --git a/vendor/valence/crates/valence_nbt/src/serde/ser.rs b/vendor/valence/crates/valence_nbt/src/serde/ser.rs index d9263e91..d568fd0d 100644 --- a/vendor/valence/crates/valence_nbt/src/serde/ser.rs +++ b/vendor/valence/crates/valence_nbt/src/serde/ser.rs @@ -609,11 +609,7 @@ where type Error = Error; - fn serialize_field( - &mut self, - key: &'static str, - value: &T, - ) -> Result<(), Self::Error> + fn serialize_field(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error> where T: ?Sized + Serialize, { diff --git a/vendor/valence/crates/valence_nbt/src/serde/tests.rs b/vendor/valence/crates/valence_nbt/src/serde/tests.rs index ab4dd2d0..177ad725 100644 --- a/vendor/valence/crates/valence_nbt/src/serde/tests.rs +++ b/vendor/valence/crates/valence_nbt/src/serde/tests.rs @@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize}; use serde_json::json; use super::*; -use crate::{compound, Compound, List}; +use crate::{Compound, List, compound}; #[derive(Serialize, Deserialize, PartialEq, Debug)] struct Struct { diff --git a/vendor/valence/crates/valence_nbt/src/snbt.rs b/vendor/valence/crates/valence_nbt/src/snbt.rs index e207da76..7a589eb9 100644 --- a/vendor/valence/crates/valence_nbt/src/snbt.rs +++ b/vendor/valence/crates/valence_nbt/src/snbt.rs @@ -434,8 +434,8 @@ impl<'a> SnbtReader<'a> { /// # Example /// /// ``` -/// use valence_nbt::snbt::from_snbt_str; /// use valence_nbt::Value; +/// use valence_nbt::snbt::from_snbt_str; /// /// let value = from_snbt_str("1f").unwrap(); /// assert_eq!(value, Value::Float(1.0)); diff --git a/vendor/valence/crates/valence_protocol/src/decode.rs b/vendor/valence/crates/valence_protocol/src/decode.rs index 74f3eb3d..201408cd 100644 --- a/vendor/valence/crates/valence_protocol/src/decode.rs +++ b/vendor/valence/crates/valence_protocol/src/decode.rs @@ -1,12 +1,12 @@ #[cfg(feature = "encryption")] -use aes::cipher::{generic_array::GenericArray, BlockDecryptMut, BlockSizeUser, KeyIvInit}; -use anyhow::{bail, ensure, Context}; +use aes::cipher::{BlockDecryptMut, BlockSizeUser, KeyIvInit, generic_array::GenericArray}; +use anyhow::{Context, bail, ensure}; use bytes::{Buf, BytesMut}; -use crate::var_int::{VarInt, VarIntDecodeError}; #[cfg(feature = "compression")] use crate::CompressionThreshold; -use crate::{Decode, Packet, MAX_PACKET_SIZE}; +use crate::var_int::{VarInt, VarIntDecodeError}; +use crate::{Decode, MAX_PACKET_SIZE, Packet}; /// The AES block cipher with a 128 bit key, using the CFB-8 mode of /// operation. @@ -216,7 +216,7 @@ impl PacketFrame { /// some input was missed. pub fn decode

(&self) -> anyhow::Result

where - P: Packet + Decode + P: Packet + Decode, { ensure!( P::ID == self.id, diff --git a/vendor/valence/crates/valence_protocol/src/encode.rs b/vendor/valence/crates/valence_protocol/src/encode.rs index 1e172d20..342c8f60 100644 --- a/vendor/valence/crates/valence_protocol/src/encode.rs +++ b/vendor/valence/crates/valence_protocol/src/encode.rs @@ -9,7 +9,7 @@ use bytes::{BufMut, BytesMut}; use tracing::warn; use crate::var_int::VarInt; -use crate::{CompressionThreshold, Encode, Packet, MAX_PACKET_SIZE}; +use crate::{CompressionThreshold, Encode, MAX_PACKET_SIZE, Packet}; /// The AES block cipher with a 128 bit key, using the CFB-8 mode of /// operation. @@ -72,8 +72,8 @@ impl PacketEncoder { if self.threshold.0 >= 0 { use std::io::Read; - use flate2::bufread::ZlibEncoder; use flate2::Compression; + use flate2::bufread::ZlibEncoder; if data_len > self.threshold.0 as usize { let mut z = ZlibEncoder::new(&self.buf[start_len..], Compression::new(4)); @@ -335,8 +335,8 @@ where { use std::io::Read; - use flate2::bufread::ZlibEncoder; use flate2::Compression; + use flate2::bufread::ZlibEncoder; let start_len = buf.len(); diff --git a/vendor/valence/crates/valence_protocol/src/impls/math.rs b/vendor/valence/crates/valence_protocol/src/impls/math.rs index 4c89374f..fb817f97 100644 --- a/vendor/valence/crates/valence_protocol/src/impls/math.rs +++ b/vendor/valence/crates/valence_protocol/src/impls/math.rs @@ -2,7 +2,7 @@ use std::io::Write; use valence_math::*; -use crate::{impl_decode_bytes_auto, Decode, Encode}; +use crate::{Decode, Encode, impl_decode_bytes_auto}; impl Encode for Vec2 { fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { diff --git a/vendor/valence/crates/valence_protocol/src/impls/other.rs b/vendor/valence/crates/valence_protocol/src/impls/other.rs index c71cde0e..af94d58e 100644 --- a/vendor/valence/crates/valence_protocol/src/impls/other.rs +++ b/vendor/valence/crates/valence_protocol/src/impls/other.rs @@ -9,7 +9,7 @@ use valence_generated::item::ItemKind; use valence_ident::Ident; use valence_nbt::Compound; -use crate::{impl_decode_bytes_auto, Decode, DecodeBytes, Encode, VarInt}; +use crate::{Decode, DecodeBytes, Encode, VarInt, impl_decode_bytes_auto}; impl Encode for Option { fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { diff --git a/vendor/valence/crates/valence_protocol/src/impls/primitive.rs b/vendor/valence/crates/valence_protocol/src/impls/primitive.rs index 71cdb62f..84ec92c3 100644 --- a/vendor/valence/crates/valence_protocol/src/impls/primitive.rs +++ b/vendor/valence/crates/valence_protocol/src/impls/primitive.rs @@ -4,7 +4,7 @@ use std::slice; use anyhow::ensure; use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt}; -use crate::{impl_decode_bytes_auto, Decode, Encode}; +use crate::{Decode, Encode, impl_decode_bytes_auto}; impl Encode for bool { fn encode(&self, mut w: impl Write) -> anyhow::Result<()> { diff --git a/vendor/valence/crates/valence_protocol/src/impls/string.rs b/vendor/valence/crates/valence_protocol/src/impls/string.rs index 79998679..ea9f4952 100644 --- a/vendor/valence/crates/valence_protocol/src/impls/string.rs +++ b/vendor/valence/crates/valence_protocol/src/impls/string.rs @@ -1,12 +1,12 @@ use std::io::Write; use std::str::FromStr; -use anyhow::{ensure, Context}; +use anyhow::{Context, ensure}; use bytes::Bytes; use valence_bytes::{CowUtf8Bytes, Utf8Bytes}; use valence_text::Text; -use crate::{impl_decode_bytes_auto, Bounded, Decode, DecodeBytes, Encode, VarInt}; +use crate::{Bounded, Decode, DecodeBytes, Encode, VarInt, impl_decode_bytes_auto}; const DEFAULT_MAX_STRING_CHARS: usize = 32767; const MAX_TEXT_CHARS: usize = 262144; diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/advancement_update_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/advancement_update_s2c.rs index ca954ab4..9ed75de0 100644 --- a/vendor/valence/crates/valence_protocol/src/packets/play/advancement_update_s2c.rs +++ b/vendor/valence/crates/valence_protocol/src/packets/play/advancement_update_s2c.rs @@ -7,7 +7,7 @@ use valence_bytes::{Bytes, CowUtf8Bytes}; use valence_ident::Ident; use valence_text::Text; -use crate::{packet_id, DecodeBytes, Encode, ItemStack, Packet, VarInt}; +use crate::{DecodeBytes, Encode, ItemStack, Packet, VarInt, packet_id}; pub type AdvancementUpdateS2c<'a> = GenericAdvancementUpdateS2c<(Ident, Advancement<'a, ItemStack>)>; diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/bundle_splitter_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/bundle_splitter_s2c.rs index 2c21f517..0a8f51bc 100644 --- a/vendor/valence/crates/valence_protocol/src/packets/play/bundle_splitter_s2c.rs +++ b/vendor/valence/crates/valence_protocol/src/packets/play/bundle_splitter_s2c.rs @@ -1,4 +1,4 @@ -use crate::{packet_id, Decode, DecodeBytesAuto, Encode, Packet}; +use crate::{Decode, DecodeBytesAuto, Encode, Packet, packet_id}; #[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] #[packet(id = packet_id::BUNDLE_SPLITTER)] diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/disconnect_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/disconnect_s2c.rs index 2e966664..ee914c6f 100644 --- a/vendor/valence/crates/valence_protocol/src/packets/play/disconnect_s2c.rs +++ b/vendor/valence/crates/valence_protocol/src/packets/play/disconnect_s2c.rs @@ -2,7 +2,7 @@ use std::borrow::Cow; use valence_text::Text; -use crate::{packet_id, Decode, DecodeBytesAuto, Encode, Packet}; +use crate::{Decode, DecodeBytesAuto, Encode, Packet, packet_id}; #[derive(Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] #[packet(id = packet_id::DISCONNECT_S2C)] diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/full_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/full_c2s.rs index a6fd7adb..b58a6a88 100644 --- a/vendor/valence/crates/valence_protocol/src/packets/play/full_c2s.rs +++ b/vendor/valence/crates/valence_protocol/src/packets/play/full_c2s.rs @@ -1,6 +1,6 @@ use valence_math::DVec3; -use crate::{packet_id, Decode, DecodeBytesAuto, Encode, Packet}; +use crate::{Decode, DecodeBytesAuto, Encode, Packet, packet_id}; #[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] #[packet(id = packet_id::FULL)] diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/look_and_on_ground_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/look_and_on_ground_c2s.rs index d5e98a58..f928c257 100644 --- a/vendor/valence/crates/valence_protocol/src/packets/play/look_and_on_ground_c2s.rs +++ b/vendor/valence/crates/valence_protocol/src/packets/play/look_and_on_ground_c2s.rs @@ -1,4 +1,4 @@ -use crate::{packet_id, Decode, DecodeBytesAuto, Encode, Packet}; +use crate::{Decode, DecodeBytesAuto, Encode, Packet, packet_id}; #[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] #[packet(id = packet_id::LOOK_AND_ON_GROUND)] diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/move_relative_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/move_relative_s2c.rs index a6c31b13..f0708783 100644 --- a/vendor/valence/crates/valence_protocol/src/packets/play/move_relative_s2c.rs +++ b/vendor/valence/crates/valence_protocol/src/packets/play/move_relative_s2c.rs @@ -1,4 +1,4 @@ -use crate::{packet_id, Decode, DecodeBytesAuto, Encode, Packet, VarInt}; +use crate::{Decode, DecodeBytesAuto, Encode, Packet, VarInt, packet_id}; #[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] #[packet(id = packet_id::MOVE_RELATIVE)] diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/on_ground_only_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/on_ground_only_c2s.rs index 705c2486..328e6cab 100644 --- a/vendor/valence/crates/valence_protocol/src/packets/play/on_ground_only_c2s.rs +++ b/vendor/valence/crates/valence_protocol/src/packets/play/on_ground_only_c2s.rs @@ -1,4 +1,4 @@ -use crate::{packet_id, Decode, DecodeBytesAuto, Encode, Packet}; +use crate::{Decode, DecodeBytesAuto, Encode, Packet, packet_id}; #[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] #[packet(id = packet_id::ON_GROUND_ONLY)] diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/particle_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/particle_s2c.rs index 6477bf9c..1e8d2f0e 100644 --- a/vendor/valence/crates/valence_protocol/src/packets/play/particle_s2c.rs +++ b/vendor/valence/crates/valence_protocol/src/packets/play/particle_s2c.rs @@ -5,7 +5,7 @@ use anyhow::bail; use valence_generated::block::BlockState; use valence_math::{DVec3, Vec3}; -use crate::{decode_str, BlockPos, Decode, DecodeBytesAuto, Encode, ItemStack, Packet, VarInt}; +use crate::{BlockPos, Decode, DecodeBytesAuto, Encode, ItemStack, Packet, VarInt, decode_str}; #[derive(Clone, Debug, Packet, DecodeBytesAuto)] pub struct ParticleS2c<'a> { diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/position_and_on_ground_c2s.rs b/vendor/valence/crates/valence_protocol/src/packets/play/position_and_on_ground_c2s.rs index cc7b9f44..29946bab 100644 --- a/vendor/valence/crates/valence_protocol/src/packets/play/position_and_on_ground_c2s.rs +++ b/vendor/valence/crates/valence_protocol/src/packets/play/position_and_on_ground_c2s.rs @@ -1,6 +1,6 @@ use valence_math::DVec3; -use crate::{packet_id, Decode, DecodeBytesAuto, Encode, Packet}; +use crate::{Decode, DecodeBytesAuto, Encode, Packet, packet_id}; #[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] #[packet(id = packet_id::POSITION_AND_ON_GROUND)] diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/rotate_and_move_relative_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/rotate_and_move_relative_s2c.rs index 53dc0898..08a71d5b 100644 --- a/vendor/valence/crates/valence_protocol/src/packets/play/rotate_and_move_relative_s2c.rs +++ b/vendor/valence/crates/valence_protocol/src/packets/play/rotate_and_move_relative_s2c.rs @@ -1,4 +1,4 @@ -use crate::{packet_id, ByteAngle, Decode, DecodeBytesAuto, Encode, Packet, VarInt}; +use crate::{ByteAngle, Decode, DecodeBytesAuto, Encode, Packet, VarInt, packet_id}; #[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] #[packet(id = packet_id::ROTATE_AND_MOVE_RELATIVE)] diff --git a/vendor/valence/crates/valence_protocol/src/packets/play/rotate_s2c.rs b/vendor/valence/crates/valence_protocol/src/packets/play/rotate_s2c.rs index e223f98d..cd2d10f2 100644 --- a/vendor/valence/crates/valence_protocol/src/packets/play/rotate_s2c.rs +++ b/vendor/valence/crates/valence_protocol/src/packets/play/rotate_s2c.rs @@ -1,4 +1,4 @@ -use crate::{packet_id, ByteAngle, Decode, DecodeBytesAuto, Encode, Packet, VarInt}; +use crate::{ByteAngle, Decode, DecodeBytesAuto, Encode, Packet, VarInt, packet_id}; #[derive(Copy, Clone, Debug, Encode, Decode, DecodeBytesAuto, Packet)] #[packet(id = packet_id::ROTATE)] diff --git a/vendor/valence/crates/valence_protocol_macros/src/decode.rs b/vendor/valence/crates/valence_protocol_macros/src/decode.rs index 4d4cbda5..1e54fd7e 100644 --- a/vendor/valence/crates/valence_protocol_macros/src/decode.rs +++ b/vendor/valence/crates/valence_protocol_macros/src/decode.rs @@ -3,8 +3,8 @@ use quote::quote; use syn::punctuated::Punctuated; use syn::spanned::Spanned; use syn::{ - parse2, parse_quote, Data, DeriveInput, Error, Fields, PredicateType, Result, Token, - TraitBound, TraitBoundModifier, TypeParamBound, WhereClause, WherePredicate, + Data, DeriveInput, Error, Fields, PredicateType, Result, Token, TraitBound, TraitBoundModifier, + TypeParamBound, WhereClause, WherePredicate, parse_quote, parse2, }; use crate::{add_trait_bounds, pair_variants_with_discriminants}; diff --git a/vendor/valence/crates/valence_protocol_macros/src/encode.rs b/vendor/valence/crates/valence_protocol_macros/src/encode.rs index 101048e0..1e927008 100644 --- a/vendor/valence/crates/valence_protocol_macros/src/encode.rs +++ b/vendor/valence/crates/valence_protocol_macros/src/encode.rs @@ -1,7 +1,7 @@ use proc_macro2::{Ident, Span, TokenStream}; use quote::quote; use syn::spanned::Spanned; -use syn::{parse2, Data, DeriveInput, Error, Fields, LitInt, Result}; +use syn::{Data, DeriveInput, Error, Fields, LitInt, Result, parse2}; use crate::{add_trait_bounds, pair_variants_with_discriminants}; diff --git a/vendor/valence/crates/valence_protocol_macros/src/lib.rs b/vendor/valence/crates/valence_protocol_macros/src/lib.rs index 7240f748..037d8647 100644 --- a/vendor/valence/crates/valence_protocol_macros/src/lib.rs +++ b/vendor/valence/crates/valence_protocol_macros/src/lib.rs @@ -19,7 +19,7 @@ use proc_macro::TokenStream as StdTokenStream; use proc_macro2::TokenStream; -use syn::{parse_quote, Attribute, GenericParam, Generics, LitInt, Result, Variant}; +use syn::{Attribute, GenericParam, Generics, LitInt, Result, Variant, parse_quote}; mod decode; mod encode; diff --git a/vendor/valence/crates/valence_protocol_macros/src/packet.rs b/vendor/valence/crates/valence_protocol_macros/src/packet.rs index 9d2cdd55..fd13b92b 100644 --- a/vendor/valence/crates/valence_protocol_macros/src/packet.rs +++ b/vendor/valence/crates/valence_protocol_macros/src/packet.rs @@ -2,7 +2,7 @@ use heck::ToShoutySnakeCase; use proc_macro2::{Ident, Span, TokenStream}; use quote::quote; use syn::spanned::Spanned; -use syn::{parse2, parse_quote, Attribute, DeriveInput, Error, Expr, LitInt, LitStr, Result}; +use syn::{Attribute, DeriveInput, Error, Expr, LitInt, LitStr, Result, parse_quote, parse2}; use crate::add_trait_bounds; @@ -27,7 +27,7 @@ pub(super) fn derive_packet(item: TokenStream) -> Result { return Err(Error::new( packet_attr.span, "missing valid `id = ...` value from `packet` attr", - )) + )); } }, }; diff --git a/vendor/valence/crates/valence_registry/src/biome.rs b/vendor/valence/crates/valence_registry/src/biome.rs index a20b7502..a72cf132 100644 --- a/vendor/valence/crates/valence_registry/src/biome.rs +++ b/vendor/valence/crates/valence_registry/src/biome.rs @@ -14,7 +14,7 @@ use bevy_app::prelude::*; use bevy_ecs::prelude::*; use serde::{Deserialize, Serialize}; use tracing::error; -use valence_ident::{ident, Ident}; +use valence_ident::{Ident, ident}; use valence_nbt::serde::CompoundSerializer; use crate::codec::{RegistryCodec, RegistryValue}; @@ -57,7 +57,7 @@ fn update_biome_registry(reg: Res, mut codec: ResMut Date: Tue, 9 Sep 2025 20:05:17 -0700 Subject: [PATCH 8/9] update CI --- .github/workflows/ci.yml | 23 ++++++++----------- .../valence/crates/valence_anvil/src/bevy.rs | 2 +- .../valence/crates/valence_server/src/lib.rs | 2 +- 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f1ea5f67..cf4de4bd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,20 +14,14 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Read rust-toolchain.toml - id: toolchain - shell: bash - run: | - TOOLCHAIN=$(cat rust-toolchain.toml | grep 'channel' | cut -d'"' -f2) - echo "version=${TOOLCHAIN}" >> "$GITHUB_OUTPUT" - - uses: dtolnay/rust-toolchain@master + - uses: dtolnay/rust-toolchain@nightly with: - toolchain: ${{ steps.toolchain.outputs.version }} + components: rustfmt - uses: Swatinem/rust-cache@v2 with: cache-on-failure: "true" - name: Check formatting - run: cargo fmt --all -- --check + run: cargo +nightly fmt --all -- --check clippy: name: Clippy @@ -69,16 +63,15 @@ jobs: - name: Check documentation env: RUSTDOCFLAGS: -D warnings - run: cargo doc --no-deps --all-features + run: cargo doc --no-deps --all-features --workspace coverage: name: Code Coverage runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@master + - uses: dtolnay/rust-toolchain@nightly with: - toolchain: nightly components: llvm-tools-preview - uses: Swatinem/rust-cache@v2 with: @@ -86,7 +79,7 @@ jobs: - name: Install cargo-llvm-cov uses: taiki-e/install-action@cargo-llvm-cov - name: Generate code coverage - run: cargo llvm-cov --all-features --workspace --branch --lcov --output-path lcov.info + run: cargo +nightly llvm-cov --all-features --workspace --branch --lcov --output-path lcov.info - name: Upload coverage to Codecov uses: codecov/codecov-action@v5 with: @@ -121,5 +114,7 @@ jobs: - uses: Swatinem/rust-cache@v2 with: cache-on-failure: "true" + - name: Install cargo-nextest + uses: taiki-e/install-action@nextest - name: Run tests - run: cargo test --all-features + run: cargo nextest run --all-features diff --git a/vendor/valence/crates/valence_anvil/src/bevy.rs b/vendor/valence/crates/valence_anvil/src/bevy.rs index 97b4fea6..f810877a 100644 --- a/vendor/valence/crates/valence_anvil/src/bevy.rs +++ b/vendor/valence/crates/valence_anvil/src/bevy.rs @@ -6,8 +6,8 @@ use std::thread; use bevy_app::prelude::*; use bevy_ecs::prelude::*; use flume::{Receiver, Sender}; +use valence_entity::{EntityLayerId, OldEntityLayerId}; use valence_server::client::{Client, OldView, View}; -use valence_server::entity::{EntityLayerId, OldEntityLayerId}; use valence_server::layer::UpdateLayersPreClientSet; use valence_server::protocol::anyhow; use valence_server::registry::BiomeRegistry; diff --git a/vendor/valence/crates/valence_server/src/lib.rs b/vendor/valence/crates/valence_server/src/lib.rs index 03af4582..9d880bd5 100644 --- a/vendor/valence/crates/valence_server/src/lib.rs +++ b/vendor/valence/crates/valence_server/src/lib.rs @@ -22,7 +22,7 @@ // pub mod action; // pub mod brand; mod chunk_view; -// pub mod client; +pub mod client; // pub mod client_command; // pub mod client_settings; // pub mod custom_payload; From 2daab99dbbf8d5fa95712fce8d2cb1c0ee846d6f Mon Sep 17 00:00:00 2001 From: Andrew Gazelka Date: Tue, 9 Sep 2025 20:28:45 -0700 Subject: [PATCH 9/9] update --- .../crates/valence_protocol/src/lib.rs | 2 +- .../crates/valence_protocol/src/raw.rs | 2 +- .../crates/valence_server/src/abilities.rs | 2 +- .../crates/valence_server/src/brand.rs | 7 +-- .../crates/valence_server/src/client.rs | 22 +++++----- .../valence_server/src/client_command.rs | 4 +- .../valence_server/src/client_settings.rs | 2 +- .../valence_server/src/custom_payload.rs | 6 ++- .../crates/valence_server/src/event_loop.rs | 2 +- .../crates/valence_server/src/hand_swing.rs | 2 +- .../valence_server/src/interact_entity.rs | 2 +- .../valence_server/src/interact_item.rs | 2 +- .../crates/valence_server/src/keepalive.rs | 2 +- .../valence/crates/valence_server/src/lib.rs | 44 +++++++++---------- .../crates/valence_server/src/op_level.rs | 2 +- .../valence_server/src/resource_pack.rs | 2 +- .../valence_server/src/status_effect.rs | 6 +-- .../crates/valence_server/src/teleport.rs | 4 +- 18 files changed, 60 insertions(+), 55 deletions(-) diff --git a/vendor/valence/crates/valence_protocol/src/lib.rs b/vendor/valence/crates/valence_protocol/src/lib.rs index d0eda742..63ae12e9 100644 --- a/vendor/valence/crates/valence_protocol/src/lib.rs +++ b/vendor/valence/crates/valence_protocol/src/lib.rs @@ -196,7 +196,7 @@ pub trait Encode { /// specialization is unavailable in stable Rust at the time of writing, /// we must make the slice specialization part of this trait. /// - /// [`write_all`]: Write:write_all + /// [`write_all`]: std::io::Write::write_all fn encode_slice(slice: &[Self], mut w: impl Write) -> anyhow::Result<()> where Self: Sized, diff --git a/vendor/valence/crates/valence_protocol/src/raw.rs b/vendor/valence/crates/valence_protocol/src/raw.rs index f98916f1..03b4a394 100644 --- a/vendor/valence/crates/valence_protocol/src/raw.rs +++ b/vendor/valence/crates/valence_protocol/src/raw.rs @@ -14,7 +14,7 @@ use crate::{Bounded, DecodeBytes, Encode}; /// slice. The input will be at the EOF state after this is decoded. /// /// [encoding]: Encode -/// [decoding]: Decode +/// [decoding]: crate::DecodeBytes #[derive( Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Default, Debug, Deref, DerefMut, From, Into, )] diff --git a/vendor/valence/crates/valence_server/src/abilities.rs b/vendor/valence/crates/valence_server/src/abilities.rs index c1bff07f..792715d5 100644 --- a/vendor/valence/crates/valence_server/src/abilities.rs +++ b/vendor/valence/crates/valence_server/src/abilities.rs @@ -5,7 +5,7 @@ pub use valence_protocol::packets::play::player_abilities_s2c::PlayerAbilitiesFl use valence_protocol::packets::play::{PlayerAbilitiesS2c, UpdatePlayerAbilitiesC2s}; use valence_protocol::{GameMode, WritePacket}; -use crate::client::{update_game_mode, Client, UpdateClientsSet}; +use crate::client::{Client, UpdateClientsSet, update_game_mode}; use crate::event_loop::{EventLoopPreUpdate, PacketEvent}; /// [`Component`] that stores the player's flying speed ability. diff --git a/vendor/valence/crates/valence_server/src/brand.rs b/vendor/valence/crates/valence_server/src/brand.rs index e0c2f64a..ff8d377a 100644 --- a/vendor/valence/crates/valence_server/src/brand.rs +++ b/vendor/valence/crates/valence_server/src/brand.rs @@ -1,6 +1,7 @@ -use valence_bytes::CowUtf8Bytes; +use valence_bytes::CowBytes; use valence_protocol::packets::play::CustomPayloadS2c; -use valence_protocol::{ident, Bounded, Encode, VarInt, WritePacket}; +use valence_protocol::raw::RawBytes; +use valence_protocol::{Bounded, Encode, VarInt, WritePacket, ident}; pub trait SetBrand { /// Sets the brand of the server. @@ -23,7 +24,7 @@ impl SetBrand for T { buf.extend_from_slice(brand.as_bytes()); self.write_packet(&CustomPayloadS2c { channel: ident!("minecraft:brand"), - data: Bounded(buf.into()), + data: Bounded(RawBytes(CowBytes::from(buf))), }); } } diff --git a/vendor/valence/crates/valence_server/src/client.rs b/vendor/valence/crates/valence_server/src/client.rs index d48b9bc9..540affad 100644 --- a/vendor/valence/crates/valence_server/src/client.rs +++ b/vendor/valence/crates/valence_server/src/client.rs @@ -13,6 +13,7 @@ use bytes::{Bytes, BytesMut}; use derive_more::{Deref, DerefMut, From, Into}; use tracing::warn; use uuid::Uuid; +use valence_bytes::CowBytes; use valence_entity::attributes::{EntityAttributes, TrackedEntityAttributes}; use valence_entity::living::Health; use valence_entity::player::{Food, PlayerEntityBundle, Saturation}; @@ -33,6 +34,7 @@ use valence_protocol::packets::play::{ ParticleS2c, PlaySoundS2c, UnloadChunkS2c, }; use valence_protocol::profile::Property; +use valence_protocol::raw::RawBytes; use valence_protocol::sound::{Sound, SoundCategory, SoundId}; use valence_protocol::text::{IntoText, Text}; use valence_protocol::var_int::VarInt; @@ -40,8 +42,8 @@ use valence_protocol::{BlockPos, ChunkPos, Encode, GameMode, Packet}; use valence_registry::RegistrySet; use valence_server_common::{Despawned, UniqueId}; -use crate::layer::{ChunkLayer, EntityLayer, UpdateLayersPostClientSet, UpdateLayersPreClientSet}; use crate::ChunkView; +use crate::layer::{ChunkLayer, EntityLayer, UpdateLayersPostClientSet, UpdateLayersPreClientSet}; pub struct ClientPlugin; @@ -445,12 +447,12 @@ pub struct Properties(pub Vec); impl Properties { /// Finds the property with the name "textures". pub fn textures(&self) -> Option<&Property> { - self.0.iter().find(|p| p.name == "textures") + self.0.iter().find(|p| p.name == "textures".into()) } /// Finds the property with the name "textures" mutably. pub fn textures_mut(&mut self) -> Option<&mut Property> { - self.0.iter_mut().find(|p| p.name == "textures") + self.0.iter_mut().find(|p| p.name == "textures".into()) } /// Returns the value of the "textures" property. It's a base64-encoded @@ -468,13 +470,13 @@ impl Properties { /// Mojang. pub fn set_skin(&mut self, skin: impl Into, signature: impl Into) { if let Some(prop) = self.textures_mut() { - prop.value = skin.into(); - prop.signature = Some(signature.into()); + prop.value = skin.into().into(); + prop.signature = Some(signature.into().into()); } else { self.0.push(Property { - name: "textures".to_owned(), - value: skin.into(), - signature: Some(signature.into()), + name: "textures".into(), + value: skin.into().into(), + signature: Some(signature.into().into()), }); } } @@ -1151,7 +1153,7 @@ fn init_tracked_data(mut clients: Query<(&mut Client, &TrackedData), Added) { if let Some(update_data) = tracked_data.update_data() { client.write_packet(&EntityTrackerUpdateS2c { entity_id: VarInt(0), - tracked_values: update_data.into(), + tracked_values: RawBytes(CowBytes::from(update_data)), }); } } diff --git a/vendor/valence/crates/valence_server/src/client_command.rs b/vendor/valence/crates/valence_server/src/client_command.rs index 05f08433..59fd4119 100644 --- a/vendor/valence/crates/valence_server/src/client_command.rs +++ b/vendor/valence/crates/valence_server/src/client_command.rs @@ -1,9 +1,9 @@ use bevy_app::prelude::*; use bevy_ecs::prelude::*; use valence_entity::entity::Flags; -use valence_entity::{entity, Pose}; -pub use valence_protocol::packets::play::client_command_c2s::ClientCommand; +use valence_entity::{Pose, entity}; use valence_protocol::packets::play::ClientCommandC2s; +pub use valence_protocol::packets::play::client_command_c2s::ClientCommand; use crate::event_loop::{EventLoopPreUpdate, PacketEvent}; diff --git a/vendor/valence/crates/valence_server/src/client_settings.rs b/vendor/valence/crates/valence_server/src/client_settings.rs index 3e5322ed..f0a9b93f 100644 --- a/vendor/valence/crates/valence_server/src/client_settings.rs +++ b/vendor/valence/crates/valence_server/src/client_settings.rs @@ -1,8 +1,8 @@ use bevy_app::prelude::*; use bevy_ecs::prelude::*; use valence_entity::player::{self, PlayerModelParts}; -use valence_protocol::packets::play::client_settings_c2s::ChatMode; use valence_protocol::packets::play::ClientSettingsC2s; +use valence_protocol::packets::play::client_settings_c2s::ChatMode; use crate::client::ViewDistance; use crate::event_loop::{EventLoopPreUpdate, PacketEvent}; diff --git a/vendor/valence/crates/valence_server/src/custom_payload.rs b/vendor/valence/crates/valence_server/src/custom_payload.rs index b92f79e4..37ee272a 100644 --- a/vendor/valence/crates/valence_server/src/custom_payload.rs +++ b/vendor/valence/crates/valence_server/src/custom_payload.rs @@ -1,6 +1,8 @@ use bevy_app::prelude::*; use bevy_ecs::prelude::*; +use valence_bytes::CowBytes; use valence_protocol::packets::play::{CustomPayloadC2s, CustomPayloadS2c}; +use valence_protocol::raw::RawBytes; use valence_protocol::{Bounded, Ident, WritePacket}; use crate::client::Client; @@ -26,7 +28,7 @@ impl Client { pub fn send_custom_payload(&mut self, channel: Ident, data: &[u8]) { self.write_packet(&CustomPayloadS2c { channel: channel.into(), - data: Bounded(data.into()), + data: Bounded(RawBytes(CowBytes::from(data))), }); } } @@ -40,7 +42,7 @@ fn handle_custom_payload( events.send(CustomPayloadEvent { client: packet.client, channel: pkt.channel.into(), - data: pkt.data.0 .0.into(), + data: pkt.data.0.0.into(), }) } } diff --git a/vendor/valence/crates/valence_server/src/event_loop.rs b/vendor/valence/crates/valence_server/src/event_loop.rs index c89a7c00..8068f1ec 100644 --- a/vendor/valence/crates/valence_server/src/event_loop.rs +++ b/vendor/valence/crates/valence_server/src/event_loop.rs @@ -1,7 +1,7 @@ use std::time::Instant; -use bevy_app::prelude::*; use bevy_app::MainScheduleOrder; +use bevy_app::prelude::*; use bevy_ecs::prelude::*; use bevy_ecs::schedule::ScheduleLabel; use bevy_ecs::system::SystemState; diff --git a/vendor/valence/crates/valence_server/src/hand_swing.rs b/vendor/valence/crates/valence_server/src/hand_swing.rs index 856d36cc..bf93e96a 100644 --- a/vendor/valence/crates/valence_server/src/hand_swing.rs +++ b/vendor/valence/crates/valence_server/src/hand_swing.rs @@ -1,8 +1,8 @@ use bevy_app::prelude::*; use bevy_ecs::prelude::*; use valence_entity::{EntityAnimation, EntityAnimations}; -use valence_protocol::packets::play::HandSwingC2s; use valence_protocol::Hand; +use valence_protocol::packets::play::HandSwingC2s; use crate::event_loop::{EventLoopPreUpdate, PacketEvent}; diff --git a/vendor/valence/crates/valence_server/src/interact_entity.rs b/vendor/valence/crates/valence_server/src/interact_entity.rs index 98e0d84f..1aac18d5 100644 --- a/vendor/valence/crates/valence_server/src/interact_entity.rs +++ b/vendor/valence/crates/valence_server/src/interact_entity.rs @@ -1,8 +1,8 @@ use bevy_app::prelude::*; use bevy_ecs::prelude::*; use valence_entity::EntityManager; -pub use valence_protocol::packets::play::player_interact_entity_c2s::EntityInteraction; use valence_protocol::packets::play::PlayerInteractEntityC2s; +pub use valence_protocol::packets::play::player_interact_entity_c2s::EntityInteraction; use crate::event_loop::{EventLoopPreUpdate, PacketEvent}; diff --git a/vendor/valence/crates/valence_server/src/interact_item.rs b/vendor/valence/crates/valence_server/src/interact_item.rs index 437e54c9..4bc897b2 100644 --- a/vendor/valence/crates/valence_server/src/interact_item.rs +++ b/vendor/valence/crates/valence_server/src/interact_item.rs @@ -1,7 +1,7 @@ use bevy_app::prelude::*; use bevy_ecs::prelude::*; -use valence_protocol::packets::play::PlayerInteractItemC2s; use valence_protocol::Hand; +use valence_protocol::packets::play::PlayerInteractItemC2s; use crate::action::ActionSequence; use crate::event_loop::{EventLoopPreUpdate, PacketEvent}; diff --git a/vendor/valence/crates/valence_server/src/keepalive.rs b/vendor/valence/crates/valence_server/src/keepalive.rs index 0f97774e..a73552ed 100644 --- a/vendor/valence/crates/valence_server/src/keepalive.rs +++ b/vendor/valence/crates/valence_server/src/keepalive.rs @@ -4,8 +4,8 @@ use bevy_app::prelude::*; use bevy_ecs::prelude::*; use derive_more::Deref; use tracing::warn; -use valence_protocol::packets::play::{KeepAliveC2s, KeepAliveS2c}; use valence_protocol::WritePacket; +use valence_protocol::packets::play::{KeepAliveC2s, KeepAliveS2c}; use crate::client::{Client, UpdateClientsSet}; use crate::event_loop::{EventLoopPreUpdate, PacketEvent}; diff --git a/vendor/valence/crates/valence_server/src/lib.rs b/vendor/valence/crates/valence_server/src/lib.rs index 9d880bd5..5dd50850 100644 --- a/vendor/valence/crates/valence_server/src/lib.rs +++ b/vendor/valence/crates/valence_server/src/lib.rs @@ -18,33 +18,33 @@ )] #![allow(clippy::type_complexity)] -// pub mod abilities; -// pub mod action; -// pub mod brand; +pub mod abilities; +pub mod action; +pub mod brand; mod chunk_view; pub mod client; -// pub mod client_command; -// pub mod client_settings; -// pub mod custom_payload; -// pub mod event_loop; -// pub mod hand_swing; -// pub mod interact_block; -// pub mod interact_entity; -// pub mod interact_item; -// pub mod keepalive; +pub mod client_command; +pub mod client_settings; +pub mod custom_payload; +pub mod event_loop; +pub mod hand_swing; +pub mod interact_block; +pub mod interact_entity; +pub mod interact_item; +pub mod keepalive; pub mod layer; -// pub mod message; -// pub mod movement; -// pub mod op_level; -// pub mod resource_pack; -// pub mod spawn; -// pub mod status; -// pub mod status_effect; -// pub mod teleport; -// pub mod title; +pub mod message; +pub mod movement; +pub mod op_level; +pub mod resource_pack; +pub mod spawn; +pub mod status; +pub mod status_effect; +pub mod teleport; +pub mod title; pub use chunk_view::ChunkView; -// pub use event_loop::{EventLoopPostUpdate, EventLoopPreUpdate, EventLoopUpdate}; +pub use event_loop::{EventLoopPostUpdate, EventLoopPreUpdate, EventLoopUpdate}; pub use layer::{ChunkLayer, EntityLayer, Layer, LayerBundle}; pub use valence_protocol::{ BiomePos, BlockPos, BlockState, ChunkPos, CompressionThreshold, Difficulty, Direction, diff --git a/vendor/valence/crates/valence_server/src/op_level.rs b/vendor/valence/crates/valence_server/src/op_level.rs index 55da0b13..13dba308 100644 --- a/vendor/valence/crates/valence_server/src/op_level.rs +++ b/vendor/valence/crates/valence_server/src/op_level.rs @@ -1,8 +1,8 @@ use bevy_app::prelude::*; use bevy_ecs::prelude::*; use derive_more::Deref; -use valence_protocol::packets::play::EntityStatusS2c; use valence_protocol::WritePacket; +use valence_protocol::packets::play::EntityStatusS2c; use crate::client::{Client, UpdateClientsSet}; diff --git a/vendor/valence/crates/valence_server/src/resource_pack.rs b/vendor/valence/crates/valence_server/src/resource_pack.rs index ddd590e3..703682b1 100644 --- a/vendor/valence/crates/valence_server/src/resource_pack.rs +++ b/vendor/valence/crates/valence_server/src/resource_pack.rs @@ -1,8 +1,8 @@ use bevy_app::prelude::*; use bevy_ecs::prelude::*; +use valence_protocol::WritePacket; use valence_protocol::packets::play::{ResourcePackSendS2c, ResourcePackStatusC2s}; use valence_protocol::text::Text; -use valence_protocol::WritePacket; use crate::client::Client; use crate::event_loop::{EventLoopPreUpdate, PacketEvent}; diff --git a/vendor/valence/crates/valence_server/src/status_effect.rs b/vendor/valence/crates/valence_server/src/status_effect.rs index c1de795f..35b48065 100644 --- a/vendor/valence/crates/valence_server/src/status_effect.rs +++ b/vendor/valence/crates/valence_server/src/status_effect.rs @@ -6,13 +6,13 @@ use valence_entity::active_status_effects::{ActiveStatusEffect, ActiveStatusEffe use valence_entity::entity::Flags; use valence_entity::living::{PotionSwirlsAmbient, PotionSwirlsColor}; use valence_protocol::packets::play::{ - entity_status_effect_s2c, EntityStatusEffectS2c, RemoveEntityStatusEffectS2c, + EntityStatusEffectS2c, RemoveEntityStatusEffectS2c, entity_status_effect_s2c, }; use valence_protocol::status_effects::StatusEffect; use valence_protocol::{VarInt, WritePacket}; -use crate::client::Client; use crate::EventLoopPostUpdate; +use crate::client::Client; /// Event for when a status effect is added to an entity or the amplifier or /// duration of an existing status effect is changed. @@ -147,7 +147,7 @@ fn set_swirl( .any(|effect| effect.ambient()); } - if let Some(ref mut swirl_color) = swirl_color { + if let Some(swirl_color) = swirl_color { swirl_color.0 = get_color(active_status_effects); } } diff --git a/vendor/valence/crates/valence_server/src/teleport.rs b/vendor/valence/crates/valence_server/src/teleport.rs index 7f42bd39..07a9539e 100644 --- a/vendor/valence/crates/valence_server/src/teleport.rs +++ b/vendor/valence/crates/valence_server/src/teleport.rs @@ -3,11 +3,11 @@ use bevy_ecs::prelude::*; use tracing::warn; use valence_entity::{Look, Position}; use valence_math::DVec3; +use valence_protocol::WritePacket; use valence_protocol::packets::play::player_position_look_s2c::PlayerPositionLookFlags; use valence_protocol::packets::play::{PlayerPositionLookS2c, TeleportConfirmC2s}; -use valence_protocol::WritePacket; -use crate::client::{update_view_and_layers, Client, UpdateClientsSet}; +use crate::client::{Client, UpdateClientsSet, update_view_and_layers}; use crate::event_loop::{EventLoopPreUpdate, PacketEvent}; use crate::spawn::update_respawn_position;

3;`?zUnOHD`5km*m0~l51^yugd~wOL?pKXw?{C?U5R1FbFwa1jm9w z0%LtB<+e^f)r-~t&?2Esoop(KHRY`f7#yQvrgo1k_TApKrg?NpYl`lQ{yUfgzhe&roD@fD)f>Hn4~m($wQ{(9MRL6T zw-&B-$)>-K^3Xd~i=E>&$Bld@>rh#He%YfYV3E(o0p|}57-}s4qLRfW2TigYKDb)!5idWBD2`R zNmQ-4GV}RuVnRsO(M)K;vPo)NtM+0*6qrx59Icw@BTvfuGsuoK>D?8Pb(+On;@`u;_Tr1Lox2=-k-%%o^aEj z>7~A6$*L}0y8$cNEr8?e5w1r2*BmN+RlepQc4}+`xRk<`TEC;FbguoHr(fpW(P;Fn zUr7H__dE|%w^poIMqo84GlT18ERA;V>QTcPCYMKk)`%JJAcs%>3gcqA+A^JVa&w#) zAwkf}{LI1jZU!l%BQ7e@Vbzc$e>0czF5W)Lg;GrvEI40Qv94}qp+x~rX3lSzM@JHz z+jKwZ@Do1%h;TiLWas3R52Ko!2o#zMKUPJ9WZ~rPY8T5*vy?C2!v}n?`pN)QVV04Z zvYc4v63lHA8fx(6IBsvk;gRdpt@P>$}nJBDM zJqXv0RUc`3gZaFe(ng9<@=B?VG5_2nBhKtow9nsIX+_Tm{puRZa@Z{R4Lgn<=O&u< z-k2wxcWUV9f6)TkLQ-Zr8UCRU|BJ_-Kb$tI-=h4 zAV)M#=&JtG3$=!pp~YfmH5Vp492%0Fvid1UCjla_C`l)WDm1;xlfR5PXI;K`FV@&} z$H7d*iNA?03ul#jjVtpS98&}#AplXu;_iJsAJOuz?iG~4pU893#m;<~-nQ1&&C}dG zH%sD2{o$yRYu9?pn!9sh8={JqxyVv01*=b3t2wo@&YMQ!M)dgh@h`KeBIk0k;a?Z0 z%I&UWiA2H;Pp$1;hdjn$qxWTuL^|H+J;rAH8XWC<5(Fd@Rg7s?z2yz6AN*Zx`wF&KAR>HeeZ67M`nfeXoSVy83H?r#Rf>C&CoAbQDXKv9zo*%pek6XHk zPEaf5BJv9i%6?V5t^Jq}GE0tCQbfN0_HY#!hP~7B(j^1F9x*c++s-Y%p$@I0L7$D> zl~{Ybi;t43@hLnvv^4G%UW#e+5}Ak>zHYFg88~Zs^6~MtH!(~v<55j)kHd~!6zK^y z@NiK&5&Vl=g(^(+VUN{_gC!cJ*MDGk4mne%Jbnm;Nrn0+sF2{}moRM3wvpL9OY0$^ zqLKkkhU6I-!FH)Pj$Ve#GjSN&M${|ECd%92)%n(>@XB|ilDSBu$G0>57u4tYWQkkF zO1ab21*~}e=IImc)j#>L6_b?`lf8Il%ZL$nsh2v4pH+2OcV6O*sk^nAZaI4f$HPAgm_wS&)m5O$zwl!9kT{j*IHiZ`*XJs!Ag( zYxApVtV2G%aPeR|x2;`o4Y=3d;~ZAFbM4Z*bNPe(ixtpf5P|tHl!%CKEc?zt?f_^E zU?h~>wIBB}Q!z7lXr;e`9CpWhSh-e%iYh^Rr{ujC;Bbolacqbcn(!mf5PvD+=%Q-r z#i!Yhg|@wS7|ZrVPDol^hu*zDsSrDD{LrL_-NYt3bV~Tm$+j|>fkw-o5F@o(m* zK_)~2C)abw$@6Yw{Ai0Zai7+A-|-)ApFK(F@~K}s@?AS}Fn{SLr<>9mUFAlSU)9)| zXxKYuGj)J_`*vFQbLTtLOE>@YK_1qP&ZH&h$q2LMeW_dsuWJM@MM1Aer251d~ zo2>vcN7!y?-q>Du7#MsJZ$}8y2yu5G-=flQjjVyegpaSU#hyn&;Rbk5_wZ>^PTEfR z(#79kX2yLKdYzIIfhzzMj8$^+J;wY1KGuNHf??6aP+DM&AZ}rX#>UuoRTu9EzdR!b zK$SlSLL;0`R|y)VyNzUjh|}Q3h{m)qJxb5(7XDH@=sYh4-}u#TZiflWTcP*XHcBHX@|s*sq<4?y+yTQ&|)g*tc_sq zydAqH_NHWhaXnizkw2ME>H!sHP06qD+-dnmYhADY zc8Cfr5d7?_mt$e<-Ey)|qwWXGB{;EVpF_xz3JTZgWW2t!uvB~DkUtl z>I%8^+sP5GC{SrSfSB`MH>$*HuDid#@h#TX2Is1awN>W^jp_&Qd0}ei1tiy;i4y7e z4-`>jf7GPc$+vF}9E6MBq>Pl4hv5v#EvuE)>j|fm_bJ>~B$5iDcgKMLayx*vs&U>?Ynysx{GUjjLdeowDmFP+Bxtk z5^jJ}4G!t2Pi^+s=aY_-z_8^8WL-!F9)qJKFmn)*+qXdzCm5aq7x5iXx8RGuK|!g- z#n++0M@Xw6PXZXtEIK@#2oVg*oYKj}>#Po!Ol5T3f|Y>ekijq;jB^kc8wJHGi()7( z!ias&(k`?NXg|DCa#s`BZhiS`jTfN?Ucx@<5KkW*8Wf(;TFvoNE0|Ni|0;6Fm#gO0g5z8iG# zkm2B=k~It796%7UINUabfdy*M0AcD@?oVQ)R9LcuhJg;7;ia#`?yS^Ir)v1ybwoukCME?=A~&xf5y?7i3%B+$m+>icI+wF{;u<%HYJ&1 z(?ceB%Mhr*FV=9twleB$$_#jkJT{2W}e1_?NVJt=|QPKzETY1{xMkF!HVJs zzuEXLpq7b&MIQVtf{%k8C-Ci`%ai24AU$vExE1dpLJS( zN=`;HV)i$tG`0>XaJ|z)DqPQ8;$036fzeU}Mq|es{SdRaU!hUij76xFxa62}ca7N9 z=E`~MZ`-jXQc}|OM)#~H$4AGpVE07ulqG2!#-`2_1nbpq#O+`;zOHE|=mx1pU*vBF z4m^Q~1bf9L$N>@pgSlJx?u8VMxqt=XH4dC=pnM}%j6ly81S*tv&{8O*7X^qXD~aX+ zdk!`TuxJMA=0-`5C97V3)Z4ejH_gNTiwkg`S*@5gqyIP*z;>@*|5!*h0}(Py`MSqk zBqRsix>e84@A?^@j(pf4AfW>p)7-r20V}Usz!K=XU);)UkATX&JY2$Vz@zEBa}D^1 z<&bEI5W!@GP6++$*)o=aD-S*muwYzrGFc+BBXTUy)$4+Tsm54{(+Eq_uSfWATMBpu zdh}cqf>JSmAFP%{c{LGBFve^3R4zi-L;@@3-t(Cg&N%F+BIG&jbU za#MUA8Fk zFssF0hAIn&u*ZO44-O8xtX**3^Uuk1>O(HZ<*Sp==)>eGPB6R&G~|&7VVf zEr<{V0#AU87>IC6D=R6%R2a0PfRL}bo*gyiNx_GKoe+f5`NsXs-_6F_Va-Re={~OJ zKp`ytvNtQAayJ&|=;H;Qk@+yNpV9V+G$Kf6=%iyIDjrNgjeuwv308)n&(>}po3WHt zQE7%fwgq@R{Ea}|djihQ`U7Q*EdwiWURUh=lC=k$T=rMB=V5t>Fxz&-3rIz=y(=&0 z@9=O}%1BR#p-w0eQ(2}hK`VIx>rGNh>imPGXCPxi!C?hsY;TyRy7hAs(zIX^M!*7w zb%oHgegqEmsAMT7%inPy-)jkj)l(ysB7)U4<$${L7hbF;B<#42CbM>ej>lg;K0aRT zu*Cv~#vL!<(1JpN25dn(gwDue!v&uR(9(>a0U8|z*G>PuRlq|z)oi6 z;CM@m*oq)b*DBrbMMaRo{8&*@u{vv7@Nk|60q^06=XTovHf9Or*C!xEfGl9x_B-TJ za7@6crvoM(VD1ZK9*1Ap7p>J#HWZ}62C4ec6$w^{!O8LQoKRX(5ivaYzyusBGMj@k z%jK`#sYWPJ+Pm(xJ~?~zf9*?>(E^U&on{{Iz^GeLCLRPgZew09ay|1E4w?YTgED!M zQ%5bQpB=d`1h2tIS$+{~#t4r; z>}7n2Ycx1AtxG+;{^+0P5YD}aC|DhE&%oW)GrS0Lg1|bvu~5G}#}ddSP-myWu;S{G zaZW`8NL!>pKnzdlmPwZFBl`ZG$H?y6e~ULR2=c(7x&%_U2H*XFG{%WCo0$r$ln_1% zpvLSUkI<+IVSOQyYL9=cvwS{aj*r`Beyvz7n~Wm-&o)$B_4cp&)_HG!2q+x>(H9nf z?)49Z(fR_i32|HVFIJo(dj`B|-D=bgzZxRx;4oWilyA5N(<$IZ$u=g~O=5X@dxH@( zR1307O7~Z<{mxRni%8DlI6^Yvz>oA9kP4qZ4V;4~meSnLk>2sxq4%_E`&e>s( zMg3xCEC|BE7+QkjeoUJN%~kPDTXpmerJ$-}@djB%#W!tG;Y_f3k9gS|;8##z0-)nZ zCjfMCKi|gqu`w_#q}+9Ey7g!?x}O{@avOEn4%9d`zQ{We>6Q^~&5LrveS~>5Tq70O7u2?!5R*4EZ<`BkXp;b?*UOn5kxmqwpt$=|8!=}_LE zyJphp`NUWlP6tRyS#$8F4R}e((KRya)v`cqV}#q*mu6n_>XTP?N7;0 zcq3I}DVGc{3E_Hcx7J{J+}Nk_T0PU2lxj;%G$7G59rJP~my7({lbK7l*Lm_p?9T{d z9Uvf7Xk-G*pKZbX16FB8Jo3`}-Tgi9dS2-(c2VfeTpOM@|J(2Si-{tz$93YezQ;4} z0?J+(T?Tcpt-1etKeZ2&p4Jj0KT5@`3g+-QmGxE$1& zG}0k&d;UL7dxp0v|7nghr;hTdXQPzUyDZ1*`o774jydgZu4=u$t6!bH#a7Hhz86FW z&ONZ;(Eg(FyflpO7sPhk_5{#49^DZ{zaf(RNvwf3!A)sl%<^{VLl3i-6fEHX2w0{tOTn}tm`>X~z8Y8c( zR%eD=e{jO_0p+yNn_=&oSf@(?JgkYAYA^XTEj3kfcV3_$#40rAs=FY<`$4zd{LmzT@Ekc&eV;vkM2 zU6LQ7^-0!%W1h+xAJx*XMfia(>1W$3yCaDvX*$#^e=`Zc%Z`GNzrySao6^4dQ{$?KkT}syO=Tr?JN$S%3*lg%_V(;Kcgj3g!>(p$zT)v0f zp3s*lUt2;HNSEsSL2jPA2fw@UuR^7vIHP_a(Z2y*s_~;9v~3VLwvnlMatYeXVAo^q z-opO0+*8|O+*y2*p~^-zVH+n?ORIDy_g!%{MZm6NVLi!)V5J57OA#rdT$xtR{Rs$6o5pWZsFmiM`8XEib zj2;olT>pd@D+E^=e!dX!PqUlOQ^8#lh2q#N*x`F0 zI7gfqs+3Q7W2$fAqxh15r$$^K+e#AGW^`ZO&fqw$f-Dck@VB-a|Lh zF7mT#Qwi!}Mw5D+%VzBE8>EP%nE7M49zDHxmHPa{OvkAAFVk`#%WR*=ESko< zdTq(&*(a=?q#lV*GeXf_WVui1ajmZG0E`CZ@A&l3P6uw(l`B^eLw#UXK_bBhlqTPR ziHkU`NlPQ@HUPFjHiVQ?;B*ZxL{&%+HIT0#On2txg#jj70UVpE-PfUv1)&!uoKj%6 zi?9#jbU@vBbOlQCo1C22+`t3{6fyTm0};M4ybKDdU7%+NQ~#)kPwdd9$q`O;*e?_OKqr%0 zRu;pqKU^ogw6p}4M401HDekBx!*|$hSJgT?{;IA)I2!<*C1^FZOIa?!6zl~P5jZJg zqcGnPI|lI${kHgCm@F00c*}EToM76YrckGP@C}iT2J`OKG}#$xQNN3gZ?-p`92^yJ z!UZr<&jj{3qF)>+2Ztp`ht_veeVYw;gG(RP-! zDeL?)J3odq-A<`<;4I!M`j}LD30eAaE2O+boIh?2gy_=IRR&HsyBin<`qMaS8)V~c zk*xsieIQqjTrzUFhvBvuMos& zC?P?{$%!9qUp`k<2)v9AK~#3oZGialhrNZ*tQ|kxL7;LxQ&jWoZEr{}3mp6bj|O&MhOuvxX=;JJ`Y+_LjRBF4jt zX*BTo+2yE@O?hQ=W3M7Q7u0{;`YoHGss0SD^a+wTNBZ5>EoW>wxD5T2?nOhyJ zN`N%WXfQmm+Z-&j%~2}(cO=IrC`ix1zz6Xc(o%tLH(gu%i+9zMoTg?6BH{<*RKx@j zgpdGP^jKA(Aujzudq>oXs67WvU?w8aP`{0a+Y>05BNIZ@zIR&|05OCw2VcSAQut(! zz}600rxA0N;+OYXTxvwvd36Z6rJ?X!f=bryxnJjgM@P@EV3lLEh5e2xEVyqR75j=t z@Mrr%-ne0`^tTu2u{S(x8)3Q_oDp@X(8Tsug8RX9&j5W%p$BGr_8;$DySL%H{l-`0 zPt9ITQle(L&T|N?KP>?NG#VQqBnI3b;H1*Rp!R;(NSqwoS+PWrXyg9+5?g~sj1PD zyRNf-e=ws77|zeTIoa9SZuUimg+LRZFB%3mF5&@&{6& zR*vk@p31^hs}w}RN-N*}ZS1r^;f=rnh_OPt{3^-qClSmD#}sh}0NEZIq;2?h84w0K z3GWlr#W2x-N`4?z+CL)eiqRH32qcUkKRMRPz2biz2iE^%3d!I1QA!>rlYY7?8iHF9 z%*pHDheUaWxJKKLbx+^mRa@)%M=$-qAf?^> z{B>J1!3O|f0t}Ve^_ulM|5iWtrAv@30|BLZ0GC0=6yptWk|EsX!BU${xbk0+D^COB2><|UAV$mQaSD>X`!_7i zUY!p@a_sS8yimpb-)4q!?fq?#wzgI+*7VnN z7y4Q&=@l#ih8K#I4tZD0o=)Zq)puQ;47cyQHZk2sqN6g(3biFUeb6Pl(~yb~M&;2C z?W+02j`YpT8&yB-Dm{IFekqVoxb(&8&uyr56jqgtAl;52J(^l+!`z!Rg60%PILNjF zwrT#1Er3Ni63GuiL<|4{+HkDE5@=?h`>hmxcLb0+B~GCu7;PZzQ4rW7pbU)UAPYJP z>IcBy&4EUn3lJD^O(hf+iT;AXVAnd{w^*$@a~ZXtqv#0tgsLB~*KfzU&*=#Pj|V$6 zfQ6=~r`I7FVq~ra6wP0ib3Fi1Oz6Ls2x1pNW{?4tTjPy&o69=TvZxiC*KAp-0rSYc z0m5l&U^-!7VzT`h9?|~>I`M=b z8Y+SrNoIF5&4uvIOU&a1Y!CKxElpCc{e6sR|3fnGfrF#NK;cveb>k>hlT)MQW?$flpQ58BDLb`Gz56f-I|7rwg z@t-TrH#M9BFsG1Z09hFc`Cyj^8+z)|F3-I!{$;3g;Mwe|s}L<~^8 zs|*3&IoNYOvxWW>b~_jm!f5AsS1tJSGkPQxZ^34{sOp3XrUyvM3qTNn3xS8)Bp8sO z{h2eu9YAE`kPm;eWiyia^a$Kg5Y5>EXfUL~X8}MdXvGnP6e%&ng@^zHM(p-rQULHi zcn5DsM+iL!16l;4LC!qLm6Z%d6lgHT)L!{r2+t2V$086E=ws$`LqHqfpn!gWEva)k?`_MiDQ;&6sqzXKU#zI)8Trm}-)1{7z zpJGFOr=+lfN|s;{z0tmT}f zv0jct?5?{x<+ZSz3sm%@AY2KC8QqX2HsN z3NFQMu+W9EhW+P$5?8g_f5)1FU>y_ma%x^{=rcG{afTQ&2YKLNDi2j#P=gu zrR(0sb8fFsRIYPrkJ#cz{5)Co&(2&Iv5)dn^X}pc*kVqp~>$fp8L_*)=sa7C6FGIsY>QS-tO# zOMeT3PC~xS*^#(6^~I^1e@46rEHtkAZLN91@JppP;*ozDqb~hI-!X7TGz7Y7R-o8{ z;je|6y)CEI?GH*F+kL!mmaoHfqA9Nxh$rH@x-&Rml<1FfdJw28o4xSTP5}cj?1ml3 zMt;y1lIl9#c^*mB7)3OVQmxj&0b?cZG6(Y=wTmu!f50rIHvQn!TS?h^lqU7I01oEj z3mn!4refpiuXsruw3MB-`5pc0dZzwR;b7x^cSfon!ReIub%!-ka_X<$uE~-F6Jq?Q z^r0HTCS2^tb5)c4OO#P*46*On7zkR@>YMss9zCyPIYV!$^c<+|2RL;no_jYJb`sxrp3S477|SZf?oku9 z4G&7*>!Rl%-3}IXJ07FNC?q}d?HRzOLSH9K za}byARCdDpD1FcVO7t+fSCQ-VpwT^(jTOm|iO93v3x^Vv)q~)mCyt8(!cTk$^?*Jt z0y5seS|5n}0NI{jb4jOprv6sZiSYm4z`ji~GStK{sUiA5m`C&29PrUn#dSO#eo? zCCyC^TnuM0(3?qOZraMwOyoxEWw)~UZhK?MCa z()3gn%KW8mZogwTi2F3pDBAWena5^73}GeEeaz09wesZSR$Mo|EQBz6O`{z{Ep1?mjvcV6!qKeErIJE9zO=bfU1*ZkHuJ;7m^LP^22np>hlYh>@~ zINr)leburtYoMR$554HMFBy=D6%XUXVYo>?)YY=Ju%f`Jyi1OHuru5P7g$?Bk#e2= zl64jG1l8I;4gK3G(jfMRR~Tb(M&$cYNSyR%eBzw2Bh2@@2U=#O6bx#?ytgmWVvUq? z#&5xHq;!UQu6#X|`kchl{ED%Fy^1M!j7mA_0jl(9O<2I0G}|4`yyU(79YWr?1T~R4 zQu5l(dL<3S3-S+Br9EJo9%<_CrR9058$VsT-s zd+b2+fbK2CU>@0CY71|-BtARj=686a7*X%BZ2r<=1!v5^VQ`rqoCYIitb<6~v!$d( zJ|whsQk?}PXA?ZiYWQ|A7eBEme1Ti0+n|$>=%pFAXJ-D8I*b1;gV@SN%IC334dhxB zCMh!p{w{8BG^jJS2^s4(9cP!&6Z_O$vYu0`n$`#<YPIQYN zQIf=S1)2KN5(E_2SY;l5tQqO77%0Xq)4rE3pNMNQ?LIikEGl$pR;H&Y_{x@v&ct_b z`z`R5Qj|YGz~ejDTcgA)aYDjjrAMP`%6&)LKG5r#jKBult^eWzv|+qE2Tz;d!1Y+B zEMcMKm%vBXt?P)_tI3z8xLQ_p{N7MT@)>nu86o(?fvFM%DQP`ntI>Vt5S z-@9pUGeeoi7T*g9PLp@yAMVDkP=F_nh~F3x#P9HZXwv7pIb?d-Y-n|mxzi<;M8On2 zDB2;1qyMh73|Ol3+zEfbI8GC{Vn7l-crcJ@RN=UVMtJFRhnWW}Q&1@eaQ;zf@SzU_ z#1Fv;BjF?AwiEB$S9C^7u2Ij-mZhguTGs4=!Vpp+DBwS)tv4 zP?)Lm%_ki=+tuiJ-+(}pqYcpOr^G}QOlf)+J_CLOWQ>o1rbd80TcZ3OKunR;OF(%> z6Pw;;5-gvI{F7=6w!cRzOnw6f)32-ytV(WSDJb&ND{!lJ+|=AyS0kaqbP#Bt{qh#~-5uo4!FkObgSMV%D3<=`xXGsu8$afzb3qt{kg1VQ4lJYhXh5*943XCa; zMD|`|^m++#Ix~Hpkgxg@(jyUXZ|G4{rJ_Ut#0CuNKN1*A+`B+8mLv6D#o|rC#H(b+ zDTDR1&gQ`x*EKuWb2G%322CjCw287cL2iHrt9Vg0HGsM7=vc~mw%6OG|;KyF7T$HPDFUE114O8`{U>k zYa;Ue`4#vgfULmC3uu|q8ZEa63nmB^Ubv4~>5s2YgwZZUZ!i7_EWfzwB0Or4pbJqe z7lvh?{}Yz~cyGNDoXtZax(Kp^ii#pwD)(!*P?LxSJ0hh;y7&0SP#mb%F~~a-R`MuyKIo1(?(~$od6Ng+M=0kS-LeAlZ#RetwhC zx%c*!6bVPe+CbnZ#5b(qd#R%u^j<(O`d^iO2{hGfxc4rNQifE9kfTJ2k}_ndOeu+w z;fPWh6GAd;Bx94LGG|JWgk-9SRLGn;<2EbPHf-GA>zsS<_uciayViHs>YRh!w*Py- z|Mz{K=Qlwp{!!a3>au98;NjR$Wc4E0U z%l;RYaQCkA#ubp91hvY%&TO@=owJThi}$n5Z}cb|+koA3nHRgZX-U@a|L@s3mp4?J z2!J1|eVxli+!%4`aASn=L&H0J0kqE)5@$*}FWe}YoFfz99Gv?pT~w;uD4BL5p%#xP zo+~g~)J(1=&hFtFRLibl9Ye$Zqz7BojHj2t5Q25%#uXn3H4#1S+qdlh_zVkgou4xR8JlE=9Q}0P|1=d$w`|1L(F#KY8d%z1r<1R8>TwQ10ofG>X z{6fa6bv`%1Oa+VtYfL=rZjA5|xE*x3-C>v72M?2H3SKVjsCW@-8XEC0Uk2blLw-iv zTe8p<#Ks_Qq+9M0t^SoryX{Qhpz6`NPi%~Cpdhe}yuTD9CIt+5LKHPX(@{0Vyi z%$X}28bH5X4cEqaAi-cag6w7R=KP&D2@1Xk$5e*;^PXfhq;}*80TIW)YkT!4B_PIA z8XGLEf=8>4iNX4jqW{h=y22f40ayedtTG@`KSXXX1ULb12GTjLj+~l~B<owa%<$_dqH_dms$1Kj0$hy0Ic&VcC{5&7W317YFpT%j6-4QVCm;0DEa3ZbaK z{^$Ydcu?A==FhxHkn{wrO>cu6z;6s9ND!%YAO&V>1`h4_3FRF_aU#kG{Lzr@kU-s= zt&@ON<2m-UjdB;>9+>t%m9#D1S8j6;XWAdfcGjD!%GC}U68{o?mTG-gUNKxrG7^BI z{$?`q`7_Z&yzL$y-B#tBXY=2qW`JN2n7cqE3ogr&>VF-Cf_UYQ!iVUMNUWyN537s_ z-u5);a0@LYT=z*dH8l~3O*^~0&}m1`QhZL10514HnTPBSm`r2XmJ74rh;txYg8p0a zn|^N{pZs@hJ22pjfjbw}%ecHHv@h4N9V{K@{SA}EGz<=+x{2>bb@kpJ>&-$Hc(?rE zBS&V^8qcIY0x;;$s?Wm-h|e4v`f@p1b0Gj??Rj|Dt%tqF|IMGIz&{BVkjerkEb|{r z->A>q_$SG}R+U)9PYSV&RdPO_`ThMrGq{0u zIU$ZZ$o$sT&~M$&`tRY>fbkI$uWlN7g5aCga)ld+cti{Hhq<_E zIB>4`Rrj}Tw~qpyKO`gsJf3AD+oh#BL%z}&Vv_I70YpC!(lIM zLG_@SSrSqJW~%%+(?PAB5lMHWT_V}Q?-zFN+O=)_c5}^ecW)S3uIJ^|z$*OVa#K$) zK~_?7Q=V}JyvUS6k^`w@i;$4T!3ltzaB3{a)Ey^=eL}_KJvW54M=aRsCW;P6|dr5nQQYO@Qf ze)=QY9MuVA4UYBP4MVaQVk>_Nc;WZM2S-_p*lXfiKnSPKd_{gA3QcgYjGHzbW@4ru z^WR-u#L9Jc@Id-Mj!-%Ux21DbM)XpR0~;>p$FzJ^m>bt7Y(>!YLFgvN*8pw^iv{Zk z0)e7-JG=2-E$qY^T3Yw&#q|!qIyD9`cH)Q|Fdk%;Z6bESd&1Oj-n^-)srdoo3Ch*6 zGD(B?j>6b}z%1re)>`4-L;u%bfm`wtkm2Rw8YD#p;+!t*ti$fuGS6Ug+H7CKGu*uj z)HndPusJA%DewtYxVZ5FGqwWTNVPeorw2xQDO^q6c_nEW^#+0)y~nyvM1FzpkU9hp zF=8GJnn`f!dGMCb?&fGt=UK6S762dFct9^_Wo#WdTDw!zXVE{>UhyQHvxHlmxBHZrP0E&j`9k^KSV?otZ6OZ2n0dRYb22kA zork?E;O0rGl(Nu|4~aDc==RiGn~Zz)=0!a{Jp=d@BJdqIxq5jismFv34&o#)_s5A) zxNCuXd=6C`;lK}fuW7N&Fhm!LvImd{t&wjFDkW@ZC{|`J+Cm|N4~nVZ$i;RD(hVG^ zsx~&eh-r$HCtZq^FOGwVSrNpH7J>`j3IS2kps1)V7_n=z-$G6kcKEc0i^QX4V5Il* zX*V{!a{wpy{i1G3iOk<$Kj?W`>Ey{OU1>vYCO!u}&*0l@sM2$vqoda;lN%JWi-DZW zCp#=E1ZH5v+!=45uQKZ4L;|w>8!lcMnQR3Bi4Cpdm#E|qanj{L<8si(5o}m?cJ}e3 zZLiNVAbcH$R^X?=^@sPjuji)Z+OHsj6Y2^w_u`_XufeCrzUMoqGjC2ytMx7~=a%|t zH-a!MWnh4+5qQ8@X30YZ13Q zJ8Ax+z|UvXqbJ^^C6Sxx=5KMQw)5hwTwIOT=VWXLuOO^(IOhPYoca0rZ#2G|KN_YU z?-_W7R*!wDWt=|KCO|$Xg0Tl-Vcp=Uc^<3&Vk5u)UE0-W@7v-E4ul-oobNo0z>{ltlV(40 z2WpgD-#1Vy{Vw>upRMP}`t5C>oF9pFJ5H(v4K~Q#WF>*WhmHQe5%IoFS>`vM>C#rU zqzA7vvuM3t3`SN~F>%>piI0Es`>8K}RK-z;YYR@(;H2rx{qalD`SQ@oR_j=J=oHV$ z9CVty@y~1dnCK%z!4tf`cmkDG#)*aM zn)n_;jls6QKZXrqOM?bOGDtSgO_nVJWCy>rG~;r=&*FRh)R8>geJ9v>QDsMzpUQY9 zDrWx$D5h)m`rl(?IWH!-VpQ0y0&-tCk?ZQ1`7PyCFk7h$+tgPRPD;KkOAZ}+slPyJ zGG5?&)SBa0^=T>Nn-j)b;WI8-F^sDYcBhsY|8Toez`d<}BxR1bZ0%b2G%r5U(B%4w z$Cax^jP1oDb7$94zg0};wBE^5=NEU~syaE?ubb+1h9zullf%rn!ngbP8)?xOKaqTP zcFsx?V$-P|{g*`U*fvKyeIZw`xefJ}o-S)L1x$?W;W+6prFgh-6%*sq5bFBnT>Vzk z@12>~I%P1taMm&X3*zO(+PnhBfUt*m;>y&AvgZq={(0vLJALy5Qi!GdI!En!=;mT0p#W$%vJ)C<@K|gTF zzfLGE*H>amqew z^6R%*IjNj~350nz$sS(2;^m`tRxe&iUHQHD{&w{(PDeLJx1Y7hkQvs`Sm9lm<6KFf z=$-S``cw04S6;^y7Tc;l5;f`Z8XWx`$;Vdg+w>$UNFx_i63UH7rftQsi)fN zaL!sQ$FK)lFEh)L3uS-GbTWovsVsy!B=+ z`7Da(x5h1>mZ+;=&(`Ro&{KCxROeZ2+4=a`yzsFN-8y>Da6V9?#+bKk+5PyDVAvZN z_8w-^dt!E8j>Il=Kdm)ATR+=Gk$OA(RABO%ZmpE{KxOOwp!D3OHa+Kc4A*9^m!`Ze zn3eDUwS}${{ON*tteV;CTb!qRabqsfnm!kY&AC~J52LqiE{!H zUCd64USeAsg2I&~tqrN{^HWkUXXO>`W&Zg4D@#fTW-1i;#J*z+Id!Zz-fK85DLh6f zLNZ&MUFS(^aI$uCivkq(>`>UJ8ZTo$@QbFLTr2+Pk+4okXmzuly(VqoUd(u-PO6Y( zXiT$FvAX)UU3(vdjoBu2Ip&vy&*oU?>-$Hl+~Bv`S~em6V)1j7^t9U7e_wF%M&09{ z4bzT@)I(mgHbSC$)VChWhj=zNHr&x;r_e*2*Kw`2C}{Ahb4p_kDd4qHu?m(6$-F}E zP<49rRB~m$d~Bg#h;{=&iOgfpO=0&e&=h+8{cTM8cYuN%M~2O z@o~|$eL_1$ei_;Ck@50!oUzqd^4d^jna`~W!=|<>JJy`CqltS)Uljk7Q?I(7v%|iV z*h!oIv||tbRdD_gRdl+%oYmUxENi*nj_aPUSHu-wPmbGQ?zFc5i>=J-pf{HXmn$zz zdC%QFd?0P`=Z&E*;fvBPQ({k4zlcQ~w6su~b`|zE6+hSFKv}po_9O22;7g_Ck8fuA zG^=P@jif{#m~DR0&O%5lElomF;z#o@mrWjdUKE+Uh%4!a7UnYE=N0zW>J{b8I_dhMMMj!t@{6Huy$CfT# ziu#H;&!g77?BI5ZQNnfH0`!2{+IZY{m3%=}`6kPR1@~$^$X0zaU@DN}A85=dH1~q$ z`o`cD_MeF(d$Tg%ADC;^-^HW9OU^_`qPEtq{i1NYR%I1ANceB_2aipzUBQ6nm*GV( zdQsjs5i(~2Q8^ezKB#gSh#@QdH+TZ+&LhUWQ2v&e-6dCHUnsR$aUCKD>y56oSUxs3 z@n3!zN#<(sTOcrUdbC@vis+Uipgke%_W22u1*Z=~IAZYE@voTeKGogXu_LsJ;ZGjf z7#B*rPyP1(>gY1v9U3O*w%?)W`=2l|S=nb~aE$phv^pTp(ZRlmo)}2-Mct+tcM?^O z9F3EZh$owDVL99y{pyv?!8GzqB%k6GPfSjUFFSuZfip&hc>LIm=Xx&Mn-@NKKOz#* zH{pt=JgCxQvtuWrY>S9|H;=$OPhK|khA8Db@2T>hg>EWc*RwYYw2X~v26Cs{FMWTm zE@ES5RWacqvY3K(dsDDBZMJIPlZ6t6d3()3l1m7c^j<`m5+Xcv;zdZhz^(){mhu~Q z?w^r``4N&JL#TGc?$F^}fWYpC-w9&-`}a|+9T&_QOXulAh$b0p39@5a&1~L7Z(6-q z>5QfAcIr1VDHG2}<1dq7`gG2B^C5>qWt|=SShWPCJbPI-#BCGFrpa5q*rCR&z^W@1U}QWvbieJv$)!I1jFN*Jst46+J| zA!^Z`^&}+W8-!cU=F=qm;nNy1!apZoZ}51$cI_HP$nO)e@Iyo2GL5W8-{4?k060gk z|7I^+=-nd+HCguQhVY)aWpK4#PDv>!>g_KHznIs*QgT)^uI3l{>v~aIXJXQe^G3y6 z=?n~Z(x=rQ%W``EtX$nJer}^~xA~r|%+c^|$M&cw&%Rv0#cbT-@Zmz&qD}OPjC+4# zAB$V>&(IBl9a4NnI6B$oXXf8@_d2?kZw%+RAJo^`5t6em+>5g0+Q+vNrHy1Ec9?ag z$EKc22G?CqX7+UKG=_fz&PZ3I4<$9MUe) z@m#-ggH!tQ`CwTBBOxf}EFQZUw^Lk<w zlN$4Ik0ha8?Ol}u?)kQ2T(2JeELwKIIB+}Ox*G?a@6JtYX>68nj*YbqxWf?Q*Ymz{ zr-#vEG5j%6$3wlvIopUnk?M5;R;$ES8kslitZecz3;~Uw&(2#wCEyI2QQ}o#GCvwR zJdU9if^ItJb1~ruj$iJw|=n#(s^`6 z!zIh$6^zJOH?v(YZ2!<_w=~>KA^Zv=Q`1Y5BzCm~MGslnZr?5S(>#2x(#%R(i~R|g zXosWJs#UADZrRO}Q+B(rYFpIU1@Df_+24BSuoA-c4>Ycvxw?2DFpWz)6(pzIN^oH& zTB6L!=If-xD&I78hXf`~IR727K7REpnPQUW3+?tJ*gVwL>DyFBS~K7M!z-1;4R?r7e)_GC=gqpqQ{ zQbXq=we7QTIyEZ)W$cLB1p`jMnBA6!)H@PMVPSG9SrSG?m(tn#+b`TEXUpvZ&yn|S zwG9RCTidN%i2*ev>g02VWE`V}F(Rr(7}i5fa4{3dm~+|k<@V#fmAn^rZCpe6btoEu zvJE}?jB=@?$JuejxW~(x^IJjII&0OHhT%b}@&~-jthQl?`|`wLXKcyyC>kw6N+Ec( z<1f?oY%?$Qh7x+_efSO~RBP*=Qqj63>Rm6hx z1KuGQSBg8W^}~mQfCH<}3FO_q%R;PLfd}BG2dJVoF>yrI8MJ3u))=?X&yI{t{B>~E z9(M`nze@)1eEeO;PQ}ssHHXJTu&9=ujknzQo`B`c)P%UC((n`-^Oh^)7F=R=)r}!%QX!cDmgM4 zta&v0IVgDdX{%99LvrFv#^mSk+`cVnQZ}aT=TF}>P=pJOti*b7=TQ;=osT_2<8mh{zDDYA|-!v?7Q!#m@|w`gyuVYuvRyc_INnC z{8(V15m(V0Y3*bFZVn&6?fW0q&Lwdmcg1$ozWFgiZ!fwF!%~hHw+S4k0c9Y+7n8~~!uZPKr z36CktdU7hEkY(Tf_g^pf@Azh!lFHq`_`&Z9SUa0EOCC`cLw6k3^jYk_o_f0`GLYvc z`v-D}1+>WsW${bjr@n^q!;4Pifgz=#_3lUUlQ3me&z=CGC#}`M|FvTdl)2J6pW4Gjzi>J z$WJ0p=Ay>Az3G=sF65qe>x&D0{Le^|rcZ_94(fcRSEs7$>PYrlr2FV<(NOCTwBc`w zTCvD=T8=qbw8;f{Y!p8f)&}T<93xl&Ou_TOqqt7j8D_-m&Gzu7{GQ5vWw)y%{7^Q;`o_`eR%UEau z{T7ZkukZ{EI55;PW_K~5zb~1B#n_B1av793atLxCQ`hCyG)ckAV0awnG9aouN6yi35ZFjhGq| zF1j@*Sojl$V1Y#b0W@!Dt2@1Xs-Q}3Uie3Ro5Z=j8rfFAq?Yzm-Cb&O2B>p{@O3~-Ne~CuC z_WcsQPK_+B!k0K6BbL%eQGzHFl6z3B%lMt z_Xv+k19X=Z2&G2$4ax7@N8nYEG?sn9GWE8M@%6eJLti_qHpy`$#VV&+BScZdKKX>SO@e@zJ*>bpDd1?X5<_a4Bcd5!i0k5 z%!;T`=vPu^G7KybfMs0;3$q2lqUFDle8Y)p+-@Xxu$gC+Tk3Ly+?=gxI{ zkL-k^wK7(<8aXlMs{8r*ui=9QYiRzJYBLu1FzYOu6UYuo1Sm;CBqnpNwSYa8-QDTl zrabDh5m)^yap?%+gxKU8G)>$42L_gK$hk@&#J;MOH1yage63$rfD=16+miFPzNUtt zlSuyyLIevh&)AP2nzWfopoT2i;E@`ECc5(mv;1#^coE63+``yAi%#`fN*ZM!*J8Qv%Z>>RgxG z0S2=wWv$muL(P}J?P7Ql3u~U&uXjUlESvIeQJWC&Dif1-ugYn%pShp)(R(2xuMA5xT2TD)sw;bN4qZcQqGT}tIFTyW0qf0}BMFizNSgdqX^5RD}f>qC12 z`o0#>XOP8+_C(J0A(1WW=yYWSq|VG>AG-?6E+A4+_<-`m=l**M3OdSWDLZcvo-UX0 zI7gjIu0&{AxJIPYehG=+eF>3oaH=8l%CE5f49b(?t1v{l+I3HL3jPTtz^>jQJ{WF* z7@BCEK3xW-N-4$}fC{6svpGYK-uifk=!pT#B5ZSERBYieKuet5sB*IF%binmaxf6$ zbsO9Rw;UY5-NY{CanCN^6S<#z?W91DGDW8-V)%9yMOo{A0WqIfw2=(%WU(5KJB<~= z*HeRj^_H|9CkvN}?}b5nk5EVm)pe`jwrwuopWVB+@`XVUP44Q^v5mpoTTKW3p?d?+`VVGVn=0PXR8pOGuZ5Fo1+4-k zAl`)`Y@!JP-!rOa{Pn?z(wtq`y^*{&rhwf}5Fr8oLR}p?- zQ+mU9$h0UBf^6Tuy~NxubWFFnIs>8}lnm|Z<-^=euBKT{D>IlVzop`gwH_Mt{23nj znS%9zFV3pNzU^ub9ZH$?{`reQ;!O@uSQ|r#ZdUVi^>dA< zfrdjq$-!l2i^HDW@rBn{$tr4=*nDcIr(qydFDZc~`JL*z_9*f!rURzzO{iXyh{H*d zXEC8NMcgS{+9L5Bx#S|JD@oD3356Ox^lbrQ5*PmSUVeV*jiHas3i8ZG=2wzKw0$Pe zS?-Oko@I8D!e6`j&QHRiQd7D{i(Ey=`{ZO<)zjT&4ot7elge0XJQL~<;b37oc;v_` z*Svg_kbitvkcy>uKpsW^U6t5BuKlWB!E*%1z%w*`Iq|BvQ?ds;7f!&L)Av+jv6S5g zdlir{02?nb*QQW$Dok0dv_O}-Y{iPIni@ylrWRn<;2!nsCXc8*xO?{l3b;ET&k*yg ztX9`G$SP{N#Ml3$DCVSw7Wd4ft_`Dj zJZqzxprqbKV%D0o*L!(+p}KX!-sl1n36@me{ia^MX7u=c;G>{`)q>QToZQLDIXi~@ z+7*%iSlxG9h6!ttjfK6)Z-V*t(8R*ozPx0iT_RCiX3s}VJg?$n&+58xjk&1#OR@UbqAIia$>xSd z+QlWA8^(iA5RzwSw;LzIWvs5E@NuHG<@zjz#=yUjLsE+wQL+ z_$Ii!u*xv6PeC}MB*QN%wS?HKp@az)J#7jaFp3lkp<5GAX{!wIQqxi8(C6l+{{(w6 z9YkD-4>Mm+PTQPlj`N5a=DWjJVbht;?Wx!>Tav9wU0iqzPdQe9R`I%O;kl*16B65oYwY!`2`!p)) zDZnwr{2C)^*c-ad@nEy!;MF;FZA$F1e_NvdVl2cRxtx)ajjdn%%rz8w4zLv@9(e|P z{*&#J;*10N6|W8#fn(trkv7dKfOeb#^QkpG3LWT+8w;TV5(B;buXol#tps$5icITFwJ5k*wY2`3KYhM zjf&@k6-;~R%b%qRIXiRR;MMnUv?zKM?k^+DKJ?tNaba9EXtaFO5E{<3bXDVt3E= zE7w#C{0LAxy!R4Qzc=M#!YE}!=7R)H!{hQJ%vdZ+htax=GX?Kx5fpD01D*FFW$>c4MZD*ny@)CC%<>)^5vD6lSqphj&do-={7($&J!I9#EOTjE(rqdbQ!3@9EPEURT@qosrp@;6kBL)?Lt7Gdq5q avIGCW3V+ByRoV~8f7FyUlu{0#x&9x$|91@l literal 0 HcmV?d00001 diff --git a/vendor/valence/benches/anvil.rs b/vendor/valence/benches/anvil.rs new file mode 100644 index 00000000..77679473 --- /dev/null +++ b/vendor/valence/benches/anvil.rs @@ -0,0 +1,137 @@ +/* +use std::fs::create_dir_all; +use std::hint::black_box; +use std::path::{Path, PathBuf}; + +use anyhow::{ensure, Context}; +use criterion::Criterion; +use fs_extra::dir::CopyOptions; +use reqwest::IntoUrl; +use valence::anvil::AnvilWorld; +use valence::instance::Chunk; +use zip::ZipArchive; + +pub fn load(c: &mut Criterion) { + let world_dir = get_world_asset( + "https://github.com/valence-rs/valence-test-data/archive/refs/heads/asset/sp_world_1.19.2.zip", + "1.19.2 benchmark world", + true + ).expect("failed to get world asset"); + + let mut world = AnvilWorld::new(world_dir); + + c.bench_function("anvil_load_10x10", |b| { + b.iter(|| { + let world = black_box(&mut world); + + for z in -5..5 { + for x in -5..5 { + let nbt = world + .read_chunk(x, z) + .expect("failed to read chunk") + .expect("missing chunk at position") + .data; + + let mut chunk = Chunk::new(24); + + valence_anvil::to_valence(&nbt, &mut chunk, 4, |_| Default::default()).unwrap(); + + black_box(chunk); + } + } + }); + }); +} + +/// Loads the asset. If the asset is already present on the system due to a +/// prior run, the cached asset is used instead. If the asset is not +/// cached yet, this function downloads the asset using the current thread. +/// This will block until the download is complete. +/// +/// returns: `PathBuf` The reference to the asset on the file system +fn get_world_asset( + url: impl IntoUrl, + dest_path: impl AsRef, + remove_top_level_dir: bool, +) -> anyhow::Result { + let url = url.into_url()?; + let dest_path = dest_path.as_ref(); + + let asset_cache_dir = Path::new(".asset_cache"); + + create_dir_all(asset_cache_dir).context("unable to create `.asset_cache` directory")?; + + let final_path = asset_cache_dir.join(dest_path); + + if final_path.exists() { + return Ok(final_path); + } + + let mut response = reqwest::blocking::get(url.clone())?; + + let cache_download_directory = asset_cache_dir.join("downloads"); + + create_dir_all(&cache_download_directory) + .context("unable to create `.asset_cache/downloads` directory")?; + + let mut downloaded_zip_file = + tempfile::tempfile_in(&cache_download_directory).context("Could not create temp file")?; + + println!("Downloading {dest_path:?} from {url}"); + + response + .copy_to(&mut downloaded_zip_file) + .context("could not write web contents to the temporary file")?; + + let mut zip_archive = ZipArchive::new(downloaded_zip_file) + .context("unable to create zip archive from downloaded content")?; + + if !remove_top_level_dir { + zip_archive + .extract(&final_path) + .context("unable to unzip downloaded contents")?; + + return Ok(final_path); + } + + let temp_dir = tempfile::tempdir_in(&cache_download_directory) + .context("unable to create temporary directory in `.asset_cache`")?; + + zip_archive + .extract(&temp_dir) + .context("unable to unzip downloaded contents")?; + + let mut entries = temp_dir.path().read_dir()?; + + let top_level_dir = entries + .next() + .context("the downloaded zip file was empty")??; + + ensure!( + entries.next().is_none(), + "found more than one entry in the top level directory of the Zip file" + ); + + ensure!( + top_level_dir.path().is_dir(), + "the only content in the zip archive is a file" + ); + + create_dir_all(&final_path).context("could not create a directory inside the asset cache")?; + + let dir_entries = top_level_dir + .path() + .read_dir()? + .collect::, _>>()?; + + let items_to_move: Vec<_> = dir_entries.into_iter().map(|d| d.path()).collect(); + + fs_extra::move_items(&items_to_move, &final_path, &CopyOptions::new())?; + + // We keep the temporary directory around until we're done moving files out + // of it. + drop(temp_dir); + + Ok(final_path) +} +*/ diff --git a/vendor/valence/benches/block.rs b/vendor/valence/benches/block.rs new file mode 100644 index 00000000..f32c12bb --- /dev/null +++ b/vendor/valence/benches/block.rs @@ -0,0 +1,91 @@ +use std::hint::black_box; + +use criterion::Criterion; +use valence::block::{BlockKind, BlockState, PropName, PropValue}; +use valence::ItemKind; + +pub fn block(c: &mut Criterion) { + let mut group = c.benchmark_group("block"); + + let states = BlockKind::ALL.map(BlockKind::to_state); + + group.bench_function("BlockState::from_kind", |b| { + b.iter(|| { + for kind in black_box(BlockKind::ALL) { + black_box(BlockState::from_kind(kind)); + } + }); + }); + + group.bench_function("BlockState::to_kind", |b| { + b.iter(|| { + for state in black_box(states) { + black_box(state.to_kind()); + } + }); + }); + + group.bench_function("BlockState::get", |b| { + b.iter(|| { + for state in black_box(states) { + black_box(state.get(PropName::Note)); + } + }); + }); + + group.bench_function("BlockState::set", |b| { + b.iter(|| { + for state in black_box(states) { + black_box(state.set(PropName::Note, PropValue::Didgeridoo)); + } + }); + }); + + group.bench_function("BlockState::is_liquid", |b| { + b.iter(|| { + for state in black_box(states) { + black_box(state.is_liquid()); + } + }); + }); + + group.bench_function("BlockState::is_opaque", |b| { + b.iter(|| { + for state in black_box(states) { + black_box(state.is_opaque()); + } + }) + }); + + group.bench_function("BlockState::is_replaceable", |b| { + b.iter(|| { + for state in black_box(states) { + black_box(state.is_replaceable()); + } + }) + }); + + group.bench_function("BlockState::luminance", |b| { + b.iter(|| { + for state in black_box(states) { + black_box(state.luminance()); + } + }) + }); + + group.bench_function("BlockKind::to_item_kind", |b| { + b.iter(|| { + for kind in black_box(BlockKind::ALL) { + black_box(kind.to_item_kind()); + } + }); + }); + + group.bench_function("BlockKind::from_item_kind", |b| { + b.iter(|| { + for kind in black_box(ItemKind::ALL) { + black_box(BlockKind::from_item_kind(kind)); + } + }); + }); +} diff --git a/vendor/valence/benches/decode_array.rs b/vendor/valence/benches/decode_array.rs new file mode 100644 index 00000000..0a442c3d --- /dev/null +++ b/vendor/valence/benches/decode_array.rs @@ -0,0 +1,29 @@ +use std::hint::black_box; + +use criterion::Criterion; +use valence::protocol::{Decode, Encode}; + +pub fn decode_array(c: &mut Criterion) { + let mut group = c.benchmark_group("decode_array"); + + let floats = [123.0, 456.0, 789.0]; + let mut buf = [0u8; 24]; + + floats.encode(buf.as_mut_slice()).unwrap(); + + group.bench_function("<[f64; 3]>::decode", |b| { + b.iter(|| { + let mut r = black_box(buf.as_slice()); + let _ = black_box(<[f64; 3]>::decode(&mut r)); + }); + }); + + let bytes = [42; 4096]; + + group.bench_function("<[u8; 4096]>::decode", |b| { + b.iter(|| { + let mut r = black_box(bytes.as_slice()); + let _ = black_box(<[u8; 4096]>::decode(&mut r)); + }) + }); +} diff --git a/vendor/valence/benches/idle.rs b/vendor/valence/benches/idle.rs new file mode 100644 index 00000000..d773cc2c --- /dev/null +++ b/vendor/valence/benches/idle.rs @@ -0,0 +1,43 @@ +use criterion::Criterion; +use valence::prelude::*; + +/// Benches the performance of a single server tick while nothing much is +/// happening. +pub fn idle_update(c: &mut Criterion) { + let mut app = App::new(); + + app.add_plugins(DefaultPlugins); + app.add_systems(Startup, setup); + + // Run startup schedule. + app.update(); + + c.bench_function("idle_update", |b| { + b.iter(|| { + app.update(); + }); + }); +} + +fn setup( + mut commands: Commands, + dimensions: Res, + biomes: Res, + server: Res, +) { + let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server); + + for z in -5..5 { + for x in -5..5 { + layer.chunk.insert_chunk([x, z], UnloadedChunk::new()); + } + } + + for z in -50..50 { + for x in -50..50 { + layer.chunk.set_block([x, 64, z], BlockState::GRASS_BLOCK); + } + } + + commands.spawn(layer); +} diff --git a/vendor/valence/benches/main.rs b/vendor/valence/benches/main.rs new file mode 100644 index 00000000..d5068d54 --- /dev/null +++ b/vendor/valence/benches/main.rs @@ -0,0 +1,23 @@ +use criterion::{criterion_group, criterion_main}; + +mod anvil; +mod block; +mod decode_array; +mod idle; +mod many_players; +mod packet; +mod var_int; +mod var_long; + +criterion_group! { + benches, + block::block, + decode_array::decode_array, + idle::idle_update, + packet::packet, + var_int::var_int, + var_long::var_long, + many_players::many_players, +} + +criterion_main!(benches); diff --git a/vendor/valence/benches/many_players.rs b/vendor/valence/benches/many_players.rs new file mode 100644 index 00000000..89d36921 --- /dev/null +++ b/vendor/valence/benches/many_players.rs @@ -0,0 +1,124 @@ +use std::time::Duration; + +use bevy_app::prelude::*; +use criterion::Criterion; +use rand::Rng; +use valence::entity::Position; +use valence::keepalive::KeepaliveSettings; +use valence::layer::chunk::UnloadedChunk; +use valence::layer::LayerBundle; +use valence::math::DVec3; +use valence::network::NetworkPlugin; +use valence::protocol::packets::play::{FullC2s, HandSwingC2s}; +use valence::registry::{BiomeRegistry, DimensionTypeRegistry}; +use valence::testing::create_mock_client; +use valence::{ident, ChunkPos, DefaultPlugins, Hand, Server, ServerSettings}; +use valence_server::CompressionThreshold; + +pub fn many_players(c: &mut Criterion) { + run_many_players(c, "many_players", 3000, 16, 16); + run_many_players(c, "many_players_spread_out", 3000, 8, 200); +} + +fn run_many_players( + c: &mut Criterion, + func_name: &str, + client_count: usize, + view_dist: u8, + world_size: i32, +) { + let mut app = App::new(); + + app.insert_resource(ServerSettings { + compression_threshold: CompressionThreshold(256), + ..Default::default() + }); + + app.insert_resource(KeepaliveSettings { + period: Duration::MAX, + }); + + app.add_plugins(DefaultPlugins.build().disable::()); + + app.update(); // Initialize plugins. + + let mut layer = LayerBundle::new( + ident!("overworld"), + app.world.resource::(), + app.world.resource::(), + app.world.resource::(), + ); + + for z in -world_size..world_size { + for x in -world_size..world_size { + layer + .chunk + .insert_chunk(ChunkPos::new(x, z), UnloadedChunk::new()); + } + } + + let layer = app.world.spawn(layer).id(); + + let mut clients = vec![]; + + // Spawn a bunch of clients in at random initial positions in the instance. + for i in 0..client_count { + let (mut bundle, helper) = create_mock_client(format!("client_{i}")); + + bundle.visible_chunk_layer.0 = layer; + bundle.visible_entity_layers.0.insert(layer); + bundle.player.layer.0 = layer; + bundle.view_distance.set(view_dist); + + let mut rng = rand::thread_rng(); + let x = rng.gen_range(-world_size as f64 * 16.0..=world_size as f64 * 16.0); + let z = rng.gen_range(-world_size as f64 * 16.0..=world_size as f64 * 16.0); + + bundle.player.position.set(DVec3::new(x, 64.0, z)); + + let id = app.world.spawn(bundle).id(); + + clients.push((id, helper)); + } + + let mut query = app.world.query::<&mut Position>(); + + app.update(); + + for (_, helper) in &mut clients { + helper.confirm_initial_pending_teleports(); + } + + app.update(); + + c.bench_function(func_name, |b| { + b.iter(|| { + let mut rng = rand::thread_rng(); + + // Move the clients around randomly. They'll cross chunk borders and cause + // interesting things to happen. + for (id, helper) in &mut clients { + let pos = query.get(&app.world, *id).unwrap().get(); + + let offset = DVec3::new(rng.gen_range(-1.0..=1.0), 0.0, rng.gen_range(-1.0..=1.0)); + + helper.send(&FullC2s { + position: pos + offset, + yaw: rng.gen_range(0.0..=360.0), + pitch: rng.gen_range(0.0..=360.0), + on_ground: rng.gen(), + }); + + helper.send(&HandSwingC2s { hand: Hand::Main }); + } + + drop(rng); + + app.update(); // The important part. + + for (_, helper) in &mut clients { + helper.clear_received(); + } + }); + }); +} diff --git a/vendor/valence/benches/packet.rs b/vendor/valence/benches/packet.rs new file mode 100644 index 00000000..33601c2f --- /dev/null +++ b/vendor/valence/benches/packet.rs @@ -0,0 +1,246 @@ +use std::borrow::Cow; +use std::hint::black_box; + +use criterion::Criterion; +use valence::nbt::{compound, List}; +use valence::prelude::*; +use valence::protocol::decode::PacketDecoder; +use valence::protocol::encode::{PacketEncoder, PacketWriter, WritePacket}; +use valence::protocol::packets::play::{ChunkDataS2c, EntitySpawnS2c, PlayerListHeaderS2c}; +use valence::protocol::{ByteAngle, FixedArray, VarInt}; +use valence::text::IntoText; +use valence_server::protocol::Velocity; +use valence_server::CompressionThreshold; + +pub fn packet(c: &mut Criterion) { + let mut group = c.benchmark_group("packet"); + + let mut encoder = PacketEncoder::new(); + + const BLOCKS_AND_BIOMES: [u8; 2000] = [0x80; 2000]; + const SKY_LIGHT_ARRAYS: [FixedArray; 26] = [FixedArray([0xff; 2048]); 26]; + + let chunk_data_packet = ChunkDataS2c { + pos: ChunkPos::new(123, 456), + heightmaps: Cow::Owned(compound! { + "MOTION_BLOCKING" => List::Long(vec![123; 256]), + }), + blocks_and_biomes: BLOCKS_AND_BIOMES.as_slice(), + block_entities: Cow::Borrowed(&[]), + sky_light_mask: Cow::Borrowed(&[]), + block_light_mask: Cow::Borrowed(&[]), + empty_sky_light_mask: Cow::Borrowed(&[]), + empty_block_light_mask: Cow::Borrowed(&[]), + sky_light_arrays: Cow::Borrowed(SKY_LIGHT_ARRAYS.as_slice()), + block_light_arrays: Cow::Borrowed(&[]), + }; + + let player_list_header_packet = PlayerListHeaderS2c { + header: ("this".italic() + " is the " + "header".bold().color(Color::RED)).into(), + footer: ("this".italic() + + " is the " + + "footer".bold().color(Color::BLUE) + + ". I am appending some extra text so that the packet goes over the compression \ + threshold.") + .into(), + }; + + let spawn_entity_packet = EntitySpawnS2c { + entity_id: VarInt(1234), + object_uuid: Default::default(), + kind: VarInt(5), + position: DVec3::new(123.0, 456.0, 789.0), + pitch: ByteAngle(200), + yaw: ByteAngle(100), + head_yaw: ByteAngle(50), + data: VarInt(i32::MIN), + velocity: Velocity([12, 34, 56]), + }; + + group.bench_function("encode_chunk_data", |b| { + b.iter(|| { + let encoder = black_box(&mut encoder); + + encoder.clear(); + encoder.append_packet(&chunk_data_packet).unwrap(); + + black_box(encoder); + }); + }); + + group.bench_function("encode_player_list_header", |b| { + b.iter(|| { + let encoder = black_box(&mut encoder); + + encoder.clear(); + encoder.append_packet(&player_list_header_packet).unwrap(); + + black_box(encoder); + }); + }); + + group.bench_function("encode_spawn_entity", |b| { + b.iter(|| { + let encoder = black_box(&mut encoder); + + encoder.clear(); + encoder.append_packet(&spawn_entity_packet).unwrap(); + + black_box(encoder); + }); + }); + + encoder.set_compression(CompressionThreshold(-1)); + + group.bench_function("encode_chunk_data_compressed", |b| { + b.iter(|| { + let encoder = black_box(&mut encoder); + + encoder.clear(); + encoder.append_packet(&chunk_data_packet).unwrap(); + + black_box(encoder); + }); + }); + + group.bench_function("encode_player_list_header_compressed", |b| { + b.iter(|| { + let encoder = black_box(&mut encoder); + + encoder.clear(); + encoder.append_packet(&player_list_header_packet).unwrap(); + + black_box(encoder); + }); + }); + + group.bench_function("encode_spawn_entity_compressed", |b| { + b.iter(|| { + let encoder = black_box(&mut encoder); + + encoder.clear(); + encoder.append_packet(&spawn_entity_packet).unwrap(); + + black_box(encoder); + }); + }); + + let mut decoder = PacketDecoder::new(); + let mut packet_buf = vec![]; + + PacketWriter::new(&mut packet_buf, CompressionThreshold(-1)).write_packet(&chunk_data_packet); + + group.bench_function("decode_chunk_data", |b| { + b.iter(|| { + let decoder = black_box(&mut decoder); + + decoder.queue_slice(&packet_buf); + decoder + .try_next_packet() + .unwrap() + .unwrap() + .decode::() + .unwrap(); + + black_box(decoder); + }); + }); + + packet_buf.clear(); + PacketWriter::new(&mut packet_buf, CompressionThreshold(-1)) + .write_packet(&player_list_header_packet); + + group.bench_function("decode_player_list_header", |b| { + b.iter(|| { + let decoder = black_box(&mut decoder); + + decoder.queue_slice(&packet_buf); + decoder + .try_next_packet() + .unwrap() + .unwrap() + .decode::() + .unwrap(); + + black_box(decoder); + }); + }); + + packet_buf.clear(); + PacketWriter::new(&mut packet_buf, CompressionThreshold(-1)).write_packet(&spawn_entity_packet); + + group.bench_function("decode_entity_spawn", |b| { + b.iter(|| { + let decoder = black_box(&mut decoder); + + decoder.queue_slice(&packet_buf); + decoder + .try_next_packet() + .unwrap() + .unwrap() + .decode::() + .unwrap(); + + black_box(decoder); + }); + }); + + decoder.set_compression(256.into()); + + packet_buf.clear(); + PacketWriter::new(&mut packet_buf, 256.into()).write_packet(&chunk_data_packet); + + group.bench_function("decode_chunk_data_compressed", |b| { + b.iter(|| { + let decoder = black_box(&mut decoder); + + decoder.queue_slice(&packet_buf); + decoder + .try_next_packet() + .unwrap() + .unwrap() + .decode::() + .unwrap(); + + black_box(decoder); + }); + }); + + packet_buf.clear(); + PacketWriter::new(&mut packet_buf, 256.into()).write_packet(&player_list_header_packet); + + group.bench_function("decode_player_list_header_compressed", |b| { + b.iter(|| { + let decoder = black_box(&mut decoder); + + decoder.queue_slice(&packet_buf); + decoder + .try_next_packet() + .unwrap() + .unwrap() + .decode::() + .unwrap(); + + black_box(decoder); + }); + }); + + packet_buf.clear(); + PacketWriter::new(&mut packet_buf, 256.into()).write_packet(&spawn_entity_packet); + + group.bench_function("decode_spawn_entity_compressed", |b| { + b.iter(|| { + let decoder = black_box(&mut decoder); + + decoder.queue_slice(&packet_buf); + decoder + .try_next_packet() + .unwrap() + .unwrap() + .decode::() + .unwrap(); + + black_box(decoder); + }); + }); +} diff --git a/vendor/valence/benches/var_int.rs b/vendor/valence/benches/var_int.rs new file mode 100644 index 00000000..e8fb1d0d --- /dev/null +++ b/vendor/valence/benches/var_int.rs @@ -0,0 +1,37 @@ +use std::hint::black_box; + +use criterion::Criterion; +use rand::Rng; +use valence::protocol::{Decode, Encode, VarInt}; + +pub fn var_int(c: &mut Criterion) { + let mut group = c.benchmark_group("varint"); + + let mut rng = rand::thread_rng(); + + group.bench_function("VarInt::encode", |b| { + b.iter_with_setup( + || rng.gen(), + |i| { + let i: i32 = black_box(i); + + let mut buf = [0; VarInt::MAX_SIZE]; + let _ = black_box(VarInt(i).encode(buf.as_mut_slice())); + }, + ); + }); + + group.bench_function("VarInt::decode", |b| { + b.iter_with_setup( + || { + let mut buf = [0; VarInt::MAX_SIZE]; + VarInt(rng.gen()).encode(buf.as_mut_slice()).unwrap(); + buf + }, + |buf| { + let mut r = black_box(buf.as_slice()); + let _ = black_box(VarInt::decode(&mut r)); + }, + ) + }); +} diff --git a/vendor/valence/benches/var_long.rs b/vendor/valence/benches/var_long.rs new file mode 100644 index 00000000..92577a4f --- /dev/null +++ b/vendor/valence/benches/var_long.rs @@ -0,0 +1,37 @@ +use std::hint::black_box; + +use criterion::Criterion; +use rand::Rng; +use valence::protocol::{Decode, Encode, VarLong}; + +pub fn var_long(c: &mut Criterion) { + let mut group = c.benchmark_group("varlong"); + + let mut rng = rand::thread_rng(); + + group.bench_function("VarLong::encode", |b| { + b.iter_with_setup( + || rng.gen(), + |i| { + let i: i64 = black_box(i); + + let mut buf = [0; VarLong::MAX_SIZE]; + let _ = black_box(VarLong(i).encode(buf.as_mut_slice())); + }, + ); + }); + + group.bench_function("VarLong::decode", |b| { + b.iter_with_setup( + || { + let mut buf = [0; VarLong::MAX_SIZE]; + VarLong(rng.gen()).encode(buf.as_mut_slice()).unwrap(); + buf + }, + |buf| { + let mut r = black_box(buf.as_slice()); + let _ = black_box(VarLong::decode(&mut r)); + }, + ) + }); +} diff --git a/vendor/valence/crates/README.md b/vendor/valence/crates/README.md new file mode 100644 index 00000000..1b25ebe5 --- /dev/null +++ b/vendor/valence/crates/README.md @@ -0,0 +1,11 @@ +# Crates + +The standard crates used in Valence projects. + +All crates here are exported by the main `valence` crate. `valence` is the intended interface for both end users and third-party plugin authors. + +Crates are versioned in lockstep with the exception of `valence_nbt`. + +The output of `cargo depgraph --workspace-only | tred | dot -Tsvg -o assets/depgraph.svg` looks like this: + +![dependency graph](../assets/depgraph.svg) diff --git a/vendor/valence/crates/java_string/Cargo.toml b/vendor/valence/crates/java_string/Cargo.toml new file mode 100644 index 00000000..0465f63c --- /dev/null +++ b/vendor/valence/crates/java_string/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "java_string" +description = "An implementation of Java strings, tolerant of invalid UTF-16 encoding" +readme = "README.md" +version = "0.1.2" +keywords = ["java", "string", "utf16"] +edition.workspace = true +repository.workspace = true +documentation.workspace = true +license.workspace = true + +[features] +serde = ["dep:serde"] + +[dependencies] +serde = { workspace = true, optional = true } diff --git a/vendor/valence/crates/java_string/README.md b/vendor/valence/crates/java_string/README.md new file mode 100644 index 00000000..7135d645 --- /dev/null +++ b/vendor/valence/crates/java_string/README.md @@ -0,0 +1,17 @@ +# java_string + +An implementation of Java strings, tolerant of invalid UTF-16 encoding. +This allows for round-trip serialization of all Java strings, including those which contain invalid UTF-16, while still +being able to perform useful operations on those strings. + +These Java strings use the UTF-8 encoding, with the modification that surrogate code points (code points between U+D800 +and U+DFFF inclusive) are allowed. This allows for zero-cost conversion from Rust strings to Java strings. This modified +encoding is known as "semi-UTF-8" throughout the codebase. Similarly, this crate introduces a `JavaCodePoint` type which +is analogous to `char`, except that surrogate code points are allowed. + +This crate is mostly undocumented, because most methods are entirely analogous to those of the same name in Rust's +strings. Please refer to the `std` documentation. + +# Features + +- `serde` Adds support for [`serde`](https://docs.rs/serde/latest/serde/) \ No newline at end of file diff --git a/vendor/valence/crates/java_string/src/cesu8.rs b/vendor/valence/crates/java_string/src/cesu8.rs new file mode 100644 index 00000000..eb94ee6c --- /dev/null +++ b/vendor/valence/crates/java_string/src/cesu8.rs @@ -0,0 +1,279 @@ +use std::borrow::Cow; + +use crate::validations::{utf8_char_width, CONT_MASK, TAG_CONT}; +use crate::{JavaStr, JavaString, Utf8Error}; + +impl JavaStr { + /// Converts from Java's [modified UTF-8](https://docs.oracle.com/javase/8/docs/api/java/io/DataInput.html#modified-utf-8) format to a `Cow`. + /// + /// ``` + /// # use std::borrow::Cow; + /// # use java_string::{JavaCodePoint, JavaStr, JavaString}; + /// + /// let result = JavaStr::from_modified_utf8("Hello World!".as_bytes()).unwrap(); + /// assert!(matches!(result, Cow::Borrowed(_))); + /// assert_eq!(JavaStr::from_str("Hello World!"), result); + /// + /// let result = JavaStr::from_modified_utf8(&[ + /// 0x61, 0x62, 0x63, 0xc0, 0x80, 0xe2, 0x84, 0x9d, 0xed, 0xa0, 0xbd, 0xed, 0xb2, 0xa3, 0xed, + /// 0xa0, 0x80, + /// ]) + /// .unwrap(); + /// assert!(matches!(result, Cow::Owned(_))); + /// let mut expected = JavaString::from("abc\0ā„šŸ’£"); + /// expected.push_java(JavaCodePoint::from_u32(0xd800).unwrap()); + /// assert_eq!(expected, result); + /// + /// let result = JavaStr::from_modified_utf8(&[0xed]); + /// assert!(result.is_err()); + /// ``` + #[inline] + pub fn from_modified_utf8(bytes: &[u8]) -> Result, Utf8Error> { + match JavaStr::from_full_utf8(bytes) { + Ok(str) => Ok(Cow::Borrowed(str)), + Err(_) => JavaString::from_modified_utf8_internal(bytes).map(Cow::Owned), + } + } + + /// Converts to Java's [modified UTF-8](https://docs.oracle.com/javase/8/docs/api/java/io/DataInput.html#modified-utf-8) format. + /// + /// ``` + /// # use std::borrow::Cow; + /// # use java_string::{JavaCodePoint, JavaStr, JavaString}; + /// + /// let result = JavaStr::from_str("Hello World!").to_modified_utf8(); + /// assert!(matches!(result, Cow::Borrowed(_))); + /// assert_eq!(result, &b"Hello World!"[..]); + /// + /// let mut str = JavaString::from("abc\0ā„šŸ’£"); + /// str.push_java(JavaCodePoint::from_u32(0xd800).unwrap()); + /// let result = str.to_modified_utf8(); + /// let expected = [ + /// 0x61, 0x62, 0x63, 0xc0, 0x80, 0xe2, 0x84, 0x9d, 0xed, 0xa0, 0xbd, 0xed, 0xb2, 0xa3, 0xed, + /// 0xa0, 0x80, + /// ]; + /// assert!(matches!(result, Cow::Owned(_))); + /// assert_eq!(result, &expected[..]); + /// ``` + #[inline] + #[must_use] + pub fn to_modified_utf8(&self) -> Cow<[u8]> { + if is_valid_cesu8(self) { + Cow::Borrowed(self.as_bytes()) + } else { + Cow::Owned(self.to_modified_utf8_internal()) + } + } + + #[inline] + fn to_modified_utf8_internal(&self) -> Vec { + let bytes = self.as_bytes(); + let mut encoded = Vec::with_capacity((bytes.len() + bytes.len()) >> 2); + let mut i = 0; + while i < bytes.len() { + let b = bytes[i]; + if b == 0 { + encoded.extend([0xc0, 0x80]); + i += 1; + } else if b < 128 { + // Pass ASCII through quickly. + encoded.push(b); + i += 1; + } else { + // Figure out how many bytes we need for this character. + let w = utf8_char_width(b); + let char_bytes = unsafe { + // SAFETY: input must be valid semi UTF-8, so there must be at least w more + // bytes from i + bytes.get_unchecked(i..i + w) + }; + if w != 4 { + // Pass through short UTF-8 sequences unmodified. + encoded.extend(char_bytes.iter().copied()) + } else { + // Encode 4-byte sequences as 6 bytes + let s = unsafe { + // SAFETY: input is valid semi UTF-8 + JavaStr::from_semi_utf8_unchecked(char_bytes) + }; + let c = unsafe { + // SAFETY: s contains a single char of width 4 + s.chars().next().unwrap_unchecked().as_u32() - 0x10000 + }; + let s = [((c >> 10) as u16) | 0xd800, ((c & 0x3ff) as u16) | 0xdc00]; + encoded.extend(enc_surrogate(s[0])); + encoded.extend(enc_surrogate(s[1])); + } + i += w; + } + } + encoded + } +} + +impl JavaString { + /// Converts from Java's [modified UTF-8](https://docs.oracle.com/javase/8/docs/api/java/io/DataInput.html#modified-utf-8) format to a `JavaString`. + /// + /// See [JavaStr::from_modified_utf8]. + #[inline] + pub fn from_modified_utf8(bytes: Vec) -> Result { + match JavaString::from_full_utf8(bytes) { + Ok(str) => Ok(str), + Err(err) => JavaString::from_modified_utf8_internal(&err.bytes), + } + } + + fn from_modified_utf8_internal(slice: &[u8]) -> Result { + let mut offset = 0; + let mut decoded = Vec::with_capacity(slice.len() + 1); + + while let Some(&first) = slice.get(offset) { + let old_offset = offset; + offset += 1; + + macro_rules! err { + ($error_len:expr) => { + return Err(Utf8Error { + valid_up_to: old_offset, + error_len: $error_len, + }) + }; + } + + macro_rules! next { + () => {{ + if let Some(&b) = slice.get(offset) { + offset += 1; + b + } else { + err!(None) + } + }}; + } + + macro_rules! next_cont { + ($error_len:expr) => {{ + let byte = next!(); + if (byte) & !CONT_MASK == TAG_CONT { + byte + } else { + err!($error_len) + } + }}; + } + + if first == 0 { + // modified UTF-8 should never contain \0 directly. + err!(Some(1)); + } else if first < 128 { + // Pass ASCII through directly. + decoded.push(first); + } else if first == 0xc0 { + // modified UTF-8 encoding of null character + match next!() { + 0x80 => decoded.push(0), + _ => err!(Some(1)), + } + } else { + let w = utf8_char_width(first); + let second = next_cont!(Some(1)); + match w { + // Two-byte sequences can be used directly. + 2 => { + decoded.extend([first, second]); + } + 3 => { + let third = next_cont!(Some(2)); + match (first, second) { + // These are valid UTF-8, so pass them through. + (0xe0, 0xa0..=0xbf) + | (0xe1..=0xec, 0x80..=0xbf) + | (0xed, 0x80..=0x9f) + | (0xee..=0xef, 0x80..=0xbf) + // Second half of a surrogate pair without a preceding first half, also pass this through. + | (0xed, 0xb0..=0xbf) + => decoded.extend([first, second, third]), + // First half of a surrogate pair + (0xed, 0xa0..=0xaf) => { + // Peek ahead and try to pair the first half of surrogate pair with + // second. + match &slice[offset..] { + [0xed, fifth @ 0xb0..=0xbf, sixth, ..] + if *sixth & !CONT_MASK == TAG_CONT => + { + let s = dec_surrogates(second, third, *fifth, *sixth); + decoded.extend(s); + offset += 3; + } + _ => { + // No second half, append the first half directly. + decoded.extend([first, second, third]); + } + } + } + _ => err!(Some(1)), + } + } + _ => err!(Some(1)), // modified UTF-8 doesn't allow width 4 + } + } + } + + unsafe { + // SAFETY: we built a semi UTF-8 encoded string + Ok(JavaString::from_semi_utf8_unchecked(decoded)) + } + } + + /// Converts to Java's [modified UTF-8](https://docs.oracle.com/javase/8/docs/api/java/io/DataInput.html#modified-utf-8) format. + /// + /// See [JavaStr::to_modified_utf8]. + #[inline] + #[must_use] + pub fn into_modified_utf8(self) -> Vec { + if is_valid_cesu8(&self) { + self.into_bytes() + } else { + self.to_modified_utf8_internal() + } + } +} + +#[inline] +fn dec_surrogate(second: u8, third: u8) -> u32 { + 0xd000 | ((second & CONT_MASK) as u32) << 6 | (third & CONT_MASK) as u32 +} + +#[inline] +fn dec_surrogates(second: u8, third: u8, fifth: u8, sixth: u8) -> [u8; 4] { + // Convert to a 32-bit code point. + let s1 = dec_surrogate(second, third); + let s2 = dec_surrogate(fifth, sixth); + let c = 0x10000 + (((s1 - 0xd800) << 10) | (s2 - 0xdc00)); + assert!((0x010000..=0x10ffff).contains(&c)); + + // Convert to UTF-8. + // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + [ + 0b1111_0000u8 | ((c & 0b1_1100_0000_0000_0000_0000) >> 18) as u8, + TAG_CONT | ((c & 0b0_0011_1111_0000_0000_0000) >> 12) as u8, + TAG_CONT | ((c & 0b0_0000_0000_1111_1100_0000) >> 6) as u8, + TAG_CONT | (c & 0b0_0000_0000_0000_0011_1111) as u8, + ] +} + +#[inline] +fn is_valid_cesu8(text: &JavaStr) -> bool { + text.bytes() + .all(|b| b != 0 && ((b & !CONT_MASK) == TAG_CONT || utf8_char_width(b) <= 3)) +} + +#[inline] +fn enc_surrogate(surrogate: u16) -> [u8; 3] { + // 1110xxxx 10xxxxxx 10xxxxxx + [ + 0b11100000 | ((surrogate & 0b11110000_00000000) >> 12) as u8, + TAG_CONT | ((surrogate & 0b00001111_11000000) >> 6) as u8, + TAG_CONT | (surrogate & 0b00000000_00111111) as u8, + ] +} diff --git a/vendor/valence/crates/java_string/src/char.rs b/vendor/valence/crates/java_string/src/char.rs new file mode 100644 index 00000000..5bb3163c --- /dev/null +++ b/vendor/valence/crates/java_string/src/char.rs @@ -0,0 +1,1012 @@ +use std::char::ParseCharError; +use std::cmp::Ordering; +use std::fmt; +use std::fmt::{Debug, Display, Formatter, Write}; +use std::hash::{Hash, Hasher}; +use std::iter::{FusedIterator, Once, once}; +use std::ops::Range; +use std::str::FromStr; + +use crate::validations::{TAG_CONT, TAG_FOUR_B, TAG_THREE_B, TAG_TWO_B}; + +// JavaCodePoint is guaranteed to have the same repr as a u32, with valid values +// of between 0 and 0x10FFFF, the same as a unicode code point. Surrogate code +// points are valid values of this type. +#[derive(Copy, Clone, PartialEq, Eq)] +#[repr(C)] +pub struct JavaCodePoint { + #[cfg(target_endian = "little")] + lower: u16, + upper: SeventeenValues, + #[cfg(target_endian = "big")] + lower: u16, +} + +#[repr(u16)] +#[derive(Copy, Clone, PartialEq, Eq)] +#[allow(unused)] +enum SeventeenValues { + V0, + V1, + V2, + V3, + V4, + V5, + V6, + V7, + V8, + V9, + V10, + V11, + V12, + V13, + V14, + V15, + V16, +} + +impl JavaCodePoint { + pub const MAX: JavaCodePoint = JavaCodePoint::from_char(char::MAX); + pub const REPLACEMENT_CHARACTER: JavaCodePoint = + JavaCodePoint::from_char(char::REPLACEMENT_CHARACTER); + + /// See [`char::from_u32`] + /// + /// ``` + /// # use java_string::JavaCodePoint; + /// let c = JavaCodePoint::from_u32(0x2764); + /// assert_eq!(Some(JavaCodePoint::from_char('ā¤')), c); + /// + /// assert_eq!(None, JavaCodePoint::from_u32(0x110000)); + /// ``` + #[inline] + #[must_use] + pub const fn from_u32(i: u32) -> Option { + if i <= 0x10ffff { + unsafe { Some(Self::from_u32_unchecked(i)) } + } else { + None + } + } + + /// # Safety + /// The argument must be within the valid Unicode code point range of 0 to + /// 0x10FFFF inclusive. Surrogate code points are allowed. + #[inline] + #[must_use] + pub const unsafe fn from_u32_unchecked(i: u32) -> JavaCodePoint { + // SAFETY: the caller checks that the argument can be represented by this type + unsafe { std::mem::transmute(i) } + } + + /// Converts a `char` to a code point. + #[inline] + #[must_use] + pub const fn from_char(char: char) -> JavaCodePoint { + unsafe { + // SAFETY: all chars are valid code points + JavaCodePoint::from_u32_unchecked(char as u32) + } + } + + /// Converts this code point to a `u32`. + /// + /// ``` + /// # use java_string::JavaCodePoint; + /// assert_eq!(65, JavaCodePoint::from_char('A').as_u32()); + /// assert_eq!(0xd800, JavaCodePoint::from_u32(0xd800).unwrap().as_u32()); + /// ``` + #[inline] + #[must_use] + pub const fn as_u32(self) -> u32 { + unsafe { + // SAFETY: JavaCodePoint has the same repr as a u32 + let result = std::mem::transmute(self); + + if result > 0x10ffff { + // SAFETY: JavaCodePoint can never have a value > 0x10FFFF. + // This statement may allow the optimizer to remove branches in the calling code + // associated with out of bounds chars. + std::hint::unreachable_unchecked(); + } + + result + } + } + + /// Converts this code point to a `char`. + /// + /// ``` + /// # use java_string::JavaCodePoint; + /// assert_eq!(Some('a'), JavaCodePoint::from_char('a').as_char()); + /// assert_eq!(None, JavaCodePoint::from_u32(0xd800).unwrap().as_char()); + /// ``` + #[inline] + #[must_use] + pub const fn as_char(self) -> Option { + char::from_u32(self.as_u32()) + } + + /// # Safety + /// The caller must ensure that this code point is not a surrogate code + /// point. + #[inline] + #[must_use] + pub unsafe fn as_char_unchecked(self) -> char { + unsafe { char::from_u32_unchecked(self.as_u32()) } + } + + /// See [`char::encode_utf16`] + /// + /// ``` + /// # use java_string::JavaCodePoint; + /// assert_eq!( + /// 2, + /// JavaCodePoint::from_char('š•Š') + /// .encode_utf16(&mut [0; 2]) + /// .len() + /// ); + /// assert_eq!( + /// 1, + /// JavaCodePoint::from_u32(0xd800) + /// .unwrap() + /// .encode_utf16(&mut [0; 2]) + /// .len() + /// ); + /// ``` + /// ```should_panic + /// # use java_string::JavaCodePoint; + /// // Should panic + /// JavaCodePoint::from_char('š•Š').encode_utf16(&mut [0; 1]); + /// ``` + #[inline] + pub fn encode_utf16(self, dst: &mut [u16]) -> &mut [u16] { + if let Some(char) = self.as_char() { + char.encode_utf16(dst) + } else { + dst[0] = self.as_u32() as u16; + &mut dst[..1] + } + } + + /// Encodes this `JavaCodePoint` into semi UTF-8, that is, UTF-8 with + /// surrogate code points. See also [char::encode_utf8]. + /// + /// ``` + /// # use java_string::JavaCodePoint; + /// assert_eq!( + /// 2, + /// JavaCodePoint::from_char('ß') + /// .encode_semi_utf8(&mut [0; 4]) + /// .len() + /// ); + /// assert_eq!( + /// 3, + /// JavaCodePoint::from_u32(0xd800) + /// .unwrap() + /// .encode_semi_utf8(&mut [0; 4]) + /// .len() + /// ); + /// ``` + /// ```should_panic + /// # use java_string::JavaCodePoint; + /// // Should panic + /// JavaCodePoint::from_char('ß').encode_semi_utf8(&mut [0; 1]); + /// ``` + #[inline] + pub fn encode_semi_utf8(self, dst: &mut [u8]) -> &mut [u8] { + let len = self.len_utf8(); + let code = self.as_u32(); + match (len, &mut dst[..]) { + (1, [a, ..]) => { + *a = code as u8; + } + (2, [a, b, ..]) => { + *a = (code >> 6 & 0x1f) as u8 | TAG_TWO_B; + *b = (code & 0x3f) as u8 | TAG_CONT; + } + (3, [a, b, c, ..]) => { + *a = (code >> 12 & 0x0f) as u8 | TAG_THREE_B; + *b = (code >> 6 & 0x3f) as u8 | TAG_CONT; + *c = (code & 0x3f) as u8 | TAG_CONT; + } + (4, [a, b, c, d, ..]) => { + *a = (code >> 18 & 0x07) as u8 | TAG_FOUR_B; + *b = (code >> 12 & 0x3f) as u8 | TAG_CONT; + *c = (code >> 6 & 0x3f) as u8 | TAG_CONT; + *d = (code & 0x3f) as u8 | TAG_CONT; + } + _ => panic!( + "encode_utf8: need {} bytes to encode U+{:X}, but the buffer has {}", + len, + code, + dst.len() + ), + } + &mut dst[..len] + } + + /// See [`char::eq_ignore_ascii_case`]. + #[inline] + pub fn eq_ignore_ascii_case(&self, other: &JavaCodePoint) -> bool { + match (self.as_char(), other.as_char()) { + (Some(char1), Some(char2)) => char1.eq_ignore_ascii_case(&char2), + (None, None) => self == other, + _ => false, + } + } + + /// See [`char::escape_debug`]. + /// + /// ``` + /// # use java_string::JavaCodePoint; + /// assert_eq!( + /// "a", + /// JavaCodePoint::from_char('a').escape_debug().to_string() + /// ); + /// assert_eq!( + /// "\\n", + /// JavaCodePoint::from_char('\n').escape_debug().to_string() + /// ); + /// assert_eq!( + /// "\\u{d800}", + /// JavaCodePoint::from_u32(0xd800) + /// .unwrap() + /// .escape_debug() + /// .to_string() + /// ); + /// ``` + #[inline] + #[must_use] + pub fn escape_debug(self) -> CharEscapeIter { + self.escape_debug_ext(EscapeDebugExtArgs::ESCAPE_ALL) + } + + #[inline] + #[must_use] + pub(crate) fn escape_debug_ext(self, args: EscapeDebugExtArgs) -> CharEscapeIter { + const NULL: u32 = '\0' as u32; + const TAB: u32 = '\t' as u32; + const CARRIAGE_RETURN: u32 = '\r' as u32; + const LINE_FEED: u32 = '\n' as u32; + const SINGLE_QUOTE: u32 = '\'' as u32; + const DOUBLE_QUOTE: u32 = '"' as u32; + const BACKSLASH: u32 = '\\' as u32; + + unsafe { + // SAFETY: all characters specified are in ascii range + match self.as_u32() { + NULL => CharEscapeIter::new([b'\\', b'0']), + TAB => CharEscapeIter::new([b'\\', b't']), + CARRIAGE_RETURN => CharEscapeIter::new([b'\\', b'r']), + LINE_FEED => CharEscapeIter::new([b'\\', b'n']), + SINGLE_QUOTE if args.escape_single_quote => CharEscapeIter::new([b'\\', b'\'']), + DOUBLE_QUOTE if args.escape_double_quote => CharEscapeIter::new([b'\\', b'"']), + BACKSLASH => CharEscapeIter::new([b'\\', b'\\']), + _ if self.is_printable() => { + // SAFETY: surrogate code points are not printable + CharEscapeIter::printable(self.as_char_unchecked()) + } + _ => self.escape_unicode(), + } + } + } + + #[inline] + fn is_printable(self) -> bool { + let Some(char) = self.as_char() else { + return false; + }; + if matches!(char, '\\' | '\'' | '"') { + return true; + } + char.escape_debug().next() != Some('\\') + } + + /// See [`char::escape_default`]. + /// + /// ``` + /// # use java_string::JavaCodePoint; + /// assert_eq!( + /// "a", + /// JavaCodePoint::from_char('a').escape_default().to_string() + /// ); + /// assert_eq!( + /// "\\n", + /// JavaCodePoint::from_char('\n').escape_default().to_string() + /// ); + /// assert_eq!( + /// "\\u{d800}", + /// JavaCodePoint::from_u32(0xd800) + /// .unwrap() + /// .escape_default() + /// .to_string() + /// ); + /// ``` + #[inline] + #[must_use] + pub fn escape_default(self) -> CharEscapeIter { + const TAB: u32 = '\t' as u32; + const CARRIAGE_RETURN: u32 = '\r' as u32; + const LINE_FEED: u32 = '\n' as u32; + const SINGLE_QUOTE: u32 = '\'' as u32; + const DOUBLE_QUOTE: u32 = '"' as u32; + const BACKSLASH: u32 = '\\' as u32; + + unsafe { + // SAFETY: all characters specified are in ascii range + match self.as_u32() { + TAB => CharEscapeIter::new([b'\\', b't']), + CARRIAGE_RETURN => CharEscapeIter::new([b'\\', b'r']), + LINE_FEED => CharEscapeIter::new([b'\\', b'n']), + SINGLE_QUOTE => CharEscapeIter::new([b'\\', b'\'']), + DOUBLE_QUOTE => CharEscapeIter::new([b'\\', b'"']), + BACKSLASH => CharEscapeIter::new([b'\\', b'\\']), + 0x20..=0x7e => CharEscapeIter::new([self.as_u32() as u8]), + _ => self.escape_unicode(), + } + } + } + + /// See [`char::escape_unicode`]. + /// + /// ``` + /// # use java_string::JavaCodePoint; + /// assert_eq!( + /// "\\u{2764}", + /// JavaCodePoint::from_char('ā¤').escape_unicode().to_string() + /// ); + /// assert_eq!( + /// "\\u{d800}", + /// JavaCodePoint::from_u32(0xd800) + /// .unwrap() + /// .escape_unicode() + /// .to_string() + /// ); + /// ``` + #[inline] + #[must_use] + pub fn escape_unicode(self) -> CharEscapeIter { + let x = self.as_u32(); + + let mut arr = [0; 10]; + arr[0] = b'\\'; + arr[1] = b'u'; + arr[2] = b'{'; + + let number_len = if x == 0 { + 1 + } else { + ((x.ilog2() >> 2) + 1) as usize + }; + arr[3 + number_len] = b'}'; + for hexit in 0..number_len { + arr[2 + number_len - hexit] = b"0123456789abcdef"[((x >> (hexit << 2)) & 15) as usize]; + } + + CharEscapeIter { + inner: EscapeIterInner::Escaped(EscapeIterEscaped { + bytes: arr, + range: 0..number_len + 4, + }), + } + } + + /// See [`char::is_alphabetic`]. + #[inline] + #[must_use] + pub fn is_alphabetic(self) -> bool { + self.as_char().is_some_and(|char| char.is_alphabetic()) + } + + /// See [`char::is_alphanumeric`]. + #[inline] + #[must_use] + pub fn is_alphanumeric(self) -> bool { + self.as_char().is_some_and(|char| char.is_alphanumeric()) + } + + /// See [`char::is_ascii`]. + #[inline] + #[must_use] + pub fn is_ascii(self) -> bool { + self.as_u32() <= 0x7f + } + + /// See [`char::is_ascii_alphabetic`]. + #[inline] + #[must_use] + pub const fn is_ascii_alphabetic(self) -> bool { + self.is_ascii_lowercase() || self.is_ascii_uppercase() + } + + /// See [`char::is_ascii_alphanumeric`]. + #[inline] + #[must_use] + pub const fn is_ascii_alphanumeric(self) -> bool { + self.is_ascii_alphabetic() || self.is_ascii_digit() + } + + /// See [`char::is_ascii_control`]. + #[inline] + #[must_use] + pub const fn is_ascii_control(self) -> bool { + matches!(self.as_u32(), 0..=0x1f | 0x7f) + } + + /// See [`char::is_ascii_digit`]. + #[inline] + #[must_use] + pub const fn is_ascii_digit(self) -> bool { + const ZERO: u32 = '0' as u32; + const NINE: u32 = '9' as u32; + matches!(self.as_u32(), ZERO..=NINE) + } + + /// See [`char::is_ascii_graphic`]. + #[inline] + #[must_use] + pub const fn is_ascii_graphic(self) -> bool { + matches!(self.as_u32(), 0x21..=0x7e) + } + + /// See [`char::is_ascii_hexdigit`]. + #[inline] + #[must_use] + pub const fn is_ascii_hexdigit(self) -> bool { + const LOWER_A: u32 = 'a' as u32; + const LOWER_F: u32 = 'f' as u32; + const UPPER_A: u32 = 'A' as u32; + const UPPER_F: u32 = 'F' as u32; + self.is_ascii_digit() || matches!(self.as_u32(), (LOWER_A..=LOWER_F) | (UPPER_A..=UPPER_F)) + } + + /// See [`char::is_ascii_lowercase`]. + #[inline] + #[must_use] + pub const fn is_ascii_lowercase(self) -> bool { + const A: u32 = 'a' as u32; + const Z: u32 = 'z' as u32; + matches!(self.as_u32(), A..=Z) + } + + /// See [`char::is_ascii_octdigit`]. + #[inline] + #[must_use] + pub const fn is_ascii_octdigit(self) -> bool { + const ZERO: u32 = '0' as u32; + const SEVEN: u32 = '7' as u32; + matches!(self.as_u32(), ZERO..=SEVEN) + } + + /// See [`char::is_ascii_punctuation`]. + #[inline] + #[must_use] + pub const fn is_ascii_punctuation(self) -> bool { + matches!( + self.as_u32(), + (0x21..=0x2f) | (0x3a..=0x40) | (0x5b..=0x60) | (0x7b..=0x7e) + ) + } + + /// See [`char::is_ascii_uppercase`]. + #[inline] + #[must_use] + pub const fn is_ascii_uppercase(self) -> bool { + const A: u32 = 'A' as u32; + const Z: u32 = 'Z' as u32; + matches!(self.as_u32(), A..=Z) + } + + /// See [`char::is_ascii_whitespace`]. + #[inline] + #[must_use] + pub const fn is_ascii_whitespace(self) -> bool { + const SPACE: u32 = ' ' as u32; + const HORIZONTAL_TAB: u32 = '\t' as u32; + const LINE_FEED: u32 = '\n' as u32; + const FORM_FEED: u32 = 0xc; + const CARRIAGE_RETURN: u32 = '\r' as u32; + matches!( + self.as_u32(), + SPACE | HORIZONTAL_TAB | LINE_FEED | FORM_FEED | CARRIAGE_RETURN + ) + } + + /// See [`char::is_control`]. + #[inline] + #[must_use] + pub fn is_control(self) -> bool { + self.as_char().is_some_and(|char| char.is_control()) + } + + /// See [`char::is_digit`]. + #[inline] + #[must_use] + pub fn is_digit(self, radix: u32) -> bool { + self.to_digit(radix).is_some() + } + + /// See [`char::is_lowercase`]. + #[inline] + #[must_use] + pub fn is_lowercase(self) -> bool { + self.as_char().is_some_and(|char| char.is_lowercase()) + } + + /// See [`char::is_numeric`]. + #[inline] + #[must_use] + pub fn is_numeric(self) -> bool { + self.as_char().is_some_and(|char| char.is_numeric()) + } + + /// See [`char::is_uppercase`]. + #[inline] + #[must_use] + pub fn is_uppercase(self) -> bool { + self.as_char().is_some_and(|char| char.is_uppercase()) + } + + /// See [`char::is_whitespace`]. + #[inline] + #[must_use] + pub fn is_whitespace(self) -> bool { + self.as_char().is_some_and(|char| char.is_whitespace()) + } + + /// See [`char::len_utf16`]. Surrogate code points return 1. + /// + /// ``` + /// # use java_string::JavaCodePoint; + /// + /// let n = JavaCodePoint::from_char('ß').len_utf16(); + /// assert_eq!(n, 1); + /// + /// let len = JavaCodePoint::from_char('šŸ’£').len_utf16(); + /// assert_eq!(len, 2); + /// + /// assert_eq!(1, JavaCodePoint::from_u32(0xd800).unwrap().len_utf16()); + /// ``` + #[inline] + #[must_use] + pub const fn len_utf16(self) -> usize { + if let Some(char) = self.as_char() { + char.len_utf16() + } else { + 1 // invalid code points are encoded as 1 utf16 code point anyway + } + } + + /// See [`char::len_utf8`]. Surrogate code points return 3. + /// + /// ``` + /// # use java_string::JavaCodePoint; + /// + /// let len = JavaCodePoint::from_char('A').len_utf8(); + /// assert_eq!(len, 1); + /// + /// let len = JavaCodePoint::from_char('ß').len_utf8(); + /// assert_eq!(len, 2); + /// + /// let len = JavaCodePoint::from_char('ā„').len_utf8(); + /// assert_eq!(len, 3); + /// + /// let len = JavaCodePoint::from_char('šŸ’£').len_utf8(); + /// assert_eq!(len, 4); + /// + /// let len = JavaCodePoint::from_u32(0xd800).unwrap().len_utf8(); + /// assert_eq!(len, 3); + /// ``` + #[inline] + #[must_use] + pub const fn len_utf8(self) -> usize { + if let Some(char) = self.as_char() { + char.len_utf8() + } else { + 3 // invalid code points are all length 3 in semi-valid utf8 + } + } + + /// See [`char::make_ascii_lowercase`]. + #[inline] + pub fn make_ascii_lowercase(&mut self) { + *self = self.to_ascii_lowercase(); + } + + /// See [`char::make_ascii_uppercase`]. + #[inline] + pub fn make_ascii_uppercase(&mut self) { + *self = self.to_ascii_uppercase(); + } + + /// See [`char::to_ascii_lowercase`]. + /// + /// ``` + /// # use java_string::JavaCodePoint; + /// + /// let ascii = JavaCodePoint::from_char('A'); + /// let non_ascii = JavaCodePoint::from_char('ā¤'); + /// + /// assert_eq!('a', ascii.to_ascii_lowercase()); + /// assert_eq!('ā¤', non_ascii.to_ascii_lowercase()); + /// ``` + #[inline] + #[must_use] + pub const fn to_ascii_lowercase(self) -> JavaCodePoint { + if self.is_ascii_uppercase() { + unsafe { + // SAFETY: all lowercase chars are valid chars + Self::from_u32_unchecked(self.as_u32() + 32) + } + } else { + self + } + } + + /// See [`char::to_ascii_uppercase`]. + /// + /// ``` + /// # use java_string::JavaCodePoint; + /// + /// let ascii = JavaCodePoint::from_char('a'); + /// let non_ascii = JavaCodePoint::from_char('ā¤'); + /// + /// assert_eq!('A', ascii.to_ascii_uppercase()); + /// assert_eq!('ā¤', non_ascii.to_ascii_uppercase()); + /// ``` + #[inline] + #[must_use] + pub const fn to_ascii_uppercase(self) -> JavaCodePoint { + if self.is_ascii_lowercase() { + unsafe { + // SAFETY: all uppercase chars are valid chars + Self::from_u32_unchecked(self.as_u32() - 32) + } + } else { + self + } + } + + /// See [`char::to_digit`]. + #[inline] + #[must_use] + pub const fn to_digit(self, radix: u32) -> Option { + if let Some(char) = self.as_char() { + char.to_digit(radix) + } else { + None + } + } + + /// See [`char::to_lowercase`]. + #[inline] + #[must_use] + pub fn to_lowercase(self) -> ToLowercase { + match self.as_char() { + Some(char) => ToLowercase::char(char.to_lowercase()), + None => ToLowercase::invalid(self), + } + } + + /// See [`char::to_uppercase`]. + #[inline] + #[must_use] + pub fn to_uppercase(self) -> ToUppercase { + match self.as_char() { + Some(char) => ToUppercase::char(char.to_uppercase()), + None => ToUppercase::invalid(self), + } + } +} + +impl Debug for JavaCodePoint { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + f.write_char('\'')?; + for c in self.escape_debug_ext(EscapeDebugExtArgs { + escape_single_quote: true, + escape_double_quote: false, + }) { + f.write_char(c)?; + } + f.write_char('\'') + } +} + +impl Default for JavaCodePoint { + #[inline] + fn default() -> Self { + JavaCodePoint::from_char('\0') + } +} + +impl Display for JavaCodePoint { + #[inline] + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + Display::fmt(&self.as_char().unwrap_or(char::REPLACEMENT_CHARACTER), f) + } +} + +impl From for u32 { + #[inline] + fn from(value: JavaCodePoint) -> Self { + value.as_u32() + } +} + +impl From for JavaCodePoint { + #[inline] + fn from(value: u8) -> Self { + JavaCodePoint::from_char(char::from(value)) + } +} + +impl FromStr for JavaCodePoint { + type Err = ParseCharError; + + #[inline] + fn from_str(s: &str) -> Result { + char::from_str(s).map(JavaCodePoint::from_char) + } +} + +impl Hash for JavaCodePoint { + #[inline] + fn hash(&self, state: &mut H) { + self.as_u32().hash(state) + } +} + +impl Ord for JavaCodePoint { + #[inline] + fn cmp(&self, other: &Self) -> Ordering { + self.as_u32().cmp(&other.as_u32()) + } +} + +impl PartialOrd for JavaCodePoint { + #[inline] + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +impl PartialOrd for JavaCodePoint { + #[inline] + fn partial_cmp(&self, other: &char) -> Option { + self.partial_cmp(&JavaCodePoint::from_char(*other)) + } +} + +impl PartialOrd for char { + #[inline] + fn partial_cmp(&self, other: &JavaCodePoint) -> Option { + JavaCodePoint::from_char(*self).partial_cmp(other) + } +} + +impl PartialEq for JavaCodePoint { + #[inline] + fn eq(&self, other: &char) -> bool { + self == &JavaCodePoint::from_char(*other) + } +} + +impl PartialEq for char { + #[inline] + fn eq(&self, other: &JavaCodePoint) -> bool { + &JavaCodePoint::from_char(*self) == other + } +} + +pub(crate) struct EscapeDebugExtArgs { + pub(crate) escape_single_quote: bool, + pub(crate) escape_double_quote: bool, +} + +impl EscapeDebugExtArgs { + pub(crate) const ESCAPE_ALL: Self = Self { + escape_single_quote: true, + escape_double_quote: true, + }; +} + +#[derive(Clone, Debug)] +pub struct CharEscapeIter { + inner: EscapeIterInner, +} + +#[derive(Clone, Debug)] +enum EscapeIterInner { + Printable(Once), + Escaped(EscapeIterEscaped), +} + +impl Display for EscapeIterInner { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + match self { + EscapeIterInner::Printable(char) => char.clone().try_for_each(|ch| f.write_char(ch)), + EscapeIterInner::Escaped(escaped) => Display::fmt(escaped, f), + } + } +} + +impl CharEscapeIter { + #[inline] + fn printable(char: char) -> Self { + CharEscapeIter { + inner: EscapeIterInner::Printable(once(char)), + } + } + + /// # Safety + /// Assumes that the input byte array is ASCII + #[inline] + unsafe fn new(bytes: [u8; N]) -> Self { + assert!(N <= 10, "Too many bytes in escape iter"); + let mut ten_bytes = [0; 10]; + ten_bytes[..N].copy_from_slice(&bytes); + CharEscapeIter { + inner: EscapeIterInner::Escaped(EscapeIterEscaped { + bytes: ten_bytes, + range: 0..N, + }), + } + } +} + +impl Iterator for CharEscapeIter { + type Item = char; + + #[inline] + fn next(&mut self) -> Option { + match &mut self.inner { + EscapeIterInner::Printable(printable) => printable.next(), + EscapeIterInner::Escaped(escaped) => escaped.next(), + } + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + match &self.inner { + EscapeIterInner::Printable(printable) => printable.size_hint(), + EscapeIterInner::Escaped(escaped) => escaped.size_hint(), + } + } +} + +impl ExactSizeIterator for CharEscapeIter { + #[inline] + fn len(&self) -> usize { + match &self.inner { + EscapeIterInner::Printable(printable) => printable.len(), + EscapeIterInner::Escaped(escaped) => escaped.len(), + } + } +} + +impl FusedIterator for CharEscapeIter {} + +impl Display for CharEscapeIter { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + Display::fmt(&self.inner, f) + } +} + +#[derive(Clone, Debug)] +struct EscapeIterEscaped { + // SAFETY: all values must be in the ASCII range + bytes: [u8; 10], + // SAFETY: range must not be out of bounds for length 10 + range: Range, +} + +impl Iterator for EscapeIterEscaped { + type Item = char; + + #[inline] + fn next(&mut self) -> Option { + self.range.next().map(|index| unsafe { + // SAFETY: the range is never out of bounds for length 10 + char::from(*self.bytes.get_unchecked(index)) + }) + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + self.range.size_hint() + } + + #[inline] + fn count(self) -> usize { + self.range.len() + } +} + +impl ExactSizeIterator for EscapeIterEscaped { + #[inline] + fn len(&self) -> usize { + self.range.len() + } +} + +impl FusedIterator for EscapeIterEscaped {} + +impl Display for EscapeIterEscaped { + #[inline] + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + let str = unsafe { + // SAFETY: all bytes are in ASCII range, and range is in bounds for length 10 + std::str::from_utf8_unchecked(self.bytes.get_unchecked(self.range.clone())) + }; + f.write_str(str) + } +} + +pub type ToLowercase = CharIterDelegate; +pub type ToUppercase = CharIterDelegate; + +#[derive(Debug, Clone)] +pub struct CharIterDelegate(CharIterDelegateInner); + +impl CharIterDelegate { + #[inline] + fn char(iter: I) -> CharIterDelegate { + CharIterDelegate(CharIterDelegateInner::Char(iter)) + } + + #[inline] + fn invalid(code_point: JavaCodePoint) -> CharIterDelegate { + CharIterDelegate(CharIterDelegateInner::Invalid(Some(code_point).into_iter())) + } +} + +#[derive(Debug, Clone)] +enum CharIterDelegateInner { + Char(I), + Invalid(std::option::IntoIter), +} + +impl Iterator for CharIterDelegate +where + I: Iterator, +{ + type Item = JavaCodePoint; + + #[inline] + fn next(&mut self) -> Option { + match &mut self.0 { + CharIterDelegateInner::Char(char_iter) => { + char_iter.next().map(JavaCodePoint::from_char) + } + CharIterDelegateInner::Invalid(code_point) => code_point.next(), + } + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + match &self.0 { + CharIterDelegateInner::Char(char_iter) => char_iter.size_hint(), + CharIterDelegateInner::Invalid(code_point) => code_point.size_hint(), + } + } +} + +impl DoubleEndedIterator for CharIterDelegate +where + I: Iterator + DoubleEndedIterator, +{ + #[inline] + fn next_back(&mut self) -> Option { + match &mut self.0 { + CharIterDelegateInner::Char(char_iter) => { + char_iter.next_back().map(JavaCodePoint::from_char) + } + CharIterDelegateInner::Invalid(code_point) => code_point.next_back(), + } + } +} + +impl ExactSizeIterator for CharIterDelegate where I: Iterator + ExactSizeIterator {} + +impl FusedIterator for CharIterDelegate where I: Iterator + FusedIterator {} diff --git a/vendor/valence/crates/java_string/src/error.rs b/vendor/valence/crates/java_string/src/error.rs new file mode 100644 index 00000000..09742d01 --- /dev/null +++ b/vendor/valence/crates/java_string/src/error.rs @@ -0,0 +1,126 @@ +use std::error::Error; +use std::fmt; +use std::fmt::{Display, Formatter}; + +#[derive(Copy, Eq, PartialEq, Clone, Debug)] +pub struct Utf8Error { + pub(crate) valid_up_to: usize, + pub(crate) error_len: Option, +} + +impl Utf8Error { + #[must_use] + #[inline] + pub const fn valid_up_to(&self) -> usize { + self.valid_up_to + } + + #[must_use] + #[inline] + pub const fn error_len(&self) -> Option { + // Manual implementation of Option::map since it's not const + match self.error_len { + Some(len) => Some(len as usize), + None => None, + } + } + + #[must_use] + #[inline] + pub(crate) const fn from_std(value: std::str::Utf8Error) -> Self { + Self { + valid_up_to: value.valid_up_to(), + // Manual implementation of Option::map since it's not const + error_len: match value.error_len() { + Some(error_len) => Some(error_len as u8), + None => None, + }, + } + } +} + +impl Display for Utf8Error { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + if let Some(error_len) = self.error_len { + write!( + f, + "invalid utf-8 sequence of {} bytes from index {}", + error_len, self.valid_up_to + ) + } else { + write!( + f, + "incomplete utf-8 byte sequence from index {}", + self.valid_up_to + ) + } + } +} + +impl From for Utf8Error { + #[inline] + fn from(value: std::str::Utf8Error) -> Self { + Self::from_std(value) + } +} + +impl Error for Utf8Error {} + +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct FromUtf8Error { + pub(crate) bytes: Vec, + pub(crate) error: Utf8Error, +} + +impl FromUtf8Error { + pub fn as_bytes(&self) -> &[u8] { + &self.bytes[..] + } + + #[must_use] + pub fn into_bytes(self) -> Vec { + self.bytes + } + + pub fn utf8_error(&self) -> Utf8Error { + self.error + } +} + +impl Display for FromUtf8Error { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + Display::fmt(&self.error, f) + } +} + +impl Error for FromUtf8Error {} + +#[derive(Copy, Eq, PartialEq, Clone, Debug)] +pub enum ParseError { + InvalidUtf8(Utf8Error), + Err(E), +} + +impl Display for ParseError +where + E: Display, +{ + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + match self { + ParseError::InvalidUtf8(err) => Display::fmt(err, f), + ParseError::Err(err) => Display::fmt(err, f), + } + } +} + +impl Error for ParseError +where + E: Error + 'static, +{ + fn source(&self) -> Option<&(dyn Error + 'static)> { + match self { + ParseError::InvalidUtf8(err) => Some(err), + ParseError::Err(err) => Some(err), + } + } +} diff --git a/vendor/valence/crates/java_string/src/iter.rs b/vendor/valence/crates/java_string/src/iter.rs new file mode 100644 index 00000000..6dd67b85 --- /dev/null +++ b/vendor/valence/crates/java_string/src/iter.rs @@ -0,0 +1,977 @@ +use std::fmt::{Debug, Display, Formatter, Write}; +use std::iter::{Chain, Copied, Filter, FlatMap, Flatten, FusedIterator, Map}; +use std::{option, slice}; + +use crate::validations::{next_code_point, next_code_point_reverse}; +use crate::{CharEscapeIter, JavaCodePoint, JavaStr, JavaStrPattern}; +macro_rules! delegate { + (Iterator for $ty:ident $(<$($lt:lifetime),+>)? => $item:ty $(, DoubleEnded = $double_ended:ty)?) => { + impl$(<$($lt),+>)? Iterator for $ty$(<$($lt),+>)? { + type Item = $item; + + #[inline] + fn next(&mut self) -> Option { + self.inner.next() + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + self.inner.size_hint() + } + + #[inline] + fn count(self) -> usize { + self.inner.count() + } + + #[inline] + fn last(self) -> Option { + self.inner.last() + } + + #[inline] + fn nth(&mut self, n: usize) -> Option { + self.inner.nth(n) + } + + #[inline] + fn all(&mut self, f: F) -> bool + where + F: FnMut(Self::Item) -> bool, + { + self.inner.all(f) + } + + #[inline] + fn any(&mut self, f: F) -> bool + where + F: FnMut(Self::Item) -> bool, + { + self.inner.any(f) + } + + #[inline] + fn find